雙向排除鎖定的表示。
這個類別可讓指令碼確保一次只能執行一個指令碼的執行個體。這對於回呼和觸發條件特別實用,因為使用者動作可能會導致共用資源發生變更,而您想要確保不會發生衝突。
以下範例說明如何在表單提交處理常式中使用鎖定。
// 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.'); }
參數
名稱 | 類型 | 說明 |
---|---|---|
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
— 方法在取得鎖定前逾時