问题 如何在submit事件处理程序中获取表单值?


我正在尝试开始使用一个非常简单的Google表单,其中只包含几个问题(只有2个选项和一个简短文本的多选)。创建它之后,我打开了脚本编辑器并输入了

function onSubmit(e) {
  Logger.log("onSubmit(%s)", JSON.stringify(e));
}

并配置 onSubmit 作为“表单提交”的处理程序,使用“编辑”菜单中的“当前项目的触发器”触发。

填写表单并提交它现在会导致调用处理程序,但我只在日志中看到:

[17-04-15 18:56:23:584 CEST] onSubmit({"response":{},"source":{},"authMode":{},"triggerUid":1870249629})

即响应字段为空。我也试过用 FormApp.getActiveForm().getResponses(),但它也返回一个包含几个空对象的数组(OTOH, FormApp.getActiveForm().getTitle() 确实返回我给表格的标题)。

我怀疑我需要给脚本一些额外的权限来访问表单数据,但是我不知道怎么做,即使这确实是问题。

有谁知道为什么我没有得到表格值,我该怎么做才能得到它们?提前致谢!


3067
2018-04-15 17:33


起源



答案:


有两种模式可用于检索提交的值。对于这两种模式,从表单提交中检索值的功能必须作为触发器安装。可安装触发器的详细信息是 https://developers.google.com/apps-script/guides/triggers/installable

1.脚本在电子表格中打开。

在这种情况下,通过安装触发器,您可以通过脚本检索提交的值。事件对象的详细信息是 https://developers.google.com/apps-script/guides/triggers/events#form-submit

脚本:

function onSubmit(e){
  Logger.log("%s", JSON.stringify(e));
}

结果:

{
  "values": [
    "date and time",
    "test"
  ],
  "namedValues": {
    "fromtestform": [
      "test"
    ],
    "timeStamp": [
      "date and time"
    ]
  },
  "range": {
    "columnStart": 1,
    "rowStart": 2,
    "rowEnd": 2,
    "columnEnd": 2
  },
  "source": {},
  "authMode": {},
  "triggerUid": #####
}

2.脚本在表单上打开。

在这种情况下,可以通过以下脚本检索提交的值。详细信息是 https://developers.google.com/apps-script/reference/forms/form-response

脚本:

function onSubmit(e){
  Logger.log("authMode=%s, source.getId()=%s", e.authMode, e.source.getId());
  var items = e.response.getItemResponses();
  for (i in items){
    Logger.log("getItem().getTitle()=%s, getResponse()=%s", items[i].getItem().getTitle(), items[i].getResponse());
  }
}

结果:

authMode=FULL, source.getId()=### form ID ###
getItem().getTitle()=## item's title ##, getResponse()=test

如果我误解了你的问题,我很抱歉。


14
2018-04-16 02:18



你是绝对正确的,这(第二个,我不使用电子表格,只是一个独立的表格)确实有效。显然就是这样 JSON.stringify() 不适用于GS对象! - VZ.
也谢谢你。我很高兴我能帮助你。 - Tanaike
这个答案中的价值比所有谷歌关于这个主题的文档更有价值。 - Alexander Toptygin
@Alexander Toptygin谢谢。 - Tanaike
我想指出调用该函数很重要 onSubmit()。编辑器允许你输入任何东西,我已经阅读了一个教程,其中函数被称为其他东西,但接收到的事件不包括 response 目的。 - Guss


答案:


有两种模式可用于检索提交的值。对于这两种模式,从表单提交中检索值的功能必须作为触发器安装。可安装触发器的详细信息是 https://developers.google.com/apps-script/guides/triggers/installable

1.脚本在电子表格中打开。

在这种情况下,通过安装触发器,您可以通过脚本检索提交的值。事件对象的详细信息是 https://developers.google.com/apps-script/guides/triggers/events#form-submit

脚本:

function onSubmit(e){
  Logger.log("%s", JSON.stringify(e));
}

结果:

{
  "values": [
    "date and time",
    "test"
  ],
  "namedValues": {
    "fromtestform": [
      "test"
    ],
    "timeStamp": [
      "date and time"
    ]
  },
  "range": {
    "columnStart": 1,
    "rowStart": 2,
    "rowEnd": 2,
    "columnEnd": 2
  },
  "source": {},
  "authMode": {},
  "triggerUid": #####
}

2.脚本在表单上打开。

在这种情况下,可以通过以下脚本检索提交的值。详细信息是 https://developers.google.com/apps-script/reference/forms/form-response

脚本:

function onSubmit(e){
  Logger.log("authMode=%s, source.getId()=%s", e.authMode, e.source.getId());
  var items = e.response.getItemResponses();
  for (i in items){
    Logger.log("getItem().getTitle()=%s, getResponse()=%s", items[i].getItem().getTitle(), items[i].getResponse());
  }
}

结果:

authMode=FULL, source.getId()=### form ID ###
getItem().getTitle()=## item's title ##, getResponse()=test

如果我误解了你的问题,我很抱歉。


14
2018-04-16 02:18



你是绝对正确的,这(第二个,我不使用电子表格,只是一个独立的表格)确实有效。显然就是这样 JSON.stringify() 不适用于GS对象! - VZ.
也谢谢你。我很高兴我能帮助你。 - Tanaike
这个答案中的价值比所有谷歌关于这个主题的文档更有价值。 - Alexander Toptygin
@Alexander Toptygin谢谢。 - Tanaike
我想指出调用该函数很重要 onSubmit()。编辑器允许你输入任何东西,我已经阅读了一个教程,其中函数被称为其他东西,但接收到的事件不包括 response 目的。 - Guss