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();
}
function newSSTrigger(idOfNewSS) {
var newSS = SpreadsheetApp.openById(idOfNewSS);
ScriptApp.newTrigger("myFunction")
.forSpreadsheet(newSS)
.onFormSubmit()
.create();
}
function myFunction() {
do stuff...
}
2 回答
触发器运行需要用户授权的脚本 . 由于您的脚本绑定到电子表格,因此需要在每个副本上对其进行授权 .
我有一个类似的系统(主表单代码的副本),我们通过添加自定义菜单来解决这个问题,以便在有人复制时运行脚本 . 我添加了一个自定义菜单和一个授权触发器的
setup
脚本 .创建工作表的用户很容易,到目前为止对我们来说是可靠的 .
我能够用下面的代码解决我的问题 . 函数'newSSTrigger'在原始脚本(不是复制的脚本)中,并在创建和同步新SS和表单后调用 - 这是变量idOfNewSS来自的位置 . 触发器不会在新对象中创建脚本,甚至不会在新对象的脚本中将其视为已安装的触发器 . 要查找触发器,请从任何脚本转到“编辑”>“所有触发器” . 不以灰色显示的触发器以某种方式附加到文档 .
这似乎有两个好处:1)我永远不必处理任何权限 - 触发器工作没有我触及新的文档 . 2)如果我更新'myFunction'(下面),它会改变现有触发器的工作方式,因为触发器从原始脚本中检索其指令 - 处于当前状态 . 这意味着我可以通过编辑此函数来更新此脚本创建的所有现有触发器 .