【问题标题】:The doPost function is executed twice (google apps script)doPost 函数执行两次(谷歌应用脚​​本)
【发布时间】: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


    【解决方案1】:

    请在setValue之前尝试flush()

    【讨论】:

    • 谢谢!!这有帮助,唯一的事情是我把flush() 不仅放在setValue 之前,而且放在之后
    【解决方案2】:

    除了flush(),我建议替换它:

    // 5 calls (get/set) to server
    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)
    

    用这个:

    // 1 call (get/set) to the server
    sheet.getRange(2,1,2,5).setValues([ 
      e.parameter.par1,
      dateTime,
      e.parameter.par2, 
      e.parameter.par3,
      e.parameter.par4
    ])
    

    最佳实践:Batch operations

    【讨论】:

    • 感谢您的编辑,确实改善了代码的结构,也帮助解决了问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多