使用 UrlFetchApp 写入 Google 电子表格时锁定服务
Lock Service when using UrlFetchApp to write to Google spreadsheet
我没有找到关于此问题的 SO 帖子。我不清楚 Lock Service 在写入 spreadsheet with UrlFetchApp.
时有什么作用
我问的是关于预防问题——而不是关于当前正在发生的问题(我不知道如何充分模拟)。 Lock Service 是否应该与 UrlFetchApp 的“put”方法一起使用以写入 Google spreadsheet 以防止同一脚本的近并发用户覆盖?如果是这样,基本代码语法是否正确,如下所述?
第二个问题:我没有看到 UrlFetch 的“SpreadsheetApp.flush()”类型命令的选项,以在释放锁定之前应用所有未决的传播sheet 更改。 UrlFetchApp 是否确保所有 sheet 更改在返回之前完成?
同样,现在使用 UrlFetchApp 写入 spreadsheet 没有问题——问题是关于防止数据丢失或覆盖几乎并发执行的代码。
var lock = LockService.getScriptLock();
try {
lock.waitLock(15000); // wait 15 seconds for others' use of the code section and
lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 15 seconds.');
return "Error: Server busy try again later."
}
var url= `https://sheets.googleapis.com/v4/spreadsheets/${ssID}/values/${postRange}?valueInputOption=RAW`;
var options = {
muteHttpExceptions: true,
contentType: 'application/json',
method: 'put',
payload: JSON.stringify(data), data
headers: { Authorization: 'Bearer ' + clientToken }
};
var response= UrlFetchApp.fetch(url,options);
lock.releaseLock();
// END - end lock here
- 使用 LockService itself seems to be fine for your code. You could also consider using tryLock 而不是
waitLock
,如您所愿。
- 如果您没有特殊原因不这样做,我建议您使用 Spreadsheet Service or the Advanced Sheets Service 而不是
UrlFetchApp
。它会简化您的代码。
- 当
UrlFetchApp
returns时,API请求已经完成。所有 sheet 更改都应该在那时完成。如果您想在进行更新的同一脚本中使用更新后的数据,flush 仅在 Apps 脚本服务的上下文中才有意义,因为脚本可能不会应用 spreadsheet 更改直到它结束.
我没有找到关于此问题的 SO 帖子。我不清楚 Lock Service 在写入 spreadsheet with UrlFetchApp.
时有什么作用我问的是关于预防问题——而不是关于当前正在发生的问题(我不知道如何充分模拟)。 Lock Service 是否应该与 UrlFetchApp 的“put”方法一起使用以写入 Google spreadsheet 以防止同一脚本的近并发用户覆盖?如果是这样,基本代码语法是否正确,如下所述?
第二个问题:我没有看到 UrlFetch 的“SpreadsheetApp.flush()”类型命令的选项,以在释放锁定之前应用所有未决的传播sheet 更改。 UrlFetchApp 是否确保所有 sheet 更改在返回之前完成?
同样,现在使用 UrlFetchApp 写入 spreadsheet 没有问题——问题是关于防止数据丢失或覆盖几乎并发执行的代码。
var lock = LockService.getScriptLock();
try {
lock.waitLock(15000); // wait 15 seconds for others' use of the code section and
lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 15 seconds.');
return "Error: Server busy try again later."
}
var url= `https://sheets.googleapis.com/v4/spreadsheets/${ssID}/values/${postRange}?valueInputOption=RAW`;
var options = {
muteHttpExceptions: true,
contentType: 'application/json',
method: 'put',
payload: JSON.stringify(data), data
headers: { Authorization: 'Bearer ' + clientToken }
};
var response= UrlFetchApp.fetch(url,options);
lock.releaseLock();
// END - end lock here
- 使用 LockService itself seems to be fine for your code. You could also consider using tryLock 而不是
waitLock
,如您所愿。 - 如果您没有特殊原因不这样做,我建议您使用 Spreadsheet Service or the Advanced Sheets Service 而不是
UrlFetchApp
。它会简化您的代码。 - 当
UrlFetchApp
returns时,API请求已经完成。所有 sheet 更改都应该在那时完成。如果您想在进行更新的同一脚本中使用更新后的数据,flush 仅在 Apps 脚本服务的上下文中才有意义,因为脚本可能不会应用 spreadsheet 更改直到它结束.