基于另一个单元格值的保护/取消保护范围

时间:2019-09-11 15:43:57

标签: google-apps-script

我有一张工作表,其中的行需要根据单元格的值进行保护/取消保护。默认值为所有行均不受保护。第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();
    }
  }
}

保护方面似乎运行良好。但是,当它不受保护时,删除“已应用”并不总是可行。有些行将不受保护,而另一些行将保持受保护状态。任何指导都将不胜感激。

1 个答案:

答案 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()