首页 文章

Google Apps脚本 - 复制的电子表格中的脚本不会保留触发器

提问于
浏览
0

我在Google电子表格中使用脚本,在表单提交时,复制现有的电子表格和谷歌表单以创建新的电子表格和新表单,然后将新表单连接到新电子表格,以便新电子表格接收来自新形式 .

复制的电子表格中的脚本将复制到新电子表格中,但安装的触发器不存在 . 有没有办法从原始电子表格的脚本(接收创建新SS和表单的表单提交的电子表格)创建这些触发器,还是我需要依赖新电子表格中的未安装触发器来创建已安装的触发器?

2 回答

  • 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

    我能够用下面的代码解决我的问题 . 函数'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...
    }
    

相关问题