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);

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

メソッド

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

詳細なドキュメント

hasLock()

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

var 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 できます。 メンバーだけがアクセスできます。

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