获取最新的表单响应有时会获得之前的表单响应

时间:2014-01-15 17:28:56

标签: google-apps-script google-form

我想知道这是否与Google Apps脚本特别繁忙的时间有关,因为它似乎与更新formResponse []数组的长度(偶尔)延迟有关。我正在使用以下代码来获取表单提交触发的最新响应:

var form = FormApp.getActiveForm();
var formResponses = form.getResponses();
var formResponse = formResponses[formResponses.length-1]; //latest response only
Logger.log('begin length: ' + formResponses.length);

然后我的脚本的其余部分与formResponse []数组中的答案进行交互。偶尔,我会注意到它已经最新响应之前得到了响应。我可以验证这一点,因为带有表单响应的电子表格会显示实际的最新响应。我的脚本需要5-15秒才能执行,所以我在代码末尾有以下几行来再次检查数组的长度:

var form2 = FormApp.getActiveForm();
var formResponses2 = form2.getResponses();
Logger.log('end length: ' + formResponses2.length);

并且在日志中我会注意到第二个比第一个大(而第二个是正确的值)。关于它何时发生,我还没有找到太多的模式,但似乎更常发生在太平洋标准时间上午7-9点之间。现在我添加了一个Utilities.sleep(5000)作为函数的第一行,以便在我得到响应之前有时间更新表单,到目前为止我还没有任何n-2响应,这使我认为存在某种延迟导致表单在“on form submit”触发器触发后记录最新响应。

还有其他人遇到过类似的东西吗?

1 个答案:

答案 0 :(得分:7)

当服务器繁忙时,这些race conditions会变得更加明显,但cloud computing只是照常营业。简而言之,文档的每个用户都有该文档的视图(副本),不能保证它始终与“主版本”相同。查看电子表格时,您正在查看自己的电子表格副本。您的协作者可能正在查看自己的副本。实际上,访问“电子表格”的触发器功能也将被赋予其自己的副本。 在任何地方进行的更改需要同步到处,这需要时间。

在这种情况下,您的代码表明您在Google表单中包含的脚本中有一个功能。该脚本在触发时将获得一份表格副本,包括过去的回复。但是,触发脚本的表单提交可能尚未与表单提交同步。您还在处理包含回复的电子表格...当表单提交到表单服务时,它们存储在表单服务中,它们也存储在电子表格的副本中。该操作可能会触发电子表格表单提交事件,并且(您的头疼了吗?) 函数将获得可能尚未包含新表单提交数据的电子表格的副本!

那么,该怎么办?

假设您正在使用触发器函数来处理表单响应。

function handleForm( event ) {
   ...
}

如果您只需要处理“当前表单响应”,则应使用传递给触发器的事件信息,而不是阅读电子表格或查询表单响应。阅读Understanding Events以查看为您正在处理的特定触发类型提供的事件信息。 (增加了奖励:使用event参数可以使您无需调用服务API,从而使您的功能更快。)

function handleForm( event ) {
   var formResponse = event.response;  // The response that triggered this
                                       // function is in the event
   ...
}

我建议你也看看“How can I test a trigger function in GAS?”。