【发布时间】:2021-08-08 11:07:08
【问题描述】:
希望能得到您的帮助,因为这个问题对我来说是非标准的,经过多次尝试都无法解决。
问题
我有一个标准的函数来接收 POST 请求,她可以在小批量上稳定运行,示例代码:
let sheet = SpreadSheet.getSheetByName("name")
let dateTime = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyy HH:mm:ss") // Moscow time
<...>
function doPost(e) {
sheet.insertRowBefore(2) // adds a line before the second one
sheet.getRange(2, 1).setValue(e.parameter.par1)
sheet.getRange(2, 2).setValue(dateTime)
sheet.getRange(2, 3).setValue(e.parameter.par2)
sheet.getRange(2, 4).setValue(e.parameter.par3)
sheet.getRange(2, 5).setValue(e.parameter.par4)
}
在表格中如下所示:Example
本质上,函数必须同步执行,稳定工作,但是当函数接收到大量请求时(1-10秒大约140个),它可以一次创建两行,同一秒写入两次数据排。结果,对于 140 个查询,表中有大约 4 个空行,其中的数据丢失了
错误添加的空字符串如下所示:Example
尝试解决
为了防止两个脚本同时运行,我使用了 google apps 脚本中的 LockService 功能,我的代码开始如下所示:
let sheet = SpreadSheet.getSheetByName("name")
let dateTime = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyy HH:mm:ss") // Moscow time
var lock = LockService.getScriptLock() // LockService
<...>
function doPost(e) {
if (lock.tryLock(30000)) { // waiting for a queue 30 seconds
sheet.insertRowBefore(2) // adds a line before the second one
sheet.getRange(2, 1).setValue(e.parameter.par1)
sheet.getRange(2, 2).setValue(dateTime)
sheet.getRange(2, 3).setValue(e.parameter.par2)
sheet.getRange(2, 4).setValue(e.parameter.par3)
sheet.getRange(2, 5).setValue(e.parameter.par4)
lock.releaseLock() // unblocking
}
}
我尝试了不同的队列等待时间,但都没有成功。函数继续留空行
我请求您的帮助,因为我已经为这个问题困惑了很长时间。该怎么办?如有任何信息,我将不胜感激
【问题讨论】:
标签: javascript google-apps-script