互斥锁的表示形式。
此类可让脚本确保一次只有一个脚本实例执行给定的代码部分。这对于回调和触发器尤其有用,因为用户操作可能会导致共享资源发生变化,而您希望确保不会发生冲突。
以下示例展示了如何在表单提交处理程序中使用锁。
// Generates a unique ticket number for every form submission. function onFormSubmit(e) { const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1); // Gets a script lock before modifying a shared resource. const lock = LockService.getScriptLock(); // Waits for up to 30 seconds for other processes to finish. lock.waitLock(30000); const scriptProperties = PropertiesService.getScriptProperties(); const ticketNumber = Number(scriptProperties.getProperty('lastTicketNumber')) + 1; scriptProperties.setProperty('lastTicketNumber', ticketNumber); // Releases the lock so that other processes can continue. lock.releaseLock(); targetCell.setValue(ticketNumber); }
last Ticket Number 属性可能会在从 Script Properties 读取后但在写回新值之前发生更改。方法
| 方法 | 返回类型 | 简介 |
|---|---|---|
has | Boolean | 如果已获取锁,则返回 true。 |
release | void | 释放锁,允许等待锁的其他进程继续运行。 |
try | Boolean | 尝试获取锁,在提供的毫秒数后超时。 |
wait | void | 尝试获取锁,在指定毫秒数后超时并抛出异常。 |
详细文档
has Lock()
如果已获取锁,则返回 true。如果从未调用过 try 或 wait,在检索到锁之前超时,或者调用了 release,此方法会返回 false。
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
返回
Boolean - 如果已获取锁,则为 true;否则为 false。
release Lock()
释放锁,允许等待锁的其他进程继续运行。脚本终止时,锁会自动释放,但为了提高效率,最好在不再需要对某段代码进行独占访问时立即释放锁。如果尚未获取锁,则此方法不会产生任何效果。
请注意,如果您正在处理电子表格,则应在释放锁之前调用 SpreadsheetApp.flush(),以便在您仍具有对电子表格的独占访问权限时提交所有待处理的更改。
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
尝试获取锁,在提供的毫秒数后超时。如果已获取锁,则此方法不会产生任何影响。
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
参数
| 名称 | 类型 | 说明 |
|---|---|---|
timeout | Integer | 等待获取锁的时间(以毫秒为单位)。 |
返回
Boolean - 如果已获取锁,则为 true;否则为 false。
wait Lock(timeoutInMillis)
尝试获取锁,在提供的毫秒数后超时并出现异常。此方法与 try 相同,只是在无法获取锁定时会抛出异常,而不是返回 false。
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
参数
| 名称 | 类型 | 说明 |
|---|---|---|
timeout | Integer | 等待获取锁的时间(以毫秒为单位)。 |
抛出
Error - 如果方法在获取锁之前超时