que - Cómo depurar Google Apps Script(también conocido como ¿a dónde se registra Logger.log?)
logger.log google script (10)
En Hojas de cálculo de Google, puede agregar algunas funciones de scripting. Estoy agregando algo para el evento onEdit
, pero no puedo decir si está funcionando. Por lo que puedo decir, no puede depurar un evento en vivo de Hojas de cálculo de Google, por lo que debe hacerlo desde el depurador, lo cual es inútil ya que el argumento del evento pasado a mi función onEdit()
siempre estará indefinido si ejecuto del Script Editor
.
Por lo tanto, estaba tratando de usar el método Logger.log
para registrar algunos datos cada vez que se onEdit
función onEdit
, pero esto también parece que solo funciona cuando se ejecuta desde el Script Editor
. Cuando lo ejecuto desde el Script Editor
, puedo ver los registros yendo a View->Logs...
Esperaba poder ver los registros de cuando el evento realmente se ejecuta, pero no puedo resolverlo.
¿Cómo depuro esto?
Por lo que puedo decir, no puedes depurar un evento en vivo desde documentos de Google, así que tienes que hacerlo desde el depurador, lo cual no tiene sentido ya que el argumento del evento pasado a mi función onEdit () siempre estará indefinido si ejecuto del Editor de Guiones.
Verdadero - así que defina el argumento del evento usted mismo para la depuración. Consulte ¿Cómo puedo probar una función de disparo en GAS?
Estaba tratando de usar el método Logger.log para registrar algunos datos cada vez que se llama a la función onEdit, pero esto también parece que solo funciona cuando se ejecuta desde el Editor de secuencias de comandos. Cuando lo ejecuto desde el Editor de scripts, puedo ver los registros yendo a Ver-> Registros ...
Es cierto nuevamente, pero hay ayuda. La biblioteca BetterLog de Peter Hermann redirigirá todos los registros a una hoja de cálculo, lo que permite el registro incluso desde el código que no está adjunto a una instancia del editor / depurador.
Si está codificando en una secuencia de comandos contenida en una hoja de cálculo, por ejemplo, puede agregar solo esta línea al principio de su archivo de comandos, y todos los registros irán a la hoja de "Registros" en la hoja de cálculo. No es necesario otro código, solo use Logger.log()
como lo haría normalmente:
Logger = BetterLog.useSpreadsheet();
En la actualidad, usted está limitado a la naturaleza de uso de scripts del uso de scripts dentro de documentos. Si crea una nueva secuencia de comandos dentro de los documentos, podrá exportar información a una hoja de cálculo de Google y utilizarla como una herramienta de registro.
Por ejemplo, en tu primer bloque de código
function setCheckboxes() {
// Add your spreadsheet data
var errorSheet = SpreadsheetApp.openById(''EnterSpreadSheetIDHere'').getSheetByName(''EnterSheetNameHere'');
var cell = errorSheet.getRange(''A1'').offset(errorSheet.getLastRow(),0);
// existing code
var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
var checklist_data_range = checklist.getDataRange();
var checklist_num_rows = checklist_data_range.getNumRows();
// existing logger
Logger.log("checklist num rows: " + checklist_num_rows);
//We can pass the information to the sheet using cell.setValue()
cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);
Cuando estoy trabajando con GAS tengo dos monitores (puede usar dos ventanas) configurados con uno que contiene el entorno GAS y el otro que contiene el SS para que pueda escribir información y registrarme.
Está lejos de ser elegante, pero durante la depuración, a menudo me getLog() al registrador y luego uso getLog() para recuperar su contenido. Entonces, yo tampoco:
- guarde los resultados en una variable (que puede inspeccionarse en el depurador de Google Scripts; esto funciona en los casos en que no puedo establecer un punto de interrupción en algún código, pero puedo configurar uno en código que luego se ejecuta)
- escríbelo en algún elemento DOM temporal
- mostrarlo en una alert
Básicamente, se convierte en un problema de salida de JavaScript .
Carece de la funcionalidad de las implementaciones de console.log()
modernas, pero Logger todavía ayuda a depurar Google Scripts.
Estoy teniendo el mismo problema, encontré el siguiente en la web en algún lugar ...
Sin embargo, los controladores de eventos en Docs son un poco complicados. Debido a que los documentos pueden manejar múltiples ediciones simultáneas por múltiples usuarios, los manejadores de eventos se manejan en el lado del servidor. El principal problema con esta estructura es que cuando falla un script de activación de evento, falla en el servidor. Si desea ver la información de depuración, deberá configurar un activador explícito en el menú de desencadenadores que le envíe la información de depuración cuando el evento falle o fallará de manera silenciosa.
La consola de desarrollo registrará los errores arrojados por el script de la aplicación, por lo que puede lanzar un error para que se registre como un console.log normal. Se detendrá la ejecución, pero aún podría ser útil para la depuración paso a paso.
throw Error(''hello world!'');
aparecerá en la consola de manera similar a console.log(''hello world'')
Si tiene abierto el editor de scripts, verá los registros en Ver-> Registros. Si su script tiene un activador onedit, realice un cambio en la hoja de cálculo que debe activar la función con el editor de scripts abierto en una segunda pestaña. Luego vaya a la pestaña del editor de scripts y abra el registro. Verá lo que sea que su función pase al registrador.
Básicamente, siempre que el editor de scripts esté abierto, el evento escribirá en el registro y lo mostrará por usted. No se mostrará si alguien más está en el archivo en otro lugar.
Solo como un aviso. Hice una función de prueba para mi hoja de cálculo. Utilizo la variable google throws en la función onEdit (e) (la llamé e). Luego hice una función de prueba como esta:
function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
range:testRange,
value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}
Llamar a esta función de prueba hace que todo el código se ejecute como si tuviera un evento en la hoja de cálculo. Acabo de poner en la posición de la celda que edité lo que me dio un resultado inesperado, estableciendo valor como el valor que pongo en la celda. OBS! para obtener más variables, las funciones asignadas a la función van aquí: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
Un poco hacky, pero creé un arreglo llamado "consola", y cada vez que quería hacer una salida a la consola lo hacía a la matriz. Luego, cada vez que quería ver el resultado real, simplemente devolvía la console
lugar de devolver lo que estaba devolviendo.
//return ''console'' //uncomment to output console
return "actual output";
}
Logger.log
le enviará un correo electrónico (eventualmente) de los errores que han sucedido en sus scripts o, si está ejecutando cosas desde el Script Editor
, puede ver el registro desde la última función de ejecución yendo a View->Logs
(todavía en el editor de scripts). Nuevamente, eso solo le mostrará cualquier cosa que haya sido registrada desde la última función que ejecutó desde el Script Editor
.
El script que estaba tratando de trabajar tenía que ver con las hojas de cálculo. Hice una lista de tareas todo lo que ordenaba elementos por prioridades y demás.
Los únicos disparadores que instalé para ese script fueron los disparadores onOpen y onEdit. Depurar el desencadenador onEdit fue lo más difícil de descifrar, porque seguía pensando que si establecía un punto de interrupción en mi función onEdit, abría la hoja de cálculo, editaba una celda, se activaba mi punto de interrupción. Este no es el caso.
Para simular haber editado una celda, terminé teniendo que hacer algo en la hoja de cálculo. Todo lo que hice fue asegurarme de que la celda que quería tratar como "editada" fue seleccionada, luego en el Script Editor
, iría a Run->onEdit
. Entonces mi punto de ruptura sería golpeado.
Sin embargo, tuve que dejar de usar el argumento de evento que pasa a la función onEdit; no puedes simular eso haciendo Run->onEdit
. Cualquier información que necesité de la hoja de cálculo, como qué celda fue seleccionada, etc., tuve que resolverla manualmente.
De todos modos, respuesta larga, pero finalmente lo descubrí.
EDITAR :
Si quieres ver la lista de comprobación de tareas pendientes que hice, puedes consultarla aquí
(sí, sé que cualquiera puede editarlo, ¡ese es el punto de compartirlo!)
Esperaba que te dejara ver el guión también. Como no puedes verlo allí, aquí está:
function onOpen() {
setCheckboxes();
};
function setCheckboxes() {
var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
var checklist_data_range = checklist.getDataRange();
var checklist_num_rows = checklist_data_range.getNumRows();
Logger.log("checklist num rows: " + checklist_num_rows);
var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
var coredata_data_range = coredata.getDataRange();
for(var i = 0 ; i < checklist_num_rows-1; i++) {
var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
var item_id = split[split.length - 1];
if(item_id != "") {
item_id = parseInt(item_id);
Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
}
}
}
function onEdit() {
Logger.log("TESTING TESTING ON EDIT");
var active_sheet = SpreadsheetApp.getActiveSheet();
if(active_sheet.getName() == "checklist") {
var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
Logger.log("active_range: " + active_range);
Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
Logger.log("active_range. colidx: " + active_range.getColumnIndex());
if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
Logger.log("made it!");
var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
var val = next_cell.getValue();
Logger.log("val: " + val);
var splits = val.split(" || ");
var item_id = splits[splits.length-1];
Logger.log("item_id: " + item_id);
var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
var sheet_data_range = core_data.getDataRange();
var num_rows = sheet_data_range.getNumRows();
var sheet_values = sheet_data_range.getValues();
Logger.log("num_rows: " + num_rows);
for(var i = 0; i < num_rows; i++) {
Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
if(sheet_values[i][8] == item_id) {
Logger.log("found it! tyring to set it...");
sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
}
}
}
}
setCheckboxes();
};
Actualización de 2017: Stackdriver Logging ahora está disponible 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 de 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});
}
A continuación, compruebe los registros en la interfaz de usuario de onEdit() Event Object
etiquetada en onEdit() Event Object
para ver la salida