【问题标题】:Scripts triggering other scripts触发其他脚本的脚本
【发布时间】:2016-01-25 15:47:47
【问题描述】:

我有几个谷歌表单,它们使用onFormSubmit 触发器将提交的结果推送到一个“主”谷歌表格(不同的文件)中,使用 setValues 来合并对表单的所有响应。这个“主”电子表格对附加列中的表格结果进行了一些数据处理,并将数据踢到另一个电子表格中。但是,我想不出将表单提交连接到“主”电子表格脚本的方法。

我最初假设表单的 onFormSubmit 中的 setValues 函数(我用来将表单的结果推送到“master”)会触发“master”表中的 onEdit,但快速的 Google 搜索显示事实并非如此。因为它们在不同的项目中,所以我不知道 Forms 的 onFormSubmit 脚本是否可以调用“主”电子表格项目中的函数。我已经读到 onChange() 触发器不能用于执行此操作,尽管 Google 开发人员声明它可以。

我不想使用基于计时器的更新程序。有什么技巧可以让一个工作表的脚本自动启动另一个工作表的脚本吗?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    正如您已经发现的,事件触发器是调用脚本的一种非常优雅的方式。将它们应用于脚本间通信的不幸缺点是没有支持IPC 的特定触发器。自 2012 年以来(针对绑定到同一文档的脚本),一直有此类功能的开放请求,Issue 2231

    您的选择是利用现有触发器或使用网络应用模拟触发器。

    现有的 IPC 电子表格触发器

    Open 事件显然不适用,所以我们将跳过它。

    • 表单提交(有用)

      您说“主”电子表格中的脚本“对其他列中的表单结果进行一些数据处理,并将数据转移到另一个电子表格。”如果该数据是连续的,那么您可以以编程方式将表单响应提交给从属电子表格。这将允许您在那里使用表单提交触发功能来启动任何进一步的处理。

      例如,此函数将从“主”表单中复制两个答案并模拟提交到子表单:

      /**
       * Master form submission trigger function. Processes "master" form responses and
       * passes data on to subForm by simulating a subForm submission.
       *
       * From: https://stackoverflow.com/questions/33347541
       */
      function onSubmit( e ) {
        // Base URL of secondary processing script's form ("subForm")
        var subFormID = "--Sub-Form-ID--";
      
        // Process master form submission here...
      
        // In this example, we're just passing values from Master through to the sub-form.
        var subForm = FormApp.openById(subFormID);
        var items = subForm.getItems();
        var subResponse = subForm.createResponse()
                                 .withItemResponse(items[0].asTextItem().createResponse(e.values[1]))
                                 .withItemResponse(items[1].asTextItem().createResponse(e.values[2]));
      
        // Simulate a user form submission with manufactured response.
        subResponse.submit();
      }
      

      这里,子表单有两个文本项,主表单项类型是什么无关紧要。由于子表单不开放供人机交互,因此简化了代码。

    • onEdit(没用)

      如您所见,此触发器仅响应单元格内容的手动编辑,因此与 IPC 无关。

    • onChange(无用)

      此触发器响应电子表格结构中的更改以及内容(编辑),但不是在以编程方式进行时。在Issues 27513269 和最重要的4568 得到修复之前,您将无法使用 onChange 触发器在脚本之间进行通信。

    网络应用

    主脚本中的表单提交触发功能可以通过附加到子工作表的web app 更新辅助电子表格。 How to post to Google Docs Form directly 中显示了此类 Web 应用程序的示例。

    假设子脚本按原样使用该脚本,主表单处理程序可以这样做:

    /**
     * Master form submission trigger function. Processes "master" form responses and passes data on
     * to subSheet by calling a web app.
     *
     * From: https://stackoverflow.com/questions/33347541
     */
    function onSubmit( e ) {
      // Base URL of secondary processing script's form ("subForm")
      var subSheetWebAppURL = "https://script.google.com/macros/s/--APP-ID--/exec";
    
      // Process master form submission here...
    
      // In this example, we're just passing values from Master through to the sub-sheet.
      var a = UrlFetchApp.fetch(subSheetWebAppURL
                                + "?col1="+e.values[1]
                                + "&col2="+e.values[2]
                               );
    }
    

    在这种方法中,网络应用会在存储数据之前执行子表中所需的任何处理。

    【讨论】:

    • 这证实了我已经猜到的。非常感谢 - 将尝试您的想法!
    猜你喜欢
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多