【问题标题】:Using onFormSubmit Trigger With Multiple Forms For One Sheet将 onFormSubmit 触发器与一张表的多个表单一起使用
【发布时间】:2020-09-08 09:35:14
【问题描述】:

我正在尝试为具有多种表单的 Google 表格开发功能;每个表单在电子表格书中都有一个单独的工作表,我正在使用单独的函数将数据添加到主工作表。代码是容器绑定到工作表文件的。

特别是,我尝试使用单个 onFormSubmit 触发器,然后通过每个表单提交中第一个问题的标题来识别表单,因此 onFormSubmit 运行的适当函数和变量传递不包括时间戳。目前编码的函数如下:

//Selects onFormSubmit action based on contents of form submission.  Regex compliance is enforced by forms.
function onFormSubmit(e) {
  Logger.log(e);
  var responses = e.response.getItemResponses();
  var keyResponse = responses[1].getItem().getTitle();
  Logger.log(keyResponse);
  if (keyResponse == "CUNY ID") {
    var cunyID = responses[1].getResponse();
    cunyIDQuery(cunyID);
  }
  else if (keyResponse == "First Name") {
    var firstName = responses[1].getResponse();
    var lastName = responses[2].getResponse();
    var gpa = responses[3].getResponse();
    infoSubmit(firstName, lastName, gpa);
  }
  else if (keyResponsew == "Q1") {
    var q1 = responses[1].getResponse();
    var q2 = responses[2].getResponse();
    var q3 = responses[3].getResponse();
    gradeSubmit(q1, q2, q3);
  }
  else {
    wrongFormError();
  }
}

不幸的是,由于这是容器绑定的,而且我正在作为附加组件进行测试,因此记录器功能并不是很有帮助,但我确实相信,当我使用 e.namedValues 而不是 e 时。 response.getItemResponses,我能够确定,至少,表单提交似乎正确地传递到了函数中。如果有人能解决这个问题,那就太好了。

【问题讨论】:

  • 您可以使用 e.range 值来确定工作表名称,然后可以将其与表单名称相关联。 var sheet=e.range.getSheet();
  • 我认为您使用了错误的事件对象。您需要使用电子表格表单提交对象而不是表单表单提交对象。
  • @Cooper 你介意澄清一下吗?我确实使用 UI 对话框创建了触发器,事件源被列为电子表格,事件类型为 On form submit。

标签: google-apps-script google-sheets google-forms


【解决方案1】:

Apps 脚本有两种类型的form submit 触发器

documentation中指定:

当用户响应 形式。表单提交触发器有两种版本,一种用于 如果表单提交给 Google Forms 本身和一个用于表格 电子表格。

  • 两个触发器都有event type On form Submit,但取决于您的脚本是绑定到表单本身还是目标电子表格,可选的event source 将是From formFrom spreadsheet
  • 当您想使用event objects 时,这种差异变得非常重要。
  • 您可以看到,尽管On form Submit 触发器名称相同,但根据您的脚本是绑定到表单还是绑定到电子表格,该触发器将具有不同的事件对象。

  • 对于event source From spreadsheet,可用的事件对象是
    • 身份验证模式
    • namedValues
    • 范围
    • triggerUid
    • 价值观
  • 对于event source From form,可用的事件对象是
    • 身份验证模式
    • 回复
    • 来源
    • triggerUid

结论

  • 如果要将脚本绑定到电子表格,以便将其用于多个表单,则不能使用事件对象e.response,因为这不是From spreadsheet 的有效事件对象。
  • 您需要改用valuesnamedValues - 取决于您的偏好,它们会以不同的方式为您提供相同的信息。
  • 如果不同的表单有不同的问题,那么namedValues 没有多大意义,所以请改用e.values 并跳过e.values[0],这将是时间戳。

【讨论】:

  • 您可以使用From spreadsheet事件对象的range值来确定提交的工作表和表单。
【解决方案2】:

使用一个脚本处理多个表单的替代方法

Google 表格 formSubmit 事件会针对连接到表格的任何表单触发。我设法使用 formResponse 结果的范围来确定它来自哪个工作表以了解它来自哪个表单

function myFunction(form) {
  const formSheetName = form.range.getSheet().getName();

来源:IMTheNachoMan 评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多