Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script Google应用程序脚本:将行附加到电子表格并获取最后一行_Google Apps Script_Google Sheets_Locking - Fatal编程技术网

Google apps script Google应用程序脚本:将行附加到电子表格并获取最后一行

Google apps script Google应用程序脚本:将行附加到电子表格并获取最后一行,google-apps-script,google-sheets,locking,Google Apps Script,Google Sheets,Locking,我有一个新的谷歌应用程序脚本项目,其中包括一个允许用户输入数据的表单(不是谷歌表单)。数据将被提交并插入谷歌电子表格 我想给每个用户一个唯一的ID,即最后一行+1。我尝试了以下代码: function submitData(data){ var user_id = sheet.getLastRow(); sheet.appendRow([user_id, data.name, data.email]); return user_id; } 问题是,当两个用户同时提交表单时,他们将获

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

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

function submitData(data){
  var user_id = sheet.getLastRow();
  sheet.appendRow([user_id, data.name, data.email]);
  return user_id;
}
问题是,当两个用户同时提交表单时,他们将获得相同的用户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()
仍然会在插入值之前返回旧值。我猜这是因为这是一个异步调用


多谢各位

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

这实际上是文档中提到的lock.releaseLock()的一个例子,但我认为它应该由锁自动完成(目前不是这样)。

您的脚本是表单还是响应表?您可以使用表单响应表获取最新条目,因为它将在表单提交后立即更新。@AkshinJalilov感谢您的回复。不,它不是谷歌表单。这是一个新的谷歌应用程序脚本项目,它实现了许多功能,将谷歌电子表格视为一个数据库。此外,谷歌表单不支持在提交表单后向客户端返回动态值。哦,当你说“表单”时,我想你指的是谷歌表单。解决问题的一种方法是使用将最新ID记录为文档属性。这将比追加行快得多,并且当其他用户同时运行它时,将正确地拉出该行。@AkshinJalilov感谢您的回复!但是,如果我删除电子表格中的一些行,记录的值将不会重置。我需要严格遵守电子表格中的最后一行。有什么方法可以做到这一点吗?非常感谢!这正是我需要的。
flush()
确保在释放锁之前运行
setValue()