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"触发器触发后记录最新响应.
有没有其他人遇到类似的东西?
当服务器繁忙时,这些竞争条件将变得更加明显,但它们只是云计算的常规操作.简而言之,文档的每个用户都有该文档的视图(副本),不能保证它始终与"主版本"相同.查看电子表格时,您正在查看自己的电子表格副本.您的协作者可能正在查看自己的副本.实际上,访问"电子表格"的触发器功能也将被赋予其自己的副本.所做的更改在任何地方需要同步无处不在,而这需要时间.
在这种情况下,您的代码表明您在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中测试触发功能? ".
| 归档时间: |
|
| 查看次数: |
3673 次 |
| 最近记录: |