Class Lock

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.
Bloquear

Uma representação de um bloqueio de exclusão mútua.

Essa classe permite que os scripts garantam que apenas uma instância do script esteja executando uma seção do código por vez. Isso é particularmente útil para callbacks e acionadores, em que uma ação do usuário pode causar alterações em um recurso compartilhado e você quer garantir que não haja colisões.

Os exemplos a seguir mostram como usar um bloqueio em um gerenciador de envio de formulário.

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Release the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
Sem LockService, se dois usuários enviarem o formulário aproximadamente ao mesmo tempo que os números de ingresso podem terminar da mesma forma, já que a propriedade lastTicketNumber pode mudar depois da leitura do ScriptProperties, mas antes do novo valor ser gravado de novo.

Métodos

MétodoTipo de retornoBreve descrição
hasLock()BooleanRetorna "true" se o bloqueio foi adquirido.
releaseLock()voidLibere o bloqueio, permitindo que outros processos que aguardam o bloqueio continuem.
tryLock(timeoutInMillis)BooleanTentativas de adquirir o bloqueio, expirando após o número de milissegundos fornecido.
waitLock(timeoutInMillis)voidTentativas de adquirir o bloqueio, expirando com uma exceção após o número de milissegundos fornecido.

Documentação detalhada

hasLock()

Retorna "true" se o bloqueio foi adquirido. Esse método retornará falso se tryLock(timeoutInMillis) ou waitLock(timeoutInMillis) nunca forem chamados, expirarem antes de o bloqueio ser recuperado ou se releaseLock() for chamado.

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

Retornar

Boolean: verdadeiro se o bloqueio tiver sido adquirido. Caso contrário, é falso


releaseLock()

Libere o bloqueio, permitindo que outros processos que aguardam o bloqueio continuem. O bloqueio é liberado automaticamente quando o script termina, mas, para eficiência, é melhor liberá-lo assim que você não precisar mais de acesso exclusivo a uma seção do código. Esse método não terá efeito se o bloqueio não tiver sido adquirido.

Se estiver trabalhando com uma planilha, chame PlanilhaApp.wash() antes de liberar o bloqueio para confirmar todas as mudanças pendentes na planilha enquanto você ainda tiver acesso exclusivo a ela.

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

tryLock(timeoutInMillis)

Tentativas de adquirir o bloqueio, expirando após o número de milissegundos fornecido. Esse método não terá efeito se o bloqueio já tiver sido adquirido.

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegerquanto tempo esperar para adquirir o bloqueio, em milissegundos

Retornar

Boolean: verdadeiro se o bloqueio tiver sido adquirido. Caso contrário, é falso


waitLock(timeoutInMillis)

Tentativas de adquirir o bloqueio, expirando com uma exceção após o número de milissegundos fornecido. Esse método é igual a tryLock(timeoutInMillis), mas gera uma exceção quando o bloqueio não pode ser adquirido em vez de retornar "false".

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

Parâmetros

NomeTipoDescrição
timeoutInMillisIntegerquanto tempo esperar para adquirir o bloqueio, em milissegundos

Gera

Error: se o método expirou antes do bloqueio do bloqueio