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, où une action de l'utilisateur peut entraîner des modifications d'une ressource partagée et où vous souhaitez vous assurer qu'il n'y a pas de collisions.

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) {
  const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Gets a script lock before modifying a shared resource.
  const lock = LockService.getScriptLock();
  // Waits for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  const scriptProperties = PropertiesService.getScriptProperties();

  const 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 en même temps, les numéros de ticket peuvent être identiques, car la propriété lastTicketNumber peut changer après avoir été lue à partir de ScriptProperties, mais avant que la nouvelle valeur ne soit réécrite.

Méthodes

MéthodeType renvoyéBrève description
hasLock()BooleanRenvoie true si le verrou a été acquis.
releaseLock()voidLibère le verrou, ce qui permet aux autres processus en attente de verrouillage de continuer.
tryLock(timeoutInMillis)BooleanTente d'acquérir le verrou et expire après le nombre de millisecondes fourni.
waitLock(timeoutInMillis)voidTentatives d'acquisition du verrou, avec expiration et exception après le nombre de millisecondes indiqué.

Documentation détaillée

hasLock()

Renvoie true si le verrou a été acquis. Cette méthode renvoie 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é.

const 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, false sinon.


releaseLock()

Libère le verrou, ce qui permet aux autres processus en attente de verrouillage de continuer. Le verrou est automatiquement libéré lorsque le script se termine, mais 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 verrou n'a pas été acquis.

Notez que si vous travaillez avec une feuille de calcul, vous devez appeler SpreadsheetApp.flush() avant de libérer le verrou, afin de valider toutes les modifications en attente apportées à la feuille de calcul pendant que vous y avez encore un accès exclusif.

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

tryLock(timeoutInMillis)

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

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

Paramètres

NomTypeDescription
timeoutInMillisIntegerTemps d'attente pour acquérir le verrou, en millisecondes.

Renvois

Boolean : true si le verrou a été acquis, false sinon.


waitLock(timeoutInMillis)

Tentatives d'acquisition du verrou, avec expiration et exception après le nombre de millisecondes indiqué. Cette méthode est identique à tryLock(timeoutInMillis), sauf qu'elle génère une exception lorsque le verrou ne peut pas être acquis au lieu de renvoyer false.

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

Paramètres

NomTypeDescription
timeoutInMillisIntegerTemps d'attente pour acquérir le verrou, en millisecondes.

Génère

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