google 电子表格在追加新行时出现错误

google spreadsheets bug during appending new rows

脚本必须将有关调用详细信息的回发信息从 zvonok.com 记录到 google 电子表格。我有只将行追加到电子表格的函数 - 没有更新或修改 代码中的任何单元格,并且在少数手动测试调用期间,行已追加正确,但是当我的客户开始他通常的调用时活动、电话和回发经常接连发生,最后一行的值开始变化几次,在某些情况下会留下奇怪的值

第一次看到这样的行为做短视频记录: https://youtu.be/0_H_mVAbp4g

这里有一列有奇怪的值

我从 248 行中找到了 9 个案例。 客户从他的用户柜中向我展示了 excel,总共进行了 5649 次调用,因此在 google 电子表格中必须是 5649 行而不是 248 行。

function getJsonFromUrl(url) {
  var query = url;
  var result = {};
  if (query == undefined){ 
     return result;
}
  query.split("&").forEach(function(part) {
    var item = part.split("=");
    result[item[0]] = decodeURIComponent(item[1]);
  });
  return result;
}
function doGet(e){
  const ctCompl = 'ct_completed';
  var doc = SpreadsheetApp.openById(SHEET_KEY);
  var sheet = doc.getSheetByName(SHEET_NAME);
  var row = [];  
  if(typeof e !== undefined){
     mArr =  getJsonFromUrl(e.queryString);            
    for (i in mArr) if( i == ctCompl) {
      row.push(convTimeLong(mArr[i]));
    } else
        row.push(mArr[i]);
     sheet.appendRow(row); 
     } else {
     sheet.appendRow(['e undefined!']); 
    }
  SpreadsheetApp.flush();
  return handleResponse(e)
}
function convTimeLong(dateTime) {  
  let  d = new Date();  
  let  dt=dateTime.replace('+', 'T'); 
    try { 
      var res = Utilities.formatDate(d,"GMT+2", "dd.MM.yyyy HH:mm");
      return res
        } catch(e){
    return  dateTime;  } 
}

执行仪表板到处显示状态“已完成”,执行时间最长 - 1.688 秒 客户已将两次通话之间的延迟设置为 5 秒,现在我不知道是否设置延迟后回发丢失的百分比有所降低,但它仍然很高。

https://youtu.be/0_H_mVAbp4g

一般来说,使用 Google 表格作为数据库不是一个好主意。它不是为此而设计的,所以它可能会非常糟糕。使用适当的数据库将使一切变得非常容易。如果您使用 spreadsheet 来处理数据,我建议您使用导入数据的函数,例如 IMPORTXML (see reference).

话虽如此,如果您坚持使用表格,您可以尝试使用锁:

function appendRow(sheet, row) {
  const lock = LockService.getScriptLock()
  while (!lock.tryLock(100000)) /* Spin the lock until it gets aquired */;
  try {
    sheet.appendRow(row)
    SpreadsheetApp.flush()
  } finally {
    lock.releaseLock()
  }
}

要使用它,您只需传递 sheet 和要添加的值:sheet.appendRow(row)appendRow(sheet, row)

它将确保条目不会被覆盖。请注意,这会大大降低代码速度,如果有很多请求,脚本可能会超时。