Class Lock

Verrouiller

Représentation d'un verrou d'exclusion mutuelle.

Cette classe permet aux scripts de s'assurer qu'une seule instance du script exécute une section de code donnée à la fois. Cela est particulièrement utile pour les rappels et les déclencheurs, lorsqu'une action de l'utilisateur peut modifier une ressource partagée et que vous souhaitez vous assurer qu'il n'y a pas de conflits.

L'exemple suivant montre comment utiliser un verrou dans un gestionnaire d'envoi de formulaire.

// 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);
}
Sans le service Lock, si deux utilisateurs envoient le formulaire à peu près au même moment, les numéros des tickets pourraient finir par le même, car la propriété lastTicketNumber peut être modifiée après la lecture de ScriptProperties, mais avant l'écriture de la nouvelle valeur.

Méthodes

MéthodeType renvoyéBrève description
hasLock()BooleanRenvoie la valeur "true" si le verrou a été acquis.
releaseLock()voidDéverrouille le verrouillage, ce qui permet aux autres processus en attente de continuer.
tryLock(timeoutInMillis)BooleanTente d'acquérir le verrou, expirant après le nombre de millisecondes fourni.
waitLock(timeoutInMillis)voidTentative d'acquisition du verrou, arrivée à expiration, à l'exception d'une exception, après le nombre de millisecondes fourni.

Documentation détaillée

hasLock()

Renvoie la valeur "true" si le verrou a été acquis. Cette méthode renvoie la valeur "false" si tryLock(timeoutInMillis) ou waitLock(timeoutInMillis) n'ont jamais été appelés, si le délai a expiré avant que le verrou puisse être récupéré, ou si releaseLock() a été appelé.

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

Renvois

Boolean : "true" si le verrou a été acquis, et "false" dans le cas contraire.


releaseLock()

Déverrouille le verrouillage, ce qui permet aux autres processus en attente de continuer. Le verrouillage est automatiquement libéré à la fin du script. Toutefois, pour plus d'efficacité, il est préférable de le libérer dès que vous n'avez plus besoin d'un accès exclusif à une section de code. Cette méthode n'a aucun effet si le verrouillage n'a pas été acquis.

Notez que si vous travaillez avec une feuille de calcul, vous devez appeler sheetsApp.flush() avant de libérer le verrou pour valider toutes les modifications en attente dans la feuille de calcul tout en continuant à y accéder.

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

tryLock(timeoutInMillis)

Tente d'acquérir le verrou, expirant après le nombre de millisecondes fourni. Cette méthode n'a aucun effet si le verrouillage a déjà été acquis.

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

Paramètres

NomTypeDescription
timeoutInMillisIntegerdélai d'attente avant l'acquisition du verrou, en millisecondes

Renvois

Boolean : "true" si le verrou a été acquis, et "false" dans le cas contraire.


waitLock(timeoutInMillis)

Tentative d'acquisition du verrou, arrivée à expiration, à l'exception d'une exception, après le nombre de millisecondes fourni. Cette méthode est identique à tryLock(timeoutInMillis), sauf qu'elle génère une exception lorsque le verrou n'a pas pu être acquis au lieu de renvoyer la valeur "false".

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

Paramètres

NomTypeDescription
timeoutInMillisIntegerdélai d'attente avant l'acquisition du verrou, en millisecondes

Génère

Error : si la méthode a expiré avant l'acquisition du verrouillage.