【发布时间】:2017-04-05 06:47:30
【问题描述】:
代码摘要
我有一个特定域内大约 80 个用户使用的 Google Apps 脚本项目,但是该应用程序由我执行(即Publish > Deploy as web app > Execute the app as: Me)。
脚本的功能之一是从自定义表单(使用HTML Service)填充 Google 表格,然后通知我自己和提交用户(通过使用简单的登录系统和 cookie 来识别)。
它已经正常工作了大约 6 个月,但是有 1-2 次通知电子邮件已发送但 Google 表格条目未出现。
我认为这可能是由于同时使用了脚本(因为两封通知电子邮件具有相同的时间戳)并且最近了解到 Lock Service。
我使用这篇文章来确保我对Lock 以及如何实现它有正确的理解,以防止由于并发脚本使用而导致条目没有出现在 Google 表格中。
实施
我的场景的伪代码是:
代码.gs
var active_spreadsheet = SpreadsheetApp.openById("bbb");
// BEGIN - start lock here
var lock = LockService.getScriptLock();
try {
lock.waitLock(30000); // wait 30 seconds for others' use of the code section and lock to stop and then proceed
} catch (e) {
Logger.log('Could not obtain lock after 30 seconds.');
}
var active_sheet = active_spreadsheet.getSheetByName("ENTRIES");
var new_start_row = active_sheet.getLastRow() + 1;
// Do lots of stuff - ie apply dynamic background colors based on previous entries colors, define the target range and set values, set data validations
SpreadsheetApp.flush(); // applies all pending spreadsheet changes
lock.releaseLock();
// END - end lock here
return;
问题
01)LockService、getScriptLock()、waitLock()和releaseLock()的实现是否正确?
02) 是否推荐使用SpreadsheetApp.flush(),如果是,上面的实现是否正确?
术语(供参考)
来自:https://developers.google.com/apps-script/reference/lock
Lock:
互斥锁的表示。
LockService:
防止对代码段的并发访问。
Lock 类有 4 个方法:
hasLock()
布尔值,如果获得锁则返回真。
releaseLock()
void, 释放锁,允许其他等待锁的进程继续。
tryLock(timeoutInMillis)
布尔值,尝试获取锁,在提供的毫秒数后超时。
waitLock(timeoutInMillis)
void, 尝试获取锁,在提供的毫秒数后超时并出现异常。
LockService 类有 3 个方法:
getDocumentLock()
Lock,获取一个锁,防止当前文档的任何用户同时运行一段代码。
getScriptLock()
Lock,获取一个锁,防止任何用户同时运行一段代码。
getUserLock()
Lock,获取一个锁,防止当前用户同时运行一段代码。
【问题讨论】:
-
你忽略了锁异常。错了。
标签: google-apps-script locking