Google apps script Google应用程序脚本:将行附加到电子表格并获取最后一行
我有一个新的谷歌应用程序脚本项目,其中包括一个允许用户输入数据的表单(不是谷歌表单)。数据将被提交并插入谷歌电子表格 我想给每个用户一个唯一的ID,即最后一行+1。我尝试了以下代码: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; } 问题是,当两个用户同时提交表单时,他们将获
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()
。