Google Apps脚本 - 复制电子表格中的脚本不保留触发器
问题描述:
我在Google Spreadsheet中使用脚本,在表单提交时,复制现有电子表格和Google表单,以创建新电子表格和新表单,然后连接新表单到新电子表格,新电子表格正在接收新表单的响应。Google Apps脚本 - 复制电子表格中的脚本不保留触发器
复制的电子表格中的脚本被复制到新的电子表格中,但安装的触发器不存在。有没有办法从原始电子表格的脚本(接收创建新的SS和表单的表单提交的电子表格)创建这些触发器,还是需要依靠新电子表格中未安装的触发器来创建已安装的触发器?
答
触发器运行需要用户授权的脚本。由于您的脚本绑定到电子表格,因此需要在每个副本上进行授权。
我有一个类似的系统(副本的主表+代码),我们通过添加一个自定义菜单来运行脚本,当有人做副本时解决了这个问题。我添加了一个自定义菜单和一个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();
}
很容易对谁创造了片,并已可靠为我们到目前为止用户。
答
我能解决我的问题与下面的代码。函数'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...
}