列出所有FormResponses时,提交响应时FormResponse的ID不同

时间:2014-03-19 14:50:19

标签: google-apps-script google-form

我正在使用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() + "'");
}

此外,当我列出所有FormResponse时,我会得到不同的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()不应该可靠吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

虽然我当前的实现落后于时间戳 - 在不太可能(但仍然可能)的事件中,在同一秒内提交了两个响应,我的解决方案将失败。

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

考虑到这些ID的长度和复杂性,我愿意下注这些在提交给所有谷歌表单的所有回复中都是全球性的,并且发现在他们开始时共享这29个字符的两个回复的几率很高。提交到同一表格的字符串远比让两名答复者在同一时间提交表格的可能性小得多。

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

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

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

答案 1 :(得分:0)

如果其他人遇到这种情况,我想发布我是如何解决这种问题的。

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

FormResponse