Google apps script 触发其他脚本的脚本

Google apps script 触发其他脚本的脚本,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有几个谷歌表单,它们使用onFormSubmit触发器将提交结果推送到一个“主”谷歌表单(不同的文件)中,使用setvalue合并表单的所有响应。此“主”电子表格对附加列中的表格结果进行一些数据处理,并将数据导入另一个电子表格。但是,我想不出一种方法来将表单提交连接到“主”电子表格的脚本 我最初认为表单的onFormSubmit(我用来将表单结果推送到“主控”页面)中的setValues函数会触发“主控”页面中的onEdit,但谷歌快速搜索表明情况并非如此。因为它们在不同的项目中,我不知道表单

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

我最初认为表单的onFormSubmit(我用来将表单结果推送到“主控”页面)中的setValues函数会触发“主控”页面中的onEdit,但谷歌快速搜索表明情况并非如此。因为它们在不同的项目中,我不知道表单的onFormSubmit脚本是否可以调用“主”电子表格项目中的函数。我已经读到onChange()触发器不适合这样做,尽管谷歌开发人员说它可以


我不想使用基于计时器的更新程序。关于让一张工作表的脚本自动启动另一张工作表的脚本,有什么建议吗?

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

您可以选择利用现有触发器,或使用web应用程序模拟触发器

IPC的现有电子表格触发器 开放事件显然不适用,因此我们将跳过它

  • 提交表格(有用)

    您说“主”电子表格中的脚本“对附加列中的表单结果进行一些数据处理,并将数据踢到另一个电子表格中。”如果该数据作为一行,则您可以通过编程方式向从属电子表格提交表单响应。这将允许您使用表单提交触发器函数来启动任何进一步的处理

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

    /**
    *主窗体提交触发函数。处理“主”表单响应和
    *通过模拟子表单提交将数据传递到子表单。
    *
    *发件人:https://stackoverflow.com/questions/33347541
    */
    提交函数(e){
    //辅助处理脚本表单(“子表单”)的基本URL
    var subFormID=“--子表单ID-”;
    //在此处处理主表单提交。。。
    //在本例中,我们只是将值从主窗体传递到子窗体。
    var subForm=FormApp.openById(subFormID);
    var items=subForm.getItems();
    var subResponse=subForm.createResponse()
    .withItemResponse(项[0].asTextItem().createResponse(e.values[1]))
    .withItemResponse(items[1].asTextItem().createResponse(e.values[2]);
    //使用人工响应模拟用户表单提交。
    subResponse.submit();
    }
    
    在这里,子表单有两个文本项,主表单项类型是什么并不重要。由于子表单不开放供人交互,这简化了代码

  • onEdit(无用)

    正如您所遇到的,此触发器只响应单元格内容的手动编辑,因此与IPC无关

  • 一次更换(无用)

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

网络应用 主脚本中的表单提交触发功能可以通过附加到子表的表单更新辅助电子表格。中显示了此类web应用程序的示例

假设子脚本按原样使用该脚本,则主窗体处理程序可以执行以下操作:

/**
*主窗体提交触发函数。处理“主”表单响应并将数据传递给
*通过调用web应用程序创建子表。
*
*发件人:https://stackoverflow.com/questions/33347541
*/
提交函数(e){
//辅助处理脚本表单(“子表单”)的基本URL
var subSheetWebAppURL=”https://script.google.com/macros/s/--APP-ID--/exec";
//在此处处理主表单提交。。。
//在本例中,我们只是将值从主表传递到子表。
var a=UrlFetchApp.fetch(子表
+“?col1=“+e.values[1]
+“&col2=“+e.values[2]
);
}

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

这证实了我的猜测。非常感谢-将尝试你的想法!