首页 > 解决方案 > 有没有办法缓存 doPost 请求?

问题描述

我有一个函数可以展平 JSON 对象的内容 [function 'parser'] 和另一个将展平的结果粘贴到 Google Sheet [function 'writePayload'] 的最后一行。这些函数中的每一个都在 doPost(e) 中调用,如下所示:

function doPost(e){
  var data = e.postData.contents;
  var output = parser(data);
  writePayload(output);
  return ContentService.createTextOutput('ok');
}

我面临的挑战是我偶尔会在这么短的时间内收到 post 请求,writePayload 函数会覆盖第一个有效负载的内容。writePayload 函数查找工作表的最后一行,然后从最后一行开始粘贴内容。当在短时间内发布帖子时,两个有效负载将从同一行开始写入,从而导致一些数据丢失。

当快速连续发出发布请求时,是否可以使用计时器或缓存功能来防止数据被覆盖?

标签: google-apps-scriptgoogle-sheets

解决方案


建议

有关Cooper在评论中提到的有关锁定服务的更多上下文,也许您可​​以尝试以下示例锁定服务方法:

此脚本源自类似的帖子答案我可以在两个函数中使用 LockService 吗?

function mainFunction() {
  functionOne(); //run for 30 seconds
  functionTwo(); //run for 30 seconds
}

function functionOne(){
    var lock = LockService.getScriptLock();
  try {
    lock.waitLock(5000); // Tries for at most 5 seconds to get the lock
    Utilities.sleep(30000); // e.g. run for 30 seconds
    Logger.log("Function 1  has finished running at: " + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "HH:mm:ss"));
  } catch (e) {
    Logger.log('function 1 could not obtain lock after 5 seconds.');
  }
}

function functionTwo(){
    var lock = LockService.getScriptLock();
  try {
    lock.waitLock(5000);
    Utilities.sleep(30000); // e.g. run for 30 seconds
    Logger.log("Function 2 has finished running at: " + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "HH:mm:ss"));
  } catch (e) {
    Logger.log('function 2 could not obtain lock after 5 seconds.');
  }
}

日志结果:

在此处输入图像描述

2个函数运行时间相差30秒


推荐阅读