Class Lock

Verrouiller

Représentation d'un verrou de mutualisation.

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

L'exemple suivant montre comment utiliser un verrouillage 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 au même moment, les numéros de billet 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 la valeur "true" si le verrouillage a été acquis.
releaseLock()voidLibère le verrouillage, ce qui permet aux autres processus en attente de continuer.
tryLock(timeoutInMillis)BooleanTente d'acquérir le verrouillage, et expire après le nombre de millisecondes fourni.
waitLock(timeoutInMillis)voidTente d'acquérir le verrouillage, avec expiration et exception après le nombre de millisecondes fourni.

Documentation détaillée

hasLock()

Renvoie la valeur "true" si le verrouillage 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 avant expiration a expiré avant que le verrouillage ne 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 verrouillage a été acquis, "false" dans le cas contraire


releaseLock()

Libère le verrouillage, ce qui permet aux autres processus en attente de continuer. Le verrouillage 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 verrouillage n'a pas été acquis.

Notez que si vous travaillez avec une feuille de calcul, vous devez appeler SpreadsheetApp.flush() avant de relâcher le verrouillage pour valider toutes les modifications en attente dans la feuille de calcul tant 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 verrouillage, et expire après le nombre de millisecondes fourni. Cette méthode n'a aucun effet si le verrouillage 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
timeoutInMillisIntegerDurée d'attente pour acquérir le verrouillage, en millisecondes

Renvois

Boolean : "true" si le verrouillage a été acquis, "false" dans le cas contraire


waitLock(timeoutInMillis)

Tente d'acquérir le verrouillage, avec expiration et 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 verrouillage ne peut pas être acquis au lieu de renvoyer la valeur "false".

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

Paramètres

NomTypeDescription
timeoutInMillisIntegerDurée d'attente pour acquérir le verrouillage, en millisecondes

Génère

Error : si la méthode a expiré avant que la serrure n'ait été acquise