Class Lock

锁定

互斥锁的表示形式。

通过该类,脚本可以确保只有一个脚本实例执行指定的 一段代码。这对于回调和触发器特别有用,因为此时用户 操作可能会导致对共享资源进行更改,并且您希望确保 冲突。

以下示例展示了如何在表单提交处理程序中使用锁。

// 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.');
}

参数

名称类型说明
timeoutInMillisInteger需要等待多长时间才能获取锁(以毫秒为单位)

返回

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.');
}

参数

名称类型说明
timeoutInMillisInteger需要等待多长时间才能获取锁(以毫秒为单位)

抛出

Error - 如果方法在获取锁之前超时