×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


Googleを追いかけろ!

.

参照ページ(Goolge)


WWW を検索 Googleを追いかけろ! を検索
このクラスではスクリプト内のひとつのインスタンスだけがコードの特定のセッションを実行していることを確認できます。 ユーザーのアクションが外部リソース(スプレッドシートやドキュメント等)の変更を引き起こすような”UiApps”や”onFormSubmit”トリガーの確認などに利用できるでしょう。 変更はお互いに混在されませんが、分割できないものとして行われます。

function onFormSubmit(e) {
  // Multiple scripts can run this at the same time since they're not modifying any shared resource
  var username = e.values[0];
  var date = e.values[1];
  var sheet = SpreadsheetApp.openById('id of my target spreadsheet');

  // get the lock, because we're now modifying the shared resource
  var lock = LockService.getPublicLock();
  lock.waitLock(30000);
  var dataRange = sheet.getDataRange();
  var lastRow = dataRange.getLastRow();
  var newRow = sheet.getRange(lastRow + 1, 1);
  newRow.setValue("foo " + username + " " + date);

  // clean up and release the lock
  lock.release();
}

上の例でロックサービスのない状態を考えます。もし二人のユーザーがほぼ同時にフォームを送信した場合、スプレッドシートには時としてどちらか片方の送信内容しか含まれません。 なぜなら、getLastRowへの呼び出しは両方の発信者に同じ値を返してしまうからです。送信者にはシートがまだ更新されていない旨の内容が返ります。

class Lock : Members
memberType説明
tryLockBoolean相互排他ロックの取得を試みる。不可能な場合の戻り値はfalse。ロックが既に取得されている場合は事実上何もしない。
waitLock相互排他ロックの取得を試みる。不可能な場合はエラーをスローする。ロックが既に取得されている場合は事実上何もしない。
hasLockBooleanロックオブジェクトが現在ロックを保持しているかをテストする
releaseLockロックを解放する。ロックで待機中の他のスレッドが実行できるように許可する



tryLock(timeoutInMilliseconds)

  • 相互排他ロックの取得を試みる。不可能な場合の戻り値はfalse。ロックが既に取得されている場合は事実上何もしない。
Arguments :
nameType説明
timeoutInMillisecondsint ロックを取得するために待機する時間(ミリ秒)
戻り値 :
Type説明
Boolean ロックが取得されていればtrue、その他の場合はfalse
サンプル :
// Get a public lock, try to get exclusion, waiting a maximum of 10 seconds (10000ms)
var lock = LockService.getPublicLock();
var hasMutex = lock.tryLock(10000);

waitLock(timeoutInMilliseconds)

  • 相互排他ロックの取得を試みる。不可能な場合はエラーをスローする。ロックが既に取得されている場合は事実上何もしない。
Arguments :
nameType説明
timeoutInMillisecondsint ロックを取得するために待機する時間(ミリ秒)
サンプル :
// Get a public lock, try to get exclusion, waiting a maximum of 10 seconds (10000ms)
var lock = LockService.getPublicLock();
lock.waitLock(10000);   // throws an error if lock could not be obtained

hasLock()

  • ロックオブジェクトが現在ロックを保持しているかをテストする
戻り値 :
Type説明
Boolean ロックオブジェクトが相互排他ロックを保持している場合はtrue
サンプル :
var lock = LockService.getPublicLock();
if (lock.hasLock()) {
  // opportunistically do stuff here because I have it
  // or acquire the lock if necessary
}

releaseLock()

  • ロックを解放する。ロックで待機中の他のスレッドが実行できるように許可する

    スクリプトが終了するとロックは解放されます。効率のためにはコードセクションへの排他的アクセスが不要になった時点で直ぐに解放するのが最適です。 スプレッドシートで作業中の場合は以下の点に注意してください。 まだ排他アクセス権を持っている間はスプレッドシート内のすべての保留中の変更を確定する前にロックを解除するSpreadsheetApp.flush()を呼び出す必要があります。

サンプル :
// Get a public lock, read a spreadsheet value, increment it, write out the new value, and then release the lock
var doc = SpreadsheetApp.getActiveSpreadsheet();
var cell = doc.getRange('a1');
var lock = LockService.getPublicLock();
lock.waitLock(20000);
cell.setValue(Number(cell.getValue()) + 1);
SpreadsheetApp.flush();
lock.releaseLock();