Google表格在特定条件下的addEditor和removeEditor

时间:2019-06-07 14:50:46

标签: google-apps-script google-sheets triggers

我从[这个问题](Automatic Lock/Protect Rows/cells in Google Sheets at a specific time in other Cells)中学到了如何在特定条件下锁定某些单元格,而Jess的答案非常正常。

我只是想知道是否可以在特定条件下添加更多代码来解锁单元。例如:如果用户执行thing1,则锁定单元格B1,如果用户执行thing2,则将单元格B1解锁以供将来编辑。

在这里,我根据杰西的答案修改了代码,阻止(removeEditor)正常工作,但是我添加来取消阻止单元格的“ else if”条件不起作用,并且在这种条件下也无法取消阻止单元格。

任何帮助将不胜感激!

function onEdit(e) { 

 var ss1=SpreadsheetApp.getActiveSpreadsheet();

 var sheet1=ss1.getSheetByName("Sheet Name");  

 var active = sheet1.getActiveCell();

 var nextnum = sheet1.getRange(active.getRow(),8).getValue();

 var shouldbeblocking= sheet1.getRange(active.getRow()-1,7)

 var them = Session.getActiveUser();

 var theiremails = them.getEmail();


// to unlock the cell, NOT WORKING

   if (nextnum == 22) {

 shouldbeblocking.protect().addEditor(theiremails);

 shouldbeblocking.setNote("unLocked") ;
  }

 // to lock the cell (codes working fine)

  else if (nextnum == 1) {

 shouldbeblocking.protect().removeEditor("xxx@xxx.com") ;
 shouldbeblocking.setNote("Locked") ;
  }



}

按照@ross的建议,我在我的代码中(在if语句内)添加了Logger.log,下面是执行脚本的屏幕截图,似乎代码运行在if语句中,并且奇怪的是,“解锁” “ setNote起作用,因为我可以在该单元格上看到“解锁”的注释,但是该单元格仍然被阻止:

enter image description here

1 个答案:

答案 0 :(得分:1)

因此,总而言之-protect()方法文档中有一个容易忽略的注释:“ 如果范围已受到保护,则此方法会创建一个与现有范围重叠的新受保护范围”,这意味着您的onEdit(e)每次触发时,都会创建至少一个新的保护层,而不是被覆盖。

您应该改为通过Protection方法访问为Spreadsheet创建的getProtections()实例,并从结果{中调用元素上的addEditor()removeEditor()方法{1}}(为了能够区分Array实例,请使用ProtectiongetRange()方法(至少保留getEditors()Logger.log()个方法)跟踪)。

您可能想要在添加/删除过程之前检查用户是否可以编辑受保护的console.log() –在这种情况下,请对获得的Range使用canEdit()方法。< / p>

有用的链接

  1. Protection reference;
  2. canEdit(e) reference;
  3. remove() reference(保护必须由type过滤);