【问题标题】:The id of a FormResponse when a response is submitted is different when you list all FormResponses列出所有 FormResponse 时,提交响应时 FormResponse 的 id 不同
【发布时间】:2014-03-19 14:50:19
【问题描述】:

我正在研究由 Google 表单支持的错误跟踪,我认为我遇到了 Apps 脚本中的错误。

提交响应后,我的脚本onFormSubmit 处理程序将获取FormResponse id(如下例所示):

function onFormSubmit(e) {
  log("ID (on submit):", e.response);
}

function log(msg, response) {
  Logger.log(msg + " " + response.getId() + "; response is '" + response.getItemResponses()[0].getResponse() + "'");
}

此外,当我列出所有FormResponses 时,我得到不同的ID,除了第一个,这是正确的。示例代码如下:

function listResponsesId() {
  FormApp.getActiveForm().getResponses().forEach(function(v) {
    log("ID (on list):", v);
  });
} 

function log(msg, response) {
  Logger.log(msg + " " + response.getId() + "; response is '" + response.getItemResponses()[0].getResponse() + "'");
}

我使用这个示例应用运行了 3 次表单提交,结果如下:

ID (on submit): ChI2NzM1Mjg5OTY5NjY0MjA5MjEQzI768siy3sSOAQ; response is 'test 1'
ID (on list): ChI2NzM1Mjg5OTY5NjY0MjA5MjEQzI768siy3sSOAQ; response is 'test 1'

ID (on submit): ChMxOTczNzc5Nzk1MDI1MDkzMjMyEMyO-vLIst7EjgE; response is 'test 2'
ID (on list): ChMxOTczNzc5Nzk1MDI1MDkzMjMyEAA; response is 'test 2'

ID (on submit): ChMyNjk1ODgzNjgwMjk2NjM4NzAyEMyO-vLIst7EjgE; response is 'test 3'
ID (on list): ChMyNjk1ODgzNjgwMjk2NjM4NzAyEAA; response is 'test 3'

FormResponse.getId() 应该不可靠?

【问题讨论】:

  • 在一次测试中,我看到ID不一样,但是经过一定时间(例如5分钟)后,它们是相等的,显然分配了一个临时ID,直到它们同步。
  • @wchiquito 谢谢!我刚看到...我必须想办法在 id 不同步的情况下不允许用户访问某些信息。

标签: google-apps-script google-forms


【解决方案1】:

我遇到了同样的问题。

虽然我当前的实现依赖于时间戳 - 在不太可能(但仍有可能)在同一秒内提交两个响应的情况下,我的解决方案将失败。

我注意到,在上述示例中,响应 ID 不同,它们仍然共享前 29 个字符。

鉴于这些 ID 的长度和复杂性,我敢打赌,这些 ID 在提交给所有 Google 表单的所有回复中都是全局的,并且找到两个回复在其开头共享这 29 个字符的几率与两个受访者同时提交表单相比,字符串提交到同一个表单的可能性要小得多。

因此,仅比较 ID 的第一部分的解决方法可能会成功。

if (idStoredOnFormSubmit.substr(0,29) === idFetchedFromFormResponse.substr(0,29)) {
   runThisCode();
};

substr(0,29) 从索引位置 0 开始的字符串开头取 29 个字符。

【讨论】:

    【解决方案2】:

    以防其他人遇到这种情况,我想发布我是如何解决这种行为的。

    我在尝试在onFormSubmit 触发器中使用我的FormResponse ID 时发现了同样的行为。当允许用户编辑响应时,我想将FormResponse ID 映射到另一个 API 返回的值。因此,为了通过不断变化的FormResponse ID,我使用来自onFormSubmit 响应的FormResponse ID 来获取保存的FormResponse 并映射保存的FormResponse 的ID,如下面的代码所示。

    if (form.canEditResponse()) {
      var savedResponse = form.getResponse(response.getId());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2018-06-19
      • 2023-03-29
      • 2013-12-25
      相关资源
      最近更新 更多