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