Google Apps脚本:将行附加到电子表格并获取最后一行

时间:2015-08-03 04:37:41

标签: google-apps-script google-sheets locking

我有一个新的Google App Script项目,其中包含一个允许用户输入数据的表单(不是Google表单)。数据将被提交并插入Google电子表格。

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

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

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

我尝试使用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()仍会在插入值之前返回旧值。我猜这是因为这是一个异步调用?

非常感谢!

1 个答案:

答案 0 :(得分:2)

你的实际问题是你在释放锁之前没有调用SpreadsheetAp.flush()。这就是为什么你的锁没有工作。

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