Class Lock

ロック

相互排他ロックの表現。

このクラスを使用すると、スクリプトは、一度に 1 つのスクリプト インスタンスのみがコードの特定のセクションを実行するようにできます。これは、ユーザー アクションによって共有リソースが変更される可能性があり、競合が発生しないようにする必要があるコールバックやトリガーで特に役立ちます。

次の例は、フォーム送信ハンドラでロックを使用する方法を示しています。

// 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);
}
Lock サービスを使用しない場合、2 人のユーザーがほぼ同時にフォームを送信すると、ScriptProperties から読み取られた後、新しい値が書き戻される前に lastTicketNumber プロパティが変更される可能性があるため、チケット番号が同じになる可能性があります。

メソッド

メソッド戻り値の型概要
hasLock()Booleanロックが取得された場合は true を返します。
releaseLock()voidロックを解放し、ロックを待機している他のプロセスが続行できるようにします。
tryLock(timeoutInMillis)Booleanロックの取得を試行し、指定されたミリ秒後にタイムアウトします。
waitLock(timeoutInMillis)voidロックの取得を試み、指定されたミリ秒後に例外でタイムアウトします。

詳細なドキュメント

hasLock()

ロックが取得された場合は true を返します。tryLock(timeoutInMillis) または waitLock(timeoutInMillis) が呼び出されなかった場合、ロックを取得する前にタイムアウトした場合、または releaseLock() が呼び出された場合、このメソッドは false を返します。

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

戻る

Boolean - ロックが取得された場合は true、それ以外の場合は false


releaseLock()

ロックを解放し、ロックを待機している他のプロセスが続行できるようにします。スクリプトが終了するとロックは自動的に解除されますが、効率を高めるには、コードのセクションへの排他アクセスが不要になったらすぐに解除することをおすすめします。ロックが取得されていない場合、このメソッドは効果を生じさせません。

スプレッドシートを操作している場合は、ロックを解除する前に SpreadsheetApp.flush() を呼び出して、スプレッドシートへの排他的アクセス権がある間に保留中の変更をすべてスプレッドシートにコミットする必要があります。

const lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

ロックの取得を試行し、指定されたミリ秒後にタイムアウトします。ロックがすでに取得されている場合、このメソッドは効果を生じさせません。

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

パラメータ

名前説明
timeoutInMillisIntegerロックを取得するまでの待機時間(ミリ秒単位)。

戻る

Boolean - ロックが取得された場合は true、それ以外の場合は false


waitLock(timeoutInMillis)

ロックの取得を試み、指定されたミリ秒後に例外でタイムアウトします。このメソッドは、false を返す代わりに、ロックを取得できなかった場合に例外をスローする点を除き、tryLock(timeoutInMillis) と同じです。

const lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

パラメータ

名前説明
timeoutInMillisIntegerロックを取得するまでの待機時間(ミリ秒単位)。

例外

Error - ロックが取得される前にメソッドがタイムアウトした場合