Google apps script 是否有添加/删除编辑器的方法';通过Google工作表上的复选框值动态访问受保护的单元格?

Google apps script 是否有添加/删除编辑器的方法';通过Google工作表上的复选框值动态访问受保护的单元格?,google-apps-script,google-sheets,access-rights,Google Apps Script,Google Sheets,Access Rights,我不熟悉谷歌应用程序脚本,对操纵不同编辑器的访问问题感到困惑。我有超过10张工作表和20名编辑,我需要根据他们的角色分配他们的访问权限。我正在考虑使用复选框来添加和删除他们的访问权限。到目前为止,这两个代码是我从其他代码中获得的。一个用于通过选中/取消选中框来显示和隐藏时间戳,另一个用于添加和删除编辑器 用于时间戳 函数runEmailAccess(){ var ss=SpreadsheetApp.getActiveSpreadsheet(); var sEditors=ss.getSheetB

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

用于时间戳

函数runEmailAccess(){ var ss=SpreadsheetApp.getActiveSpreadsheet(); var sEditors=ss.getSheetByName('Sheet Name'); 风险值表=电子表格应用程序openById(“表ID”); var nAddEditor=sEditors.getRange('A2').getValue(); 如果(nAddEditor!=0){ var vAddEditor=sEditors.getRange('A3:A'+nAddEditor.getValues(); 表.加法器(vAddEditor); } var nRemoveEditor=sEditors.getRange('B2').getValue(); 如果(nRemoveEditor!=0){ var vRemoveEditor=sEditors.getRange('B3:B'+nRemoveEditor).getValues(); 对于(j=0;j1),您需要以下组件:
  • onEdit触发器
  • 选中已编辑的复选框并连接到相应的工作表
  • 从带有复选框的行中检索编辑器
  • 验证该框是否已选中或未选中
以下是提供此功能的示例:

函数onEdit(e){
var ss=SpreadsheetApp.getActive();
//如有必要,请更改工作表的名称!
var SheetWithCheckBox=ss.getSheetByName(“Sheet1”);
var column=e.range.getColumn();
if(e.range.getSheet().getName()==sheetwithcheckbox.getName()&&(column==3 | | column==4 | | column==5)){
Logger.log(“如果”);
var spreadsheet2=SpreadsheetApp.openById(“XXX”);
var表;
开关(列){
案例3:
sheet=ss.getSheetByName(“名称”);
打破
案例4:
sheet=ss.getSheetByName(“名称2”);
打破
案例5:
sheet=电子表格2.getSheetByName(“名称3”);
打破
}       
var保护=sheet.protect();
if(protection.canDomainEdit()){
protection.setDomainEdit(false);
}
var editor=sheetwithcheckbox.getRange(e.range.getRow(),2.getValue();
Logger.log(e.value);
如果(e.value==“TRUE”){
Logger.log(“真”);
保护。添加器(编辑器);
}
如果(e.value==“FALSE”){
Logger.log(“假”);
protection.removeditor(编辑器);
}
}
}
注意:
在本示例中,前两张工作表位于同一电子表格中,就像带有复选框的工作表一样,第三张数据表位于不同的电子表格中

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

更新 为了不仅设置图纸保护,而且与新用户共享电子表格,您需要使用该方法

但是,
DriveApp.getFileById(id)
是一个调用,由于以下原因,无法使用简单的OneEdit触发器触发

解决方案:

一个简单的触发器而不是简单的触发器。请确保事先重命名该函数,以避免由于同时触发简单的和可安装的触发器而发生冲突

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

功能编辑(e){
var ss=SpreadsheetApp.getActive();
//如有必要,请更改工作表的名称!
var SheetWithCheckBox=ss.getSheetByName(“Sheet1”);
var column=e.range.getColumn();
if(e.range.getSheet().getName()==sheetwithcheckbox.getName()&&(column==3 | | column==4 | | column==5)){
var spreadsheet2=SpreadsheetApp.openById(“XXX”);
var表;
变量id;
开关(列){
案例3:
sheet=ss.getSheetByName(“名称”);
id=ss.getId();
打破
案例4:
sheet=ss.getSheetByName(“名称2”);
id=ss.getId();
打破
案例5:
id=电子表格2.getId();
sheet=电子表格2.getSheetByName(“名称3”);
打破
}       
var保护=sheet.protect();
if(protection.canDomainEdit()){
protection.setDomainEdit(false);
}
var editor=sheetwithcheckbox.getRange(e.range.getRow(),2.getValue();
Logger.log(e.value);
如果(e.value==“TRUE”){
DriveApp.getFileById(id).addEditor(编辑器);
保护。添加器(编辑器);
}
如果(e.value==“FALSE”){
protection.removeditor(编辑器);
}
}
}

什么是
Sheet1
Sheet2
等?它们是单独的电子表格还是活动电子表格中的表格?@ziganotschka它们都是,像电子表格1中的
选项卡1
选项卡2
,以及电子表格2中的
选项卡A
选项卡B
。谢谢你这么问。这真的很有帮助!但是我不知道o在我勾选/取消勾选复选框后,迄今为止在访问权限方面没有看到任何更改。我猜其他脚本可能有问题,可能会破坏复选框的功能,或者工作表的数量影响了代码,或者是其他原因?该脚本更改了已共享的电子表格的各个工作表的权限。I这是你想要的还是电子表格首先也需要通过脚本共享?确保每个项目没有超过一个编辑功能。如果我在一开始没有解释清楚,很抱歉。我想限制/提供我从未与之共享整个电子表格的人的访问权限。比如,如果我只检查t他打开框,让他们访问电子表格1的tab1,他们将无法访问电子表格1的tab2。因此,是的,我希望电子表格也在第一时间共享。另一方面,onOpen也会影响onEdit吗?在此之前,我已经删除了所有其他onEdit功能,但仍然无效。非常感谢
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]);
    };