Class Lock

Blocca

Una rappresentazione di un blocco di mutua esclusione.

Questa classe consente agli script di assicurarsi che una sola istanza dello script esegua un determinato sezione di codice alla volta. Ciò è particolarmente utile per i callback e gli attivatori, quando un utente potrebbe causare modifiche a una risorsa condivisa. Devi assicurarti che non siano presenti delle collisioni.

L'esempio seguente mostra come utilizzare un blocco in un gestore di invio di modulo.

// 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);
}
Senza il servizio Lock, se due utenti inviano il modulo più o meno contemporaneamente, il ticket numeri potrebbero avere lo stesso risultato, poiché la proprietà lastTicketNumber potrebbe cambiare dopo è stato letto da ScriptProperties ma prima che il nuovo valore venisse riscritto.

Metodi

MetodoTipo restituitoBreve descrizione
hasLock()BooleanRestituisce true se il blocco è stato acquisito.
releaseLock()voidRilascio della serratura, consentendo ad altri processi in attesa della serratura di continuare.
tryLock(timeoutInMillis)BooleanTenta di acquisire il blocco, con timeout dopo il numero di millisecondi specificato.
waitLock(timeoutInMillis)voidTenta di acquisire il blocco, timeout con un'eccezione dopo il numero fornito di millisecondi.

Documentazione dettagliata

hasLock()

Restituisce true se il blocco è stato acquisito. Questo metodo restituisce false se tryLock(timeoutInMillis) o Il numero waitLock(timeoutInMillis) non è mai stato chiamato, è scaduto prima che fosse possibile recuperare la serratura o se releaseLock() è stato chiamato.

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

Invio

Boolean: true se il blocco è stato acquisito, false negli altri casi


releaseLock()

Rilascio della serratura, consentendo ad altri processi in attesa della serratura di continuare. Il blocco è rilasciato automaticamente quando lo script termina, ma per l'efficienza è meglio rilasciarlo non appena non avrai più bisogno dell'accesso esclusivo a una sezione di codice. Questo metodo non ha alcun effetto se il blocco non è stato acquisito.

Tieni presente che se stai lavorando con un foglio di lavoro, devi chiamare FogliApp.flush() prima di rilasciare il blocco, per eseguire il commit di tutte le modifiche in sospeso nel foglio di lavoro vi hanno accesso esclusivo.

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

tryLock(timeoutInMillis)

Tenta di acquisire il blocco, con timeout dopo il numero di millisecondi specificato. Questo metodo non ha effetto se il blocco è già stato acquisito.

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

Parametri

NomeTipoDescrizione
timeoutInMillisIntegeril tempo di attesa per acquisire il blocco, in millisecondi

Invio

Boolean: true se il blocco è stato acquisito, false negli altri casi


waitLock(timeoutInMillis)

Tenta di acquisire il blocco, timeout con un'eccezione dopo il numero fornito di millisecondi. Questo metodo è uguale a tryLock(timeoutInMillis), ad eccezione del fatto che genera un'eccezione quando non è stato possibile acquisire il blocco anziché restituire false.

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

Parametri

NomeTipoDescrizione
timeoutInMillisIntegeril tempo di attesa per acquisire il blocco, in millisecondi

Lanci

Error: se il metodo è scaduto prima dell'acquisizione del blocco