Class Lock

ロック

相互除外ロックの表現。

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

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

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Release the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
LockService を使用しないと、2 人のユーザーがほぼ同時にフォームを送信すると、チケット番号が同じになる場合があります。これは、lastTicketNumber プロパティが ScriptProperties から読み取られた後、新しい値が書き戻される前に変更される可能性があるためです。

Methods

方法戻り値の型概要
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()

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

スプレッドシートで作業している場合、ロックを解除する前に スプレッドシート App.flush() を呼び出して、保留中のすべての変更をスプレッドシートに commit し、排他的アクセスを保持する必要があります。

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 - ロックを取得する前にメソッドがタイムアウトした場合