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);
}
在鎖定服務停用的情況下,如果兩位使用者在大約同時提交表單的情況下,最後收到的表單編號可能會相同,這是因為在從 ScriptProperties 讀取到新值之前,lastTicketNumber 屬性可能會變更。

方法

方法傳回類型簡短說明
hasLock()Boolean如果收購鎖定,則傳回 true。
releaseLock()void放開鎖定,讓其他等待鎖定的程序繼續。
tryLock(timeoutInMillis)Boolean嘗試取得鎖定,在提供的毫秒數後逾時。
waitLock(timeoutInMillis)void嘗試取得鎖定,並在提供的毫秒數後出現例外狀況逾時。

內容詳盡的說明文件

hasLock()

如果收購鎖定,則傳回 true。如果從未呼叫 tryLock(timeoutInMillis)waitLock(timeoutInMillis)、在擷取鎖定前逾時,或是呼叫 releaseLock(),此方法就會傳回 false。

var lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

回攻員

Boolean - 如果收購鎖定,則為 true,否則傳回 false


releaseLock()

放開鎖定,讓其他等待鎖定的程序繼續。系統會在指令碼終止時自動釋放鎖定,但為了維持效率,當您不再需要某部分程式碼的專屬存取權時,最好盡快釋出鎖定。如果尚未取得鎖定,此方法就不會生效。

請注意,如果您使用的是試算表,應在釋放鎖定前呼叫 SheetApp.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 — 方法在取得鎖定前逾時