Class Lock

Sperren

Darstellung einer Sperre für gegenseitigen Ausschluss.

Mit dieser Klasse können Skripts dafür sorgen, dass nur eine Instanz des Skripts eine bestimmte im Codeabschnitt nacheinander ab. Dies ist besonders nützlich für Callbacks und Trigger, bei denen ein Nutzer Maßnahme können zu Änderungen an einer freigegebenen Ressource führen und Sie möchten sicherstellen, dass keine Kollisionen.

Das folgende Beispiel zeigt, wie eine Sperre in einem Formularübermittlungs-Handler verwendet wird.

// 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);
}
Wenn zwei Nutzer das Formular ohne den Schlossdienst ungefähr zur gleichen Zeit senden, wird das Ticket können die Zahlen am Ende identisch sein, da sich die Eigenschaft lastTicketNumber danach ändern könnte. wurde aus ScriptProperties gelesen, aber bevor der neue Wert zurückgeschrieben wurde.

Methoden

MethodeRückgabetypKurzbeschreibung
hasLock()BooleanGibt "true" zurück, wenn die Sperre abgerufen wurde.
releaseLock()voidGibt die Sperre frei, sodass andere Prozesse, die auf die Sperre warten, fortgesetzt werden können.
tryLock(timeoutInMillis)BooleanVersucht, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt.
waitLock(timeoutInMillis)voidVersuche, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden.

Detaillierte Dokumentation

hasLock()

Gibt "true" zurück, wenn die Sperre abgerufen wurde. Diese Methode gibt "false" zurück, wenn tryLock(timeoutInMillis) oder waitLock(timeoutInMillis) wurden nie angerufen, es kam zu einer Zeitüberschreitung, bevor die Sperre abgerufen werden konnte, oder wenn releaseLock() aufgerufen wurde.

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

Rückflug

Boolean – „true“, wenn die Sperre abgerufen wurde, andernfalls „false“


releaseLock()

Gibt die Sperre frei, sodass andere Prozesse, die auf die Sperre warten, fortgesetzt werden können. Das Schloss ist wird automatisch freigegeben, wenn das Skript beendet wird. Aus Effizienzgründen ist es jedoch am besten, es wieder freizugeben. sobald Sie keinen exklusiven Zugriff mehr auf einen Code-Abschnitt benötigen. Diese Methode hat keine Auswirkungen wenn das Schloss nicht erworben wurde.

Wenn Sie mit einer Tabellenkalkulation arbeiten, sollten Sie „TableApp.Flush()“ aufrufen. vor dem Aufheben der Sperre, um alle ausstehenden Änderungen in die Tabelle zu übernehmen, während Sie exklusiven Zugriff darauf haben.

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

tryLock(timeoutInMillis)

Versucht, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden eine Zeitüberschreitung auftritt. Diese Methode hat keine Auswirkung, wenn die Sperre bereits eingerichtet wurde.

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

Parameter

NameTypBeschreibung
timeoutInMillisIntegerwie lange auf den Erhalt der Sperre gewartet werden soll, in Millisekunden

Rückflug

Boolean – „true“, wenn die Sperre abgerufen wurde, andernfalls „false“


waitLock(timeoutInMillis)

Versuche, die Sperre abzurufen, wobei nach der angegebenen Anzahl von Millisekunden. Diese Methode entspricht tryLock(timeoutInMillis), mit der Ausnahme, dass eine Ausnahme ausgelöst wird. wenn die Sperre nicht übernommen werden konnte, anstatt „false“ zurückzugeben.

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

Parameter

NameTypBeschreibung
timeoutInMillisIntegerwie lange auf den Erhalt der Sperre gewartet werden soll, in Millisekunden

Löst aus

Error – wenn bei der Methode vor dem Abrufen der Sperre eine Zeitüberschreitung aufgetreten ist