【问题标题】:Google Apps Script - Scripts in copied spreadsheet not retaining triggerGoogle Apps 脚本 - 复制的电子表格中的脚本不保留触发器
【发布时间】:2021-03-26 01:40:01
【问题描述】:
我正在使用 Google 电子表格中的脚本,在提交表单后,复制现有电子表格和谷歌表格以创建新电子表格和新表格,然后将新表格连接到新电子表格,以便新电子表格接收来自新表单的回复。
已复制电子表格中的脚本已复制到新电子表格,但已安装的触发器不存在。有没有办法从原始电子表格的脚本(收到创建新 SS 和表单的表单提交的电子表格)创建这些触发器,还是我需要依赖新电子表格中未安装的触发器来创建已安装的触发器?
【问题讨论】:
标签:
forms
google-apps-script
triggers
scripting
【解决方案1】:
触发器运行需要用户授权的脚本。由于您的脚本绑定到电子表格,因此需要对每个副本进行授权。
我有一个类似的系统(主表副本 + 代码),我们通过添加自定义菜单来解决此问题,以便在有人制作副本时运行脚本。我添加了一个自定义菜单和一个 setup 脚本来授权触发器。
function onOpen(e) {
var ui = SpreadsheetApp.getUi().createMenu("PGP Setup").addItem("Run", "setup").addToUi();
}
function setup() {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('makeDocs')
.timeBased()
.everyHours(1)
.create();
}
对于创建工作表的用户来说很容易,并且到目前为止对我们来说是可靠的。
【解决方案2】:
我能够使用下面的代码解决我的问题。函数“newSSTrigger”在原始脚本中(不是复制的),在创建和同步新的 SS 和 Form 后调用 - 这是变量 idOfNewSS 的来源。触发器不会在新对象中创建脚本,甚至不会在新对象的脚本中被视为已安装的触发器。要找到触发器,请从任何脚本转到编辑>所有触发器。未变灰的触发器以某种方式附加到文档中。
这似乎有两个好处:
1) 我永远不需要处理任何权限——触发器工作时我根本不需要接触新文档。
2)如果我更新'myFunction'(如下),它会改变现有触发器的工作方式,因为触发器从原始脚本中检索其指令 - 在其当前状态下。这意味着我可以通过编辑这个函数来更新这个脚本创建的所有现有触发器。
function newSSTrigger(idOfNewSS) {
var newSS = SpreadsheetApp.openById(idOfNewSS);
ScriptApp.newTrigger("myFunction")
.forSpreadsheet(newSS)
.onFormSubmit()
.create();
}
function myFunction() {
do stuff...
}
【解决方案3】:
对于不仅仅以编程方式复制工作表的人(或预期用户制作开发人员无权编辑的副本)的人来说,另一种选择是为绑定内的用户处理它脚本。你可以使用类似这样的代码:
function onOpen(){
var triggers = ScriptApp.getProjectTriggers();
if(triggers.length == 0){
ScriptApp.newTrigger('yourFunction')
.timeBased()
.everyHours(1)
.create();
}
这表示如果没有触发器,则添加基于时间的触发器。您可以查看此documentation 了解变体。