Come eseguire il debug di Google Apps Script (ovvero dove accede Logger.log?)


129

In Fogli Google, puoi aggiungere alcune funzionalità di scripting. Sto aggiungendo qualcosa per l' onEditevento, ma non so dire se funziona. Per quanto ne so, non è possibile eseguire il debug di un evento dal vivo da Fogli Google, quindi è necessario farlo dal debugger, il che è inutile poiché l'argomento dell'evento passato alla mia onEdit()funzione sarà sempre indefinito se lo eseguo dal Script Editor.

Quindi, stavo cercando di utilizzare il Logger.logmetodo per registrare alcuni dati ogni volta che onEditviene chiamata la funzione, ma anche questo sembra funzionare solo quando eseguito dal Script Editor. Quando lo eseguo dal Script Editor, posso visualizzare i registri andando aView->Logs...

Speravo di poter vedere i registri da quando l'evento viene effettivamente eseguito, ma non riesco a capirlo.

Come posso eseguire il debug di questa roba?


3
Stesso problema qui: la risposta accettata non risponde ma fornisce molte informazioni chiaramente errate.
Hippyjim,

Sembra che abbiano risolto questo problema ora. Finché apri Script Editor dal tuo foglio di calcolo, lascia aperta quella scheda quando esegui le cose nel tuo foglio. Quindi torna alla scheda dello script e conterrà le informazioni di registrazione.
phreakhead il

2
TLDR; copia, incolla ed eseguiLogger.log('firstLog');MailApp.sendEmail({to:'yourEmailAddressHere@someone.com',subject: "subject here ^_^",body: Logger.getLog()});
Coty Embry,

Maby dovresti cambiare la risposta accettata o aggiungere una nota che Stackdriver Logging è disponibile.
botenvouwer,

Risposte:


83

AGGIORNARE:

Come scritto in questa risposta,


Logger.logti invierà un'e-mail (eventualmente) di errori che si sono verificati nei tuoi script oppure, se stai eseguendo cose dal Script Editor, puoi visualizzare il registro dall'ultima funzione di esecuzione andando su View->Logs(sempre nell'editor di script). Ancora una volta, ciò mostrerà solo tutto ciò che è stato registrato dall'ultima funzione eseguita dall'internoScript Editor .

La sceneggiatura che stavo cercando di far funzionare aveva a che fare con i fogli di calcolo: ho creato un foglio di lavoro da fare con un elenco di cose da fare che selezionava gli elementi in base a priorità e così via.

Gli unici trigger che ho installato per quello script erano i trigger onOpen e onEdit. Il debug del trigger onEdit è stato il più difficile da capire, perché continuavo a pensare che se avessi impostato un breakpoint nella mia funzione onEdit, avessi aperto il foglio di calcolo, modificato una cella, il mio breakpoint sarebbe stato attivato. Questo non è il caso.

Per simulare aver modificato una cella, ho fatto finisce per dover fare qualcosa nel foglio di calcolo vero e proprio però. Tutto quello che ho fatto è stato assicurarmi che la cella che volevo che fosse trattata come "modificata" fosse selezionata, quindi in Script Editor, sarei andato a Run->onEdit. Quindi il mio punto di interruzione verrebbe colpito.

Tuttavia, ho dovuto smettere di usare l'argomento dell'evento che viene passato alla funzione onEdit - non puoi simularlo facendo Run->onEdit. Tutte le informazioni di cui avevo bisogno dal foglio di calcolo, come la cella selezionata, ecc., Dovevo capire manualmente.

Comunque, lunga risposta, ma alla fine l'ho capito.


MODIFICA :

Se vuoi vedere la lista di controllo che ho fatto, puoi controllarla qui

(sì, so che chiunque può modificarlo - questo è il punto di condividerlo!)

Speravo che ti avrebbe lasciato vedere anche la sceneggiatura. Dal momento che non puoi vederlo lì, eccolo qui:

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();
};

Pff, la registrazione sarà visibile solo nella posta? Questo tipo di cose rende inutili tutte queste funzionalità di debug e registrazione, perché in realtà non possiamo usare dati reali dal foglio di calcolo.
MrFox,

No. Come ha detto l'autore, la registrazione è disponibile nel registro (Script Editor, Visualizza, Registro o Ctrl-Invio)
rainabba

9
@rainabba Sì, la registrazione è disponibile nell'Editor degli script. Tuttavia, quando uno script dipende dall'argomento dell'evento e l'argomento dell'evento non è disponibile nell'Editor degli script, significa effettivamente che gli sviluppatori di questi tipi di script non hanno modo di accedere ai registri in tempo reale.
Jeff,

1
Non ho potuto commentare prima, quindi ho fornito una risposta di seguito, ma: SE hai l'editor di script aperto e TU attivi un evento nel foglio di calcolo aperto, puoi tornare all'istanza del browser dell'editor di script e vedere le informazioni nei registri . Funziona bene fino a quando non è necessario testare qualcosa sotto un utente che non può aprire lo script o uno con cui non è possibile accedere.
Karl_S,

1
Questa risposta è obsoleta e non dovrebbe essere vista come la risposta accettata. Stackdriver Logging è disponibile e funziona come un fascino. Dai un'occhiata alla risposta in parti casuali!
botenvouwer,

34

Per quanto posso dire, non è possibile eseguire il debug di un evento dal vivo da Google Documenti, quindi è necessario farlo dal debugger, il che è inutile poiché l'argomento dell'evento passato alla mia funzione onEdit () sarà sempre indefinito se eseguo dallo Script Editor.

Vero: definisci tu stesso l'argomento dell'evento per il debug. Vedi Come posso testare una funzione trigger in GAS?

Stavo cercando di utilizzare il metodo Logger.log per registrare alcuni dati ogni volta che viene chiamata la funzione onEdit, ma anche questo sembra funzionare solo quando eseguito dall'Editor di script. Quando lo eseguo dall'Editor di script, posso visualizzare i registri andando su Visualizza-> Registri ...

Ancora vero, ma c'è aiuto. La biblioteca BetterLog di Peter Hermann reindirizzerà tutti i registri a un foglio di calcolo, consentendo la registrazione anche da codice non collegato a un'istanza dell'editor / debugger.

Se stai codificando uno script contenuto in un foglio di calcolo, ad esempio, puoi aggiungere solo questa riga all'inizio del file di script e tutti i registri andranno a un foglio "Registri" nel foglio di calcolo. Nessun altro codice necessario, basta usare Logger.log()come al solito:

Logger = BetterLog.useSpreadsheet();

1
Obsoleto. console.log()dovrebbe essere la migliore risposta ora
TheMaster

22

Aggiornamento 2017: Stackdriver Logging è ora disponibile per Google Apps Script. Dalla barra dei menu nell'editor di script, vai a: View > Stackdriver Loggingper visualizzare o eseguire lo streaming dei registri.

console.log () scriverà DEBUGmessaggi di livello

onEdit()Registrazione di esempio :

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});
}

Quindi controlla i log nell'interfaccia utente di Stackdriver etichettati onEdit() Event Objectper vedere l'output


La domanda originale chiede specificamente Logger.log. In che modo è diverso da quello console.logche usi? Sono molto nuovo con gli strumenti, quindi sto solo cercando di capire cosa sia tutto.
AnnanFay

5

Un po 'confuso, ma ho creato un array chiamato "console", e ogni volta che volevo eseguire l'output su console ho spinto verso l'array. Quindi ogni volta che volevo vedere l'output effettivo, sono appena tornato consoleinvece di quello che stavo tornando prima.

    //return 'console' //uncomment to output console
    return "actual output";
}

in js console.log('smth')funziona perfettamente, ma che ne dici di GAS?
Igor Savinkin,

1
console.log non funzionerà semplicemente perché GAS non sono script in esecuzione nella stessa pagina Web del tuo foglio di calcolo, sono script gestiti dal motore di app di Google, quindi devi seguire il loro debugger Logger.log ingombrante o utilizzare un hack come il mio
woojoo666

che ne dici della tua "console" di array? Quando I just returned consolecome lo emetti?
Igor Savinkin

2
Spiacenti, non ho spiegato molto bene, ma essenzialmente le funzioni del foglio di calcolo restituiscono il valore alla cella, quindi se restituisci la tua "console" vedrai tutto ciò che hai registrato nella cella del foglio di calcolo
woojoo666

5

Se hai l'editor di script aperto, vedrai i registri in Visualizza-> Registri. Se lo script ha un trigger onedit, apporta una modifica al foglio di calcolo che dovrebbe attivare la funzione con l'editor di script aperto in una seconda scheda. Quindi vai alla scheda dell'editor degli script e apri il registro. Vedrai qualunque cosa passi la tua funzione al logger.

Fondamentalmente finché l'editor di script è aperto, l'evento scriverà nel registro e lo mostrerà per te. Non mostrerà se qualcun altro è nel file altrove.


5

Ho esaminato questi post e in qualche modo ho trovato una risposta semplice, che sto postando qui per coloro che desiderano soluzioni brevi e dolci:

  1. Usa console.log("Hello World")nella tua sceneggiatura.
  2. Vai su https://script.google.com/home/my e seleziona il componente aggiuntivo.
  3. Fai clic sul menu con i puntini di sospensione su Dettagli progetto, seleziona Esecuzioni.

inserisci qui la descrizione dell'immagine

  1. Fare clic sull'intestazione dell'ultima esecuzione e leggere il registro.

inserisci qui la descrizione dell'immagine


Questa è la "registrazione di Stackdriver" di base per gli script di Google Apps creati dopo aprile 2019 (che è diventato impossibile accedere a Google Cloud Project per i progetti "automatici" dietro gli script di app). Se si modifica il GCP per un progetto Script app, si applicano le normali risposte di registrazione Stackdriver.
Tehhowch

1
Qui vedo solo esecuzioni dirette (ovvero quelle per le quali ho fatto clic su "esegui" nell'editor di script), ma non vedo esecuzioni causate da una modifica dei dati nel foglio. Come posso eseguire il debug di quelli?
Cris70,

Non l'ho provato scusa. Immagino che se un cambiamento nel foglio attivasse una funzione e la funzione avesse un registro, il registro verrebbe visualizzato insieme. Le modifiche sarebbero sempre indotte dall'utente, giusto?
Benjamin,

1
Sì, lo avrei immaginato anche io. Sfortunatamente non è quello che succede :-( Le modifiche ai dati attivano la mia funzione, ma i messaggi console.log () non sono mostrati nel registro Stackdriver. Ho provato ad aggiungere un attivatore in modifica, ma che invoca la mia funzione senza parametri: - (
Cris70,

4

Sto avendo lo stesso problema, ho trovato il seguito sul web da qualche parte ....

I gestori di eventi in Documenti sono un po 'complicati. Poiché i documenti possono gestire più modifiche simultanee da parte di più utenti, i gestori di eventi sono gestiti sul lato server. Il problema principale con questa struttura è che quando uno script di trigger di eventi fallisce, fallisce sul server. Se vuoi vedere le informazioni di debug dovrai impostare un trigger esplicito nel menu dei trigger che ti invierà le informazioni di debug quando l'evento fallisce o altrimenti fallirà silenziosamente.


Hmm, sì, mi sono imbattuto in questo - mi ha inviato via email un sacco di errori dai miei script la mattina successiva.
Alla

1

È tutt'altro che elegante, ma durante il debug, accedo spesso al Logger e quindi uso getLog () per recuperarne il contenuto. Quindi, io:

  • salva i risultati in una variabile (che può essere ispezionata nel debugger di Google Scripts, funziona in casi in cui non riesco a impostare un punto di interruzione in alcuni codici, ma posso impostarne uno nel codice che verrà eseguito in seguito)
  • scrivilo su qualche elemento DOM temporaneo
  • visualizzalo in un avviso

In sostanza, diventa solo un output JavaScript problema di .

Manca gravemente la funzionalità delle console.log()implementazioni moderne , ma il Logger aiuta ancora a eseguire il debug di Google Scripts.


1

Proprio come un avviso. Ho creato una funzione di prova per il mio foglio di calcolo. Uso la variabile google nella funzione onEdit (e) (l'ho chiamata e). Quindi ho fatto una funzione di test come questa:

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())
}

La chiamata a questa funzione di test fa eseguire tutto il codice come se si fosse verificato un evento nel foglio di calcolo. Ho appena messo in possesso la cella che ho modificato che mi ha dato un risultato inaspettato, impostando il valore come valore che ho inserito nella cella. OBS! per più variabili che googles fornisce alla funzione vai qui: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events


0

Attualmente sei limitato alla natura legata al contenitore dell'uso degli script nei documenti. Se crei un nuovo script al di fuori dei documenti, sarai in grado di esportare le informazioni in un foglio di calcolo di Google e utilizzarlo come uno strumento di registrazione.

Ad esempio nel tuo primo blocco di codice

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);

Quando lavoro con GAS ho due monitor (puoi usare due finestre) impostati con uno contenente l'ambiente GAS e l'altro contenente SS in modo da poter scrivere informazioni e accedere.


0

La console di sviluppo registra gli errori generati dallo script dell'app, quindi puoi semplicemente lanciare un errore per farlo registrare come un normale console.log. Interromperà l'esecuzione, ma potrebbe essere comunque utile per il debug passo dopo passo.

throw Error('hello world!');

verrà visualizzato nella console in modo simile a console.log('hello world')


0

esegui il debug del codice del foglio di calcolo in questo modo:

...
throw whatAmI;
...

spettacoli come questo:

inserisci qui la descrizione dell'immagine


Penso che dovresti menzionare che l'immagine mostra come una funzione personalizzata mostra un errore ma l'OP menziona che sta usando un semplice trigger ( onEdit)
Rubén
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.