谷歌应用脚本:向电子表格追加行并获取最后一行

4

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

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

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

问题在于当两个用户同时提交表单时,他们将得到相同的用户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()仍然返回插入值之前的旧值。我猜测这是因为这是一个异步调用吗?
非常感谢!

你的脚本是在表单还是响应表中?你可以使用表单响应表来获取最新的条目,因为它会在表单提交后立即更新。 - Akshin Jalilov
@AkshinJalilov 感谢您的回复。不,这不是Google表单。这是一个新的Google应用脚本项目,其中实现了许多功能,将Google电子表格视为数据库。此外,Google表单不支持在提交表单后向客户端返回动态值。 - user3545752
哦,当你说“表格”时,我以为你是指谷歌表格。解决问题的一种方法是使用属性服务将最新的ID记录为文档属性。这比追加行要快得多,并且在另一个用户同时运行它时会被正确地提取。 - Akshin Jalilov
@AkshinJalilov 感谢您的回复!但是,如果我删除电子表格中的某些行,则记录的值不会被重置。我需要严格遵守电子表格中的最后一行。有没有什么方法可以实现这一点? - user3545752
1个回答

7

非常感谢!这正是我所需要的。flush() 确保在释放锁之前 setValue() 已经运行。 - user3545752

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接