Google apps script 用户需要对受保护的单元格进行着色

Google apps script 用户需要对受保护的单元格进行着色,google-apps-script,Google Apps Script,我创建了一个谷歌表单,并设置了一些保护措施,限制用户选中/取消选中单个单元格。当他们选中或取消选中单元格时,会对同一工作表中的数据进行着色处理。即数字>90%深绿色。数字>80%浅绿色。等等 当然,这对我来说效果很好,因为我自己没有任何保护措施。然而,我刚刚意识到,用户不能使用复选框对受保护的单元格进行着色。他们可以勾选/取消勾选,但onEdit中的代码不会像我一样为他们着色 当我第一次制作文档时,我已经为它设置了条件格式,这样它就会自动处理它。然而,这使得纸张速度变慢,因为它可能会在一页中的任

我创建了一个谷歌表单,并设置了一些保护措施,限制用户选中/取消选中单个单元格。当他们选中或取消选中单元格时,会对同一工作表中的数据进行着色处理。即数字>90%深绿色。数字>80%浅绿色。等等

当然,这对我来说效果很好,因为我自己没有任何保护措施。然而,我刚刚意识到,用户不能使用复选框对受保护的单元格进行着色。他们可以勾选/取消勾选,但onEdit中的代码不会像我一样为他们着色

当我第一次制作文档时,我已经为它设置了条件格式,这样它就会自动处理它。然而,这使得纸张速度变慢,因为它可能会在一页中的任何地方显示50到300个单元格的阴影。(每一页都有不同数量的单元格。)如果有必要,我可以回到这里。如果有办法加快速度,我洗耳恭听

然而,我希望有人能帮助一个noob找出如何保护细胞,让用户不能编辑它,但让阴影工作,如第一段所述

想法

桑迪

编辑:

下面是当用户检查“shade”单元格时,通过OneEdit激活的代码:(我确信有更好的方法来编写代码……但我仍在学习并通过某种方式进行黑客攻击……)

编辑#2:使用可安装触发器工作正常,但在副本上安装时遇到问题。(我知道可安装触发器在复制模板时不会复制)当我使用下面的代码从模板创建副本时,它只是在模板文件中创建触发器,而不是在新文件中创建触发器

手动创建一个可安装的触发器成功了。然而,我还是遇到了一个问题。由于我使用GAS从主模板生成电子表格的副本,它显然也不会复制触发器。我添加了以下代码,但它会将其安装在我正在使用的文件中,而不是我正在制作的文件的副本中

schoolGradeID=DriveApp.getFileById(gradeTemplateID).makeCopy(fileName, schoolFolder).setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.EDIT).getId(); newDoc=SpreadsheetApp.openById(schoolGradeID);
        
newDoc.getSheetByName("Blank").getRange("A1").setValue(schoolArray[s]);
ScriptApp.newTrigger('shadeCells')
   .forSpreadsheet(newDoc)
   .onEdit()
   .create();
如果
onEdit
触发器是您设置的类型,则用户可以对受保护的单元格进行着色
  • 可安装触发器始终代表安装它的用户运行
  • 即使用户没有特定范围的编辑权限,但能够选中将触发触发器的复选框-可安装触发器将代表您编辑受保护的范围
  • 要设置可安装触发器,您需要遵循以下步骤:

  • 请注意,绑定到可安装触发器的函数不允许调用
    onEdit
  • 如果将函数
    shadeyearbyear
    直接绑定到一个可安装的触发器,这将起作用
简单示例:

//将可安装的OneEdit触发器绑定到此函数
函数shadeyearbyear(e){
var currentSheet=e.range.getSheet();
var checkBoxColumn=“指定复选框列的编号”
if(e.range.getColumn()==checkBoxColumn&&e.value==“TRUE”){
currentSheet.getRange(17,6,1,14).setBackground(“红色”);
}
}

到目前为止,您是否尝试过任何方法并可以显示您现有的代码?我已更新了我的原始帖子以包含代码。当我以我的身份登录时,一切都很完美,因为我的电子邮件地址是.addEditor中包含的第一个地址。当我的域中的另一个用户被设置为编辑器但只能编辑复选框范围时,该用户可以选中复选框,但不会出现着色。它声称他们正在试图编辑受保护的范围。我能够在测试文件中创建可安装的触发器(谢谢!),它在测试文件中工作。但是,我无法让我的主文件在复制时创建触发器。(请参见我笔记中的编辑#2)。它只是在主文件中不断创建触发器。在这种情况下,最好以编程方式创建可安装的触发器,而不是像前面描述的那样手动创建。但是,您需要为每个电子表格副本运行一次触发器功能,因为您需要授权触发器以您的名义运行。是的。这就是我今天早些时候发现的。这将是一个痛苦的屁股,因为我必须运行大约150个文件,但至少我只需要做一次。
 var protection = sheetName.protect();
    var range1a = sheetName.getRange(range);
    protection.setUnprotectedRanges([range1a]);
    protection.addEditor("Myemailaddress");
    protection.addEditor("anotheremailaddress");
    protection.removeEditors(protection.getEditors());
    if(protection.canDomainEdit()){
      protection.setDomainEdit(false);
    }   
}
schoolGradeID=DriveApp.getFileById(gradeTemplateID).makeCopy(fileName, schoolFolder).setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.EDIT).getId(); newDoc=SpreadsheetApp.openById(schoolGradeID);
        
newDoc.getSheetByName("Blank").getRange("A1").setValue(schoolArray[s]);
ScriptApp.newTrigger('shadeCells')
   .forSpreadsheet(newDoc)
   .onEdit()
   .create();