Google Apps 脚本:将行附加到电子表格并获取最后一行
Google Apps Script: append row to spreadsheet and get last row
我有一个新的 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。我认为可能的原因是他们都在其中一个调用 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()
仍然是 returns 插入值之前的旧值。我猜这是因为这是一个异步调用?
非常感谢!
你的实际问题是你在释放锁之前没有调用 SpreadsheetAp.flush() 。这就是为什么你的锁不起作用。
这是 lock.releaseLock() 的文档中实际提到的,但在我看来它应该由锁自动完成(目前不是)。
https://developers.google.com/apps-script/reference/lock/lock#releaseLock()
我有一个新的 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。我认为可能的原因是他们都在其中一个调用 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()
仍然是 returns 插入值之前的旧值。我猜这是因为这是一个异步调用?
非常感谢!
你的实际问题是你在释放锁之前没有调用 SpreadsheetAp.flush() 。这就是为什么你的锁不起作用。
这是 lock.releaseLock() 的文档中实际提到的,但在我看来它应该由锁自动完成(目前不是)。 https://developers.google.com/apps-script/reference/lock/lock#releaseLock()