我怎样才能在脚本基础上保护 sheet(Google Apps 脚本)?

How can I get this to protect a sheet on scripting basis (Google Apps Script)?

我得到了这段代码运行没有错误; 由此产生的传播 sheet 确实在 sheet 名称旁边显示了一个储物柜; 受保护的工作表和范围仅显示特定范围不受保护,但打开文件的其他用户可以编辑受保护的范围:

      var editors = newSpreadsheet.getEditors();
      for (var i = 0; i < editors.length; i++) {
        newSpreadsheet.removeEditor(editors[i]);
      };

      var sheetToProtect = newSpreadsheet.getSheetByName('CheckList');
      var rngMonitorUnprotect = sheetToProtect.getRange("F11:F14");
      var protection = sheetToProtect.protect();
      protection.setUnprotectedRanges([rngMonitorUnprotect]);

我在这里错过了什么?

解释/问题:

根据 official documentation,这是对 sheet 应用保护的正确方法。

  • 问题是您没有从 protection 对象中删除编辑者列表。相反,您所做的是将它们从 spreadsheet 文件本身中删除。

  • 本质上,当您为sheet添加保护时,所有当前编辑者自动拥有编辑sheet(或sheet范围)的权限不管保护。所以你的脚本需要从右边删除它们,这就是我们执行这个的原因:

    protection.removeEditors(protection.getEditors());
    

仅保护 sheet 的 F11:F14 范围:

function myFunction() {
  // Protect range F11:F14, then remove all other users from the list of editors.
  var sheetToProtect = SpreadsheetApp.getActive().getSheetByName('CheckList'); 
  var range = sheetToProtect.getRange('F11:F14'); 
  var protection = range.protect();

  // Ensure the current user is an editor before removing others. Otherwise, if the user's edit
  // permission comes from a group, the script throws an exception upon removing the group.
  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }
}

保护 sheet 除了 F11:F14 的整个范围:

function myFunction() {
  var sheetToProtect = SpreadsheetApp.getActive().getSheetByName('CheckList'); 
  var protection = sheetToProtect.protect();
  var rngMonitorUnprotect = sheetToProtect.getRange("F11:F14");  
  protection.setUnprotectedRanges([rngMonitorUnprotect]);    
  var me = Session.getEffectiveUser();
  protection.addEditor(me);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) {
    protection.setDomainEdit(false);
  }
}