首页 > 解决方案 > 有没有办法通过谷歌表上的复选框值动态添加/删除编辑对受保护单元格的访问?

问题描述

我是 Google Apps 脚本的新手,对操纵不同编辑器访问的问题感到困惑。我有 10 多张工作表和 20 位编辑,我需要根据他们的角色分配他们的访问权限。我正在考虑使用复选框来添加和删除他们的访问权限。到目前为止,这两个是我从其他人那里得到的代码。一个用于通过选中/取消选中框来显示和隐藏时间戳,而另一个用于添加和删除编辑器。

对于时间戳

function runEmailAccess(){

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sEditors = ss.getSheetByName('Sheet Name');
var sheet = SpreadsheetApp.openById("Sheet ID");

var nAddEditor = sEditors.getRange('A2').getValue();
if (nAddEditor != 0){
var vAddEditor = sEditors.getRange('A3:A'+nAddEditor).getValues();
sheet.addEditors(vAddEditor);
 }

var nRemoveEditor = sEditors.getRange('B2').getValue();
if (nRemoveEditor != 0){
var vRemoveEditor = sEditors.getRange('B3:B'+nRemoveEditor).getValues();

for (j=0;j<vRemoveEditor.length;j++) {
  sheet.removeEditor(vRemoveEditor[j][0])
}
}

} 

对于复选框

function onEdit(e){
  if (e.range.columnStart == 6 && e.range.columnEnd == 6 && e.range.rowStart <= 20) {
    var ckeckboxRange = "F1:F20";
    var date = new Date();
    var range = e.source.getRange(ckeckboxRange);
    var values = range.getValues().map(function(e) {return e[0] === true ? [date] : [""]});
    range.offset(0, 1).setValues(values);
  }
}

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

最后,我们得到了预期的结果,因为这将是我所描述的更清晰的画面。它就像一个命令门户,可以在整体层面控制不同的访问权限。

预期结果

非常感谢所有有用的评论。

标签: google-apps-scriptgoogle-sheetsaccess-rights

解决方案


您需要以下组件:

  • onEdit 触发器
  • 检查哪个复选框已被编辑并连接到相应的工作表
  • 从带有复选框的行中检索编辑器
  • 验证该框已被选中或未选中

以下是提供此功能的示例:

function onEdit(e){
  var ss = SpreadsheetApp.getActive();
  //change name of the sheet if necessary!
  var sheetWithCheckBoxes = ss.getSheetByName("Sheet1");
  var column =  e.range.getColumn();
  if (e.range.getSheet().getName() == sheetWithCheckBoxes.getName() && (column == 3 || column == 4 || column == 5)) {
    Logger.log("if");
    var spreadsheet2 = SpreadsheetApp.openById("XXX");
    var sheet;
    switch (column){
      case 3:
        sheet = ss.getSheetByName("name");
        break;
      case 4:
        sheet = ss.getSheetByName("name2");
        break;
      case 5:
        sheet = spreadsheet2.getSheetByName("name3");
        break;
    }       
   
    var protection = sheet.protect();
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
    var editor = sheetWithCheckBoxes.getRange(e.range.getRow(), 2).getValue();
     Logger.log(e.value);
    if(e.value == "TRUE"){
       Logger.log("true");
      protection.addEditor(editor);
    }
    if(e.value == "FALSE"){
            Logger.log("false");
      protection.removeEditor(editor);
    }
  }
}

注意:
在此示例中,前两个工作表与带有复选框的工作表一样位于同一个电子表格中,而第三个工作表位于不同的电子表格中。

请根据您的需要调整表格和电子表格。

更新

不仅要设置工作表保护,还要与新用户共享电子表格,您需要使用DriveApp.getFileById(id).addEditor(editor)方法。

但是,由于限制DriveApp.getFileById(id),无法使用简单的 onEdit 触发器触发的调用。

解决方案:

将可安装的 onEdit 触发器绑定到您的函数,而不是简单的触发器。确保事先重命名函数以避免由于同时触发简单且可安装的触发器而发生冲突。

设置电子表格和工作表权限的示例:

function Edit(e){
  var ss = SpreadsheetApp.getActive();
  //change name of the sheet if necessary!
  var sheetWithCheckBoxes = ss.getSheetByName("Sheet1");
  var column =  e.range.getColumn();
  if (e.range.getSheet().getName() == sheetWithCheckBoxes.getName() && (column == 3 || column == 4 || column == 5)) {
    var spreadsheet2 = SpreadsheetApp.openById("XXX");
    var sheet;
    var id;
    switch (column){
      case 3:
        sheet = ss.getSheetByName("name");
        id = ss.getId();
        break;
      case 4:
        sheet = ss.getSheetByName("name2");
        id = ss.getId();
        break;
      case 5:
        id = spreadsheet2.getId();
        sheet = spreadsheet2.getSheetByName("name3");
        break;
    }       
    var protection = sheet.protect();
    if (protection.canDomainEdit()) {
      protection.setDomainEdit(false);
    }
    var editor = sheetWithCheckBoxes.getRange(e.range.getRow(), 2).getValue();
    Logger.log(e.value);
    if(e.value == "TRUE"){
      DriveApp.getFileById(id).addEditor(editor);
      protection.addEditor(editor);
    }
    if(e.value == "FALSE"){
      protection.removeEditor(editor);
    }
  }
}


推荐阅读