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

メソッド

メソッド戻り値の型概要
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() を呼び出して、スプレッドシートへの排他的アクセス権がまだある間に、保留中のすべての変更をスプレッドシートに commit する必要があります。

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)

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

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

パラメータ

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

例外

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