gpt4 book ai didi

google-apps-script - 如何每次在 Google Apps 脚本中正确使用 LockService?

转载 作者:行者123 更新时间:2023-12-05 05:10:08 25 4
gpt4 key购买 nike

我正在尝试避免在我的项目中使用 LockService 进行并发处理。

在测试运行中,LockService 对我来说没有任何问题。

但是当我推出我的项目时,有时 LockService 似乎无法正常工作并覆盖电子表格值。

我使用了 tryLock()hasLock() 方法来获取锁。

function test(array) {
var lock = LockService.getScriptLock();
if (lock.tryLock(500)) {
if (!lock.hasLock()) {
var message = "Another user is submitting form data. Please try again later.";
return message;
}
var ss = SpreadsheetApp.openById(outputId);
var sheet = ss.getSheetByName("sheet1");
var lastRow = sheet.getLastRow() + 1;
var range = sheet.getRange(lastRow, 1, 1, array[0].length);
range.setValues(array);
lock.releaseLock();
}
else {
var message = "Another user is submitting form data. Please try again later.";
return message;
}
}

我想避免在用户同时提交数据时在同一最后一行设置值。但有时它似乎覆盖了最后一行中的值,并且其中一个数组的值就消失了。

你能指出我代码的错误吗?

谢谢。

最佳答案

您应该了解 Lock Service 的各种行为。

  • tryLock(milliseconds to Wait)waitLock(milliseconds to Wait) 非常相似。一个区别是,waitLock() 会抛出错误,而 tryLock() 不会。这意味着您希望程序流程如何工作。您想立即捕获错误吗?您希望没有错误吗? (tryLock() 不会产生错误)您故意想要错误吗?您想要在客户端触发 withFailureHandler() 的 fatal error 吗?你想让整个堆栈都失败吗?您是否希望此功能完全停止,而只是此功能失败?您是否希望只有一行失败,而其余功能继续运行?

在您的情况下,运行函数中的其余行是没有意义的。

如果您使用 waitLock(milliseconds to Wait) 那么您应该有一些东西来捕捉错误。您的选择是:

  • 捕获该行的错误
  • 在该函数中的任何位置捕获错误
  • 不要捕获该函数中的错误

在您的情况下,您不希望运行函数的其余部分。

将错误隔离到一行的一个原因是允许其余代码运行,因为其余代码的结果仍然可以为用户提供一些有用的输出。但这不是你的情况。让该功能的其余部分运行,不会为用户提供额外的值(value)。

事实上,如果函数的任何部分失败,那么它应该停止运行。出于这个原因,我会将函数中的所有行都包装在 try/catch 中。

如果行:var lock = LockService.getScriptLock(); 失败怎么办?

如果该行失败,则 lock 将没有值。如果 lock 没有值,则无法释放锁。如果 var lock = LockService.getScriptLock(); 失败,则 lock.releaseLock(); 将失败。

这就是我使用的原因:

LockService.getScriptLock().releaseLock();

这就是为什么我不为锁使用变量。

有两种情况需要释放锁。

  • 代码成功完成
  • 代码失败

如果代码在获取锁时失败,那么您不希望代码在释放锁之前等待超时到期。如果有效期不是很长,那么这可能不是什么大问题。但是如果锁等待时间长了,那就是白白等待了。如果您的等待时间很短,那么在服务器运行缓慢的情况下,您会冒着锁在代码完成之前过期的风险。所以,我会给你的等待时间一点点填充,但不要太极端。如果您的锁被正确释放,那么等待时间比您需要的时间长一点应该不会有任何不良影响。如果在等待很长时间后获得了锁,但由于某种原因没有被释放,那么这与没有获得锁一样是个问题。

function myLockFunction() {
try {
//Your entire code inside the try block
LockService.getScriptLock().waitLock(milliseconds);//Throws exception if fail
} catch(e) {
LockService.getScriptLock().releaseLock();
}
}

关于google-apps-script - 如何每次在 Google Apps 脚本中正确使用 LockService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com