Stampa sulla console in Google Apps Script?


89

Sono molto nuovo nella programmazione (ho seguito alcuni dei corsi JS su Codecademy). Sto cercando di creare un semplice script per determinare, se viene fornito un foglio di calcolo con i risultati di una partita di poker, chi dovrebbe pagare chi. Ho aperto Google Apps Script e ho scritto quanto segue per iniziare:

function addplayerstoArray(numplayers) {

  var playerArray = [];

  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

L'idea è di creare un array con il numero totale di giocatori al suo interno. Durante l'esecuzione del codice, ho pensato che avrebbe stampato "3" sulla console. Ma non è successo niente. Ha detto

"ReferenceError:" console "non è definito."

A) Cosa non capisco su come funziona la console di Google Apps Script rispetto alla stampa in modo da poter vedere se il mio codice sta ottenendo ciò che vorrei?

B) È un problema con il codice?

Risposte:


144

La console non è disponibile perché il codice è in esecuzione nel cloud, non nel browser. Utilizza invece la classe Logger fornita da GAS:

Logger.log(playerArray[3])

e quindi visualizzare i risultati nell'IDE in Visualizza> Log ...

Ecco un po 'di documentazione sulla registrazione con GAS .

Modifica: lo script delle app del 20/07/2017 ora fornisce anche Stackdriver Logging . Visualizza questi registri nell'editor di script in Visualizza - Registri della console.


28
Come si fa quando si scrivono funzioni per fogli di calcolo? Non riesco a trovare dove va l'output di registrazione.
TechplexEngineer

4
Super utile. Grazie! Ora, se solo il registro fosse aggiornato in tempo reale e in una posizione fuori mano per un rapido test.
kevincoleman

1
E in un modello HTML?
Trevor

1
Nei fogli di calcolo, puoi inserire l'output in un popup con MsgBox o in una barra laterale con Sidebar. Puoi anche metterlo nel foglio in un posto fuori mano.
vinnief

Per i fogli di calcolo la registrazione qui si adatta alla libreria BetterLog
Igor

17

Solo per basarmi sulla soluzione hacky di vinnief sopra, utilizzo MsgBox in questo modo:

Browser.msgBox('BorderoToMatriz', Browser.Buttons.OK_CANCEL);

e agisce un po 'come un punto di interruzione, interrompe lo script e restituisce qualsiasi stringa di cui hai bisogno in una finestra a comparsa. Trovo che soprattutto in Fogli, dove ho problemi con Logger.log, questo fornisce una soluzione alternativa adeguata la maggior parte delle volte.


12

Nonostante Logger.log() tecnicamente è il modo corretto per inviare qualcosa alla console, presenta alcuni fastidi:

  1. L'output può essere un pasticcio non strutturato e difficile da digerire rapidamente.
  2. Devi prima eseguire lo script, quindi fare clic su Visualizza / Log, ovvero due clic in più (uno se ricordi la scorciatoia da tastiera Ctrl + Invio).
  3. Devi inserire Logger.log(playerArray)e quindi dopo il debug probabilmente vorresti rimuovereLogger.log(playerArray) , quindi altri 1-2 passaggi aggiuntivi.
  4. Devi fare clic su OK per chiudere l'overlay (ancora un altro clic in più).

Invece, ogni volta che voglio eseguire il debug di qualcosa, aggiungo punti di interruzione (fare clic sul numero di riga) e premere il pulsante Debug (icona del bug). I punti di interruzione funzionano bene quando si assegna qualcosa a una variabile, ma non così bene quando si avvia una variabile e si desidera sbirciare al suo interno in un secondo momento, il che è simile a ciò che sta cercando di fare l'operazione. In questo caso, forzerei una condizione di interruzione inserendo "x" (x segna il punto!) Per generare un errore di runtime:

inserisci qui la descrizione dell'immagine

Confronta con la visualizzazione dei registri:

inserisci qui la descrizione dell'immagine

La console di debug contiene più informazioni ed è molto più facile da leggere rispetto all'overlay dei registri. Un vantaggio minore di questo metodo è che non devi mai preoccuparti di inquinare il tuo codice con un mucchio di comandi di registrazione se ti piace mantenere il codice pulito. Anche se inserisci "x", sei costretto a ricordarti di rimuoverlo come parte del processo di debug, altrimenti il ​​tuo codice non verrà eseguito (misura di pulizia incorporata, yay).


1
l'aggiunta xsarebbe la stessa funzionalità dell'aggiuntadebugger;
JSDBroughton

Completamente d'accordo. Logger.log non è utile rispetto a Debug.
Steve Gon

10

Rispondere alle domande dell'OP

A) Cosa non capisco su come funziona la console di Google Apps Script rispetto alla stampa in modo da poter vedere se il mio codice sta ottenendo ciò che vorrei?

Il codice sui file .gs di un progetto Google Apps Script viene eseguito sul server anziché sul browser web. Il modo per registrare i messaggi era usare il Class Logger .

B) È un problema con il codice?

Come diceva il messaggio di errore, il problema era che consolenon era stato definito ma al giorno d'oggi lo stesso codice genererà un altro errore:

ReferenceError: "playerArray" non è definito. (riga 12, file "Codice")

Questo perché playerArray è definito come variabile locale. Spostare la linea fuori dalla funzione risolverà questo problema.

var playerArray = [];

function addplayerstoArray(numplayers) {
  for (i=0; i<numplayers; i++) {
    playerArray.push(i);
  }
}  

addplayerstoArray(7);

console.log(playerArray[3])

Ora che il codice viene eseguito senza generare errori, invece di guardare la console del browser dovremmo esaminare Stackdriver Logging. Dall'interfaccia utente dell'editor di Google Apps Script, fai clic su Visualizza> Stackdriver Logging .

Addendum

Nel 2017 Google ha rilasciato a tutti gli script Stackdriver Logging e aggiunto la Class Console, quindi includere qualcosa di simile console.log('Hello world!')non genererà un errore, ma il log sarà su Google Cloud Platform Stackdriver Logging Service invece che sulla console del browser.

Dalle note sulla versione di Google Apps Script 2017

23 giugno 2017

Stackdriver Logging è stato spostato dall'accesso anticipato. Tutti gli script ora hanno accesso alla registrazione di Stackdriver.

Da Registrazione> Registrazione Stackdriver

L'esempio seguente mostra come utilizzare il servizio della console per registrare le informazioni in Stackdriver.

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);      // Stops the timer, logs execution duration.
}

6

In un progetto script di Google puoi creare file html (esempio: index.html) o file gs (esempio: code.gs). I file .gs vengono eseguiti sul server e puoi usare Logger.log come descrive @Peter Herrman. Tuttavia, se la funzione viene creata in un file .html, viene eseguita sul browser dell'utente ed è possibile utilizzare console.log. La console del browser Chrome può essere visualizzata premendo Ctrl Shift J su Windows / Linux o Cmd Opt J su Mac

Se si desidera utilizzare Logger.log su un file html, è possibile utilizzare uno scriptlet per chiamare la funzione Logger.log dal file html. Per fare ciò dovresti inserire <? Logger.log (qualcosa)?> Sostituendo qualcosa con quello che vuoi registrare. Scriptlet standard, che utilizzano la sintassi <? ...?>, esegue il codice senza inviare esplicitamente il contenuto alla pagina.


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.