我在Google电子表格中使用脚本,在表单提交时,复制现有的电子表格和Google表单以创建新的电子表格和新表单,然后将新表单连接到新电子表格,以便新电子表格接收新表格的回复。
复制的电子表格中的脚本会复制到新的电子表格中,但已安装的触发器不存在。有没有办法从原始电子表格的脚本(收到创建新SS和表单的表单提交的电子表格)创建这些触发器,或者我是否需要依赖新电子表格中的未安装触发器来创建已安装的触发器?
答案 0 :(得分: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();
}
创建工作表的用户很容易,到目前为止我们一直很可靠。
答案 1 :(得分:1)
我能够用下面的代码解决我的问题。功能' newSSTrigger'在原始脚本(不是复制的脚本)中,在创建新的SS和表单并且同步后调用 - 这是变量idOfNewSS的来源。触发器不会在新对象中创建脚本,甚至不会在新对象的脚本中将其视为已安装的触发器。要查找触发器,请转到任何脚本中的编辑>所有触发器。不以灰色显示的触发器以某种方式附加到文档中。
这似乎有两个好处: 1)我永远不必处理任何权限 - 触发器工作没有我触及新的文档。 2)如果我更新了'myFunction' (下面)它改变了现有触发器的工作方式,因为触发器从原始脚本中检索其指令 - 处于当前状态。这意味着我可以通过编辑此函数来更新此脚本创建的所有现有触发器。
function newSSTrigger(idOfNewSS) {
var newSS = SpreadsheetApp.openById(idOfNewSS);
ScriptApp.newTrigger("myFunction")
.forSpreadsheet(newSS)
.onFormSubmit()
.create();
}
function myFunction() {
do stuff...
}
答案 2 :(得分:0)
对于不只是以编程方式复制工作表的人(或预期用户制作开发人员无权编辑的副本)的人来说,另一种选择是为边界内的用户处理它脚本。您可以使用与此类似的代码:
function onOpen(){
var triggers = ScriptApp.getProjectTriggers();
if(triggers.length == 0){
ScriptApp.newTrigger('yourFunction')
.timeBased()
.everyHours(1)
.create();
}
这表示如果没有触发器,则添加一个基于时间的触发器。您可以查看此 documentation 以了解变体。