Como posso testar uma function de gatilho no GAS?

Google-apps-script suporta Triggers que passam Eventos para acionar funções. Infelizmente, o ambiente de desenvolvimento permitirá que você teste funções sem a passagem de parâmetros, portanto, não é possível simular um evento dessa maneira. Se você tentar, você recebe um erro como:

ReferenceError: 'e' is not defined. 

Pode-se tratar o evento como um parâmetro opcional e inserir um valor padrão na function trigger usando qualquer uma das técnicas de ” Existe uma maneira melhor de fazer parâmetros opcionais de function em Javascript? “. Mas isso apresenta o risco de que um programador preguiçoso (mãos à obra, se for você!) Deixe esse código para trás, com efeitos colaterais indesejados.

Certamente existem maneiras melhores?

Você pode escrever uma function de teste que transmite um evento simulado à sua function de gatilho. Aqui está um exemplo que testa uma function de gatilho onEdit() . Ele passa um object de evento com todas as informações descritas em “Eventos de Edição de Planilha” em Entendendo Eventos .

Para usá-lo, defina seu ponto de interrupção em seu destino onEdit function onEdit , selecione a function test_onEdit e pressione Debug .

 /** * Test function for onEdit. Passes an event object to simulate an edit to * a cell in a spreadsheet. * * Check for updates: https://stackoverflow.com/a/16089067/1677912 * * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events */ function test_onEdit() { onEdit({ user : Session.getActiveUser().getEmail(), source : SpreadsheetApp.getActiveSpreadsheet(), range : SpreadsheetApp.getActiveSpreadsheet().getActiveCell(), value : SpreadsheetApp.getActiveSpreadsheet().getActiveCell().getValue(), authMode : "LIMITED" }); } 

Se você está curioso, isso foi escrito para testar a function onEdit para o Google Spreadsheet condicional em três células .

Aqui está uma function de teste para events de envio de formulário de planilha. Ele constrói seu evento simulado lendo dados de envio de formulário. Isto foi escrito originalmente para Obter TypeError no trigger onFormSubmit? .

 /** * Test function for Spreadsheet Form Submit trigger functions. * Loops through content of sheet, creating simulated Form Submit Events. * * Check for updates: https://stackoverflow.com/a/16089067/1677912 * * See https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events */ function test_onFormSubmit() { var dataRange = SpreadsheetApp.getActiveSheet().getDataRange(); var data = dataRange.getValues(); var headers = data[0]; // Start at row 1, skipping headers in row 0 for (var row=1; row < data.length; row++) { var e = {}; e.values = data[row].filter(Boolean); // filter: https://stackoverflow.com/a/19888749 e.range = dataRange.offset(row,0,1,data[0].length); e.namedValues = {}; // Loop through headers to create namedValues object // NOTE: all namedValues are arrays. for (var col=0; col 

Dicas

Ao simular events, tenha o cuidado de combinar os objects de evento documentados o mais próximo possível.

  • Se você deseja validar a documentação, você pode registrar o evento recebido de sua function de gatilho.

     Logger.log( JSON.stringify( e , null, 2 ) ); 
  • Em events de envio de formulário de planilha:

    • Todos os valores de namedValues ​​são matrizes.
    • Carimbos de data / hora são Strings e seu formato será localizado na localidade do formulário. Se lidas de uma planilha com formatação padrão * , elas são objects Date. Se a sua function de gatilho depende do formato da cadeia de caracteres do carimbo de data / hora (que é uma Idéia Ruim), tome cuidado para garantir que você simule o valor adequadamente.
    • Se você tiver colunas em sua planilha que não estão em seu formulário, a técnica nesse script simulará um "evento" com esses valores adicionais incluídos, o que não é o que você receberá de um envio de formulário.
    • Conforme relatado no problema 4335 , a matriz de values ignora as respostas em branco (em "novos formulários" + "novas folhas"). O método filter(Boolean) é usado para simular esse comportamento.

* Um texto simples formatado em célula preservará a data como uma string e não é uma boa ideia.

Atualização de 2017: depurar os objects de evento com o Stackdriver Logging for Google Apps Script. Na barra de menus do editor de scripts, vá para: View > Stackdriver Logging para visualizar ou transmitir os logs.

console.log () irá escrever mensagens no nível DEBUG

Exemplo emEdit () :

 function onEdit (e) { var debug_e = { authMode: e.authMode, range: e.range.getA1Notation(), source: e.source.getId(), user: e.user, value: e.value, oldValue: e. oldValue } console.log({message: 'onEdit() Event Object', eventObject: debug_e}); } 

Exemplo onFormSubmit () :

 function onFormSubmit (e) { var debug_e = { authMode: e.authMode, namedValues: e.namedValues, range: e.range.getA1Notation(), value: e.value } console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e}); } 

Exemplo onChange () :

 function onChange (e) { var debug_e = { authMode: e.authMode, changeType: changeType, user: e.user } console.log({message: 'onChange() Event Object', eventObject: debug_e}); } 

Em seguida, verifique os registros na IU do Stackdriver marcados como a sequência de message para ver a saída