首页 > 解决方案 > 可安装触发器以不同形式触发脚本?

问题描述

当提交不同的表单 (B) 时,我正在尝试运行连接到一个表单 (A) 的脚本。我有一系列不同的表单,它们相似并且需要运行相同的脚本,所以我没有将代码复制到每个脚本,而是想知道这是否可能。我成功在A中做了一个可安装的触发函数,指向B。提示时我已授予权限。当我发布 B 时,A 中的脚本触发,我在日志中得到了这个:

Exception: No response with ID 2_ABaOnudSFDkNQOL2Xn4fNOmT95GrTotEW8LSjxfI5qf6qceDN5hD5CHKqNT5D4G_DdONWq0 exists for this form.
    at onFormAnswerSubmit(Kod:40:20)

停止的行 (Kod:40:20) 是获取发布数据的行:

  var items    = e.response.getItemResponses();

这应该有效还是不可能将发布的数据从一种形式传递到另一种形式的脚本?

还是我可以在触发器中做更多的事情?就像强制传递 e。或者其他的东西?这是我创建的触发器:

/**
 * Creates a trigger for when a different form is posted that runs a function in this script (run once)
 */
function createOtherFormTrigger() {
  var formID = FormApp.openById("XXXXX"); // form B
    
  ScriptApp.newTrigger('onFormAnswerSubmit') // a function in this script, in form A
      .forForm(formID)
      .onFormSubmit()
      .create();
}

标签: google-apps-scripttriggersgoogle-forms

解决方案


你需要稍微改变一下逻辑:

触发器触发的函数应该包含在与触发器相同的脚本中。

为表单 B 创建 formSubmit 触发器的示例代码:

//run this once
function createOtherFormTrigger() { 
var formB = FormApp.openById("XXX");   
  ScriptApp.newTrigger('onFormAnswerSubmit') // a function in this script, in form B
      .forForm(formB) //the active form is Form B
      .onFormSubmit()
      .create();
}
function onFormAnswerSubmit(e){
   var formB = e.source;
   var items = e.response.getItemResponses(); //items of the latest form response of form B
   var formA = FormApp.openById("XXXX"); // Form A 
  ... 
  // do what you need to do with form A
}

上面的代码将创建在提交表单 B 的表单响应时触发的触发器。因此,脚本是绑定到表单 A、表单 B 还是独立的并不重要。实际上,在独立脚本中实现这些功能可能最有意义,以确保它们不会干扰您可能在表单绑定脚本中使用的其他表单提交触发器。


推荐阅读