我有一张工作表,其中的行需要根据单元格的值进行保护/取消保护。默认值为所有行均不受保护。第24列包含一个带有“等待列表”和“已应用”选项的下拉菜单。当单元格更改为“已应用”时,我希望它锁定整个行以进行编辑。然后,如果以后删除了“已应用”,则应删除保护。我在此站点上找到了一些帮助,但由于我在编码方面的经验非常有限,因此没有什么针对我的情况的具体说明。这是我到目前为止的内容:
function onEdit(e){
var sheet = SpreadsheetApp.getActive();
if (sheet.getName() != 'Main' || e.range.columnStart != 24) return;
var r = sheet.getRange(e.range.rowStart,1,1,17);
if (e.value == "Applied"){
var protection = r.protect();
protection.removeEditors(protection.getEditors());
} else if (e.oldValue == "Applied"){
var protections =
sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for(var i=0;i<protections.length;i++){
protection = protections[i];
if(protection.getRange().getRow() == e.range.rowStart)
protection.remove();
}
}
}
保护方面似乎运行良好。但是,当它不受保护时,删除“已应用”并不总是可行。有些行将不受保护,而另一些行将保持受保护状态。任何指导都将不胜感激。
答案 0 :(得分:0)
您的代码给出了错误,因为对于Spreadsheet对象,您只能将A1表示法使用getRange方法[1]。您应该改用getActiveSheet()方法[2]。如您所说,进行了此更改后,删除“已应用”单元格值后,代码将不起作用。这是因为当您仅删除单元格值而不是更改它时,e.value和e.oldValue属性变为未定义。为避免这种情况,可以使用getValue方法[3]获取更改后的单元格当前值,并在条件中使用它。这是我测试过的完整代码:
function onEdit(e){
//Get active Sheet instead of Spreadsheet
var sheet = SpreadsheetApp.getActiveSheet();
if (sheet.getName() != 'Main' || e.range.columnStart != 24.0) {
return;
}
var r = sheet.getRange(e.range.rowStart,1,1,17);
//Current value after the edit is made
var cellValue = sheet.getRange(e.range.rowStart, e.range.columnStart).getValue();
if (cellValue == "Applied"){
var protection = r.protect();
protection.removeEditors(protection.getEditors());
}
else if (cellValue == "Waitlisted" || cellValue == ""){
//"If" to optimize code, beacuse if oldValue is Waitlisted it'll be desprotect it already
if(e.range.oldValue != "Waitlisted") {
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for(var i=0;i<protections.length;i++){
protection = protections[i];
if(protection.getRange().getRow() == e.range.rowStart) {
protection.remove();
}
}
}
}
}
[1] https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getrangea1notation
[2] https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#getactivesheet
[3] https://developers.google.com/apps-script/reference/spreadsheet/range#getValue()