谷歌应用程序脚本:追加行电子表格,并得到最后一行



我有一个新的谷歌应用程序脚本项目,其中包括一个表单(不是谷歌表单),允许用户输入数据。数据将被提交并插入到Google电子表格中。

我想给每个用户一个唯一的ID,最后一行+ 1。我尝试了如下代码:

function submitData(data){
  var user_id = sheet.getLastRow();
  sheet.appendRow([user_id, data.name, data.email]);
  return user_id;
}

问题是当两个用户同时提交表单时,他们将获得相同的user_id。我认为可能的原因是它们都在其中一个调用appendRow()之前调用了getLastRow()

我试图使用LockService,但新行覆盖旧行:

var COLUMN_USER_ID = 1;
var COLUMN_NAME = 2;
var COLUMN_EMAIL = 3;
function submitData(data){
  var lock = LockService.getPublicLock();
  if (lock.tryLock(10000))  {
    var newRow = sheet.getLastRow() + 1;
    var user_id = newRow - 1;
    sheet.getRange(newRow, COLUMN_USER_ID).setValue(user_id);
    sheet.getRange(newRow, COLUMN_NAME).setValue(data.name);
    sheet.getRange(newRow, COLUMN_EMAIL).setValue(data.email);
    lock.releaseLock();
    return user_id;
  } else {
    return "Lock Timeout";
  }
}

似乎即使在调用setValue()之后,getLastRow()仍然返回插入值之前的旧值。我猜这是因为这是一个异步调用?

非常感谢!

您的实际问题是您在释放锁之前没有调用电子表格ap .flush()。这就是为什么你的锁坏了。

这实际上是在文档中提到的lock. releaselock(),但在我看来,它应该由锁自动完成(目前不是)。https://developers.google.com/apps-script/reference/lock/lock releaseLock ()

最新更新