使用应用程序脚本将下拉菜单更改为“锁定”时保护行

时间:2018-09-11 09:44:43

标签: google-apps-script google-sheets

当有人将下拉菜单更改为“已锁定”时,我试图仅保护整个行(添加编辑器),即使该下拉菜单也应受保护。我想在工作表的几乎所有行中都实现这一点。

我发现有很多资源可以提供帮助,但是我不能将它们适当地组合在一起,非常感谢您的帮助!

下面是我找到的一些有用的链接。

Google sheets: protect cells conditionally?

Protecting Cells Based on Contents of Other Cells in Google Sheets

Protect ranges with google apps script

1 个答案:

答案 0 :(得分:1)

将此代码添加到电子表格的脚本编辑器,并为以下提到的功能设置onEdit触发器。

将代码中的email@gmail.com字符串替换为您的实际电子邮件地址

注意:此脚本假定工作表的第一行可能具有三个选项,具体取决于控制该范围的保护。

Lock:锁定该特定列

解锁:解锁该特定列

空白:不执行任何操作

function onEdit(e){
  var x = [e.range.columnStart,e.range.rowStart,e.range.columnEnd,e.range.rowEnd]
  if (x[0]==x[2] && x[1]==1 && x[3]==1){
    var lockRangeStart = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,x[0]).getA1Notation();
    var lastCol = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getLastRow();
    var lockRangeName = (lockRangeStart+":"+lockRangeStart.match(/(\D*)/)[1]+lastCol);
    var lockRange = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(lockRangeName);
    if(e.value == "Lock"){
      var protection = lockRange.protect().setDescription('Locked Range');
      protection.addEditor("email@gmail.com");
      protection.removeEditors(protection.getEditors());
      if (protection.canDomainEdit()) {
        protection.setDomainEdit(false);
      }
    }
    else  if(e.value == "Unlock") {
      var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
      for (var i = 0; i < protections.length; i++) {
        var protection = protections[i];
        if (protection.canEdit() && protection.getRange().getA1Notation() == lockRangeName ) {
          protection.remove();
        }
      }
    }
  }
}