触发其他脚本的脚本

时间:2015-10-26 13:55:44

标签: google-apps-script google-sheets

我有几个Google表单使用onFormSubmit触发器将其提交的结果推送到一个" master" Google Sheet(不同的文件)使用setValues来合并对表单的所有响应。这个"大师"电子表格对其他列中的表单结果进行一些数据处理,并将数据踢到另一个电子表格。但是,我无法想出一种方法将表单提交连接到" master"电子表格的脚本。

我最初假设setValues函数的形式为' onFormSubmit(用于将表单的结果推送到" master")将触发" master"中的onEdit。表格,但快速谷歌搜索显示,情况并非如此。因为他们处于不同的项目中,所以我不知道表格是否适用。 onFormSubmit脚本可以调用" master"中的函数。电子表格项目。我已经读过onChange()触发器无法做到这一点,尽管谷歌开发人员声明它确实如此。

我不想使用基于计时器的更新程序。是否有任何提示让一张表的脚本自动启动另一张表的脚本?

1 个答案:

答案 0 :(得分:1)

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

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

IPC的现有电子表格触发器

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

  • 表格提交(有用)

    你说" master"中的脚本。电子表格"对其他列中的表单结果进行一些数据处理,并将数据踢到另一个电子表格中。"如果该数据作为一行,那么您可以以编程方式向子服务电子表格提交表单响应。这将允许您在那里使用表单提交触发器功能来启动任何进一步处理。

    例如,此函数将复制来自" master"的两个答案。形成并模拟提交到子表单:

    /**
     * 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

主脚本中的表单提交触发器功能可以通过附加到子表的web app更新辅助电子表格。这种网络应用程序的示例显示在How to post to Google Docs Form directly

假设子脚本按原样使用该脚本,主表单处理程序可以执行此操作:

/**
 * 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]
                           );
}

在这种方法中,在存储数据之前,Web应用程序将执行子表中所需的任何处理。