google apps script - script - ¿Cómo puedo probar una función de disparo en GAS?
logs google app script (2)
Puede escribir una función de prueba que pase un evento simulado a su función de disparo. Aquí hay un ejemplo que prueba una función de disparo onEdit()
. Pasa un objeto de evento con toda la información descrita para "Eventos de edición de hoja de cálculo" en Events .
Para usarlo, configure su punto de interrupción en su destino en la función onEdit
, seleccione la función test_onEdit
y test_onEdit
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"
});
}
Si tiene curiosidad, esto fue escrito para probar la función onEdit
para Google Spreadsheet condicional en tres celdas .
Aquí hay una función de prueba para los eventos de envío de formularios de hoja de cálculo. Construye su evento simulado leyendo datos de envío de formularios. Esto fue escrito originalmente para obtener TypeError en el activador 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<headers.length; col++) {
e.namedValues[headers[col]] = [data[row][col]];
}
// Pass the simulated event to onFormSubmit
onFormSubmit(e);
}
}
Consejos
Cuando simule eventos, tenga cuidado de hacer coincidir los objetos de eventos documentados lo más cerca posible.
Si desea validar la documentación, puede registrar el evento recibido desde su función de activación.
Logger.log( JSON.stringify( e , null, 2 ) );
En eventos de envío de formularios de hoja de cálculo:
- todos los valores de valores nombrados son matrices.
- Las marcas de tiempo son cadenas y su formato se localizará en la configuración regional del formulario. Si se lee desde una hoja de cálculo con formato predeterminado * , son objetos de fecha. Si su función desencadenante se basa en el formato de cadena de la marca de tiempo (que es una mala idea), asegúrese de simular el valor de manera apropiada.
- Si tiene columnas en su hoja de cálculo que no están en su forma, la técnica en este script simulará un "evento" con esos valores adicionales incluidos, que no es lo que recibirá de un envío de formulario.
- Como se informó en el Issue 4335 , la matriz de
values
omite las respuestas en blanco (en "nuevas formas" + "nuevas hojas"). El método defilter(Boolean)
se usa para simular este comportamiento.
* Un "texto sin formato" con formato de celda conservará la fecha como una cadena, y no es una buena idea.
Google-apps-script admite Triggers que pasan Events para activar funciones. Desafortunadamente, el entorno de desarrollo te permitirá probar funciones sin pasar parámetros, por lo que no puedes simular un evento de esa manera. Si lo intenta, obtendrá un error como:
ReferenceError: ''e'' is not defined.
Uno podría tratar el evento como un parámetro opcional, e insertar un valor predeterminado en la función de desencadenar utilizando cualquiera de las técnicas de " ¿Hay una forma mejor de hacer los parámetros de funciones opcionales en Javascript? ". Pero eso introduce el riesgo de que un programador perezoso (¡manos a la obra si eres tú!) Dejará ese código atrás, con efectos secundarios no deseados.
Seguramente hay mejores formas?
Actualización de 2017: depure los objetos de evento con Stackdriver Logging para Google Apps Script. Desde la barra de menú en el editor de scripts, vaya a: View > Stackdriver Logging
para ver o transmitir los registros.
console.log() escribirá mensajes de nivel DEBUG
Ejemplo onEdit () :
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});
}
Ejemplo 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});
}
Ejemplo onChange () :
function onChange (e) {
var debug_e = {
authMode: e.authMode,
changeType: changeType,
user: e.user
}
console.log({message: ''onChange() Event Object'', eventObject: debug_e});
}
Luego, compruebe los registros en la interfaz de usuario de Stackdriver etiquetada como la cadena del message
para ver la salida