【问题标题】:How to get form values in the submit event handler?如何在提交事件处理程序中获取表单值?
【发布时间】:2017-04-15 17:33:34
【问题描述】:

我正在尝试从一个非常简单的 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() 确实返回了我给表单的标题)。

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

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

【问题讨论】:

    标签: google-apps-script google-forms


    【解决方案1】:

    检索提交的值有 2 种模式。对于这两种模式,必须将用于从表单提交中检索值的函数安装为触发器。 Installable Triggers的详细信息是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
    

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

    【讨论】:

    • 你说得对,这个(第二个,我不使用电子表格,只是一个独立的表格)确实有效。显然只是 JSON.stringify() 不适用于 GS 对象!
    • 这个答案比谷歌关于该主题的所有文档更有价值。
    • 我想指出,函数被称为onSubmit() 很重要。编辑器允许您输入任何内容,并且我已经阅读了一个教程,其中该函数被称为其他内容,但是收到的事件不包括 response 对象。
    • @Tanaike google 应该把它放在他们的文档中。花了这么多时间。
    • 非常感谢,终于明白了。如果我在工作表上有脚本,那么我在工作表上执行 onFormSubmit 事件而不是表单!