我从[这个问题](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起作用,因为我可以在该单元格上看到“解锁”的注释,但是该单元格仍然被阻止:
答案 0 :(得分:1)
因此,总而言之-protect()
方法文档中有一个容易忽略的注释:“ 如果范围已受到保护,则此方法会创建一个与现有范围重叠的新受保护范围”,这意味着您的onEdit(e)
每次触发时,都会创建至少一个新的保护层,而不是被覆盖。
您应该改为通过Protection
方法访问为Spreadsheet
创建的getProtections()
实例,并从结果{中调用元素上的addEditor()
和removeEditor()
方法{1}}(为了能够区分Array
实例,请使用Protection
和getRange()
方法(至少保留getEditors()
或Logger.log()
个方法)跟踪)。
您可能想要在添加/删除过程之前检查用户是否可以编辑受保护的console.log()
–在这种情况下,请对获得的Range
使用canEdit()
方法。< / p>
有用的链接