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

cmd*_*een 5 google-apps-script google-forms

我想知道这是否与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);
Run Code Online (Sandbox Code Playgroud)

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

var form2 = FormApp.getActiveForm();
var formResponses2 = form2.getResponses();
Logger.log('end length: ' + formResponses2.length);
Run Code Online (Sandbox Code Playgroud)

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

有没有其他人遇到类似的东西?

Mog*_*dad 7

当服务器繁忙时,这些竞争条件将变得更加明显,但它们只是云计算的常规操作.简而言之,文档的每个用户都有该文档的视图(副本),不能保证它始终与"主版本"相同.查看电子表格时,您正在查看自己的电子表格副本.您的协作者可能正在查看自己的副本.实际上,访问"电子表格"的触发器功能也将被赋予其自己的副本.所做的更改在任何地方需要同步无处不在,而这需要时间.

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

那么该怎么办?

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

function handleForm( event ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

我建议你也看看" 如何在GAS中测试触发功能? ".