Vous imprimez sur la console dans Google Apps Script?


87

Je suis très nouveau dans la programmation (j'ai suivi certains des cours JS sur Codecademy). J'essaie de créer un script simple pour déterminer, si on lui donne une feuille de calcul avec les résultats d'une partie de poker, qui devrait payer qui. J'ai ouvert Google Apps Script et écrit ce qui suit pour commencer:

function addplayerstoArray(numplayers) {

  var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

L'idée est de créer un tableau avec le nombre total de joueurs qu'il contient. Lors de l'exécution du code, j'ai pensé qu'il afficherait "3" sur la console. Mais rien ne s'est passé. Ça disait

"ReferenceError:" console "n'est pas défini."

A) Qu'est-ce que je ne comprends pas sur le fonctionnement de la console Google Apps Script en ce qui concerne l'impression afin que je puisse voir si mon code accomplit ce que je souhaite?

B) Est-ce un problème avec le code?

Réponses:


139

La console n'est pas disponible car le code s'exécute dans le cloud, pas dans votre navigateur. À la place, utilisez la classe Logger fournie par GAS:

Logger.log(playerArray[3])

puis affichez les résultats dans l'EDI sous Affichage> Journaux ...

Voici une documentation sur la journalisation avec GAS .

Edit: Le script Apps du 20/07/2017 fournit désormais également Stackdriver Logging . Affichez ces journaux dans l'éditeur de script sous Afficher - Journaux de la console.


27
Comment cela se fait-il lors de l'écriture de fonctions pour des feuilles de calcul? Je n'arrive pas à trouver où va la sortie d'enregistrement.
TechplexEngineer

4
Super utile. Merci! Maintenant, si seulement le journal était mis à jour en direct et dans un endroit à l'écart pour des tests rapides.
kevincoleman

1
Qu'en est-il dans un modèle HTML?
Trevor

1
Dans les feuilles de calcul, vous pouvez placer la sortie dans une fenêtre contextuelle avec MsgBox ou dans une barre latérale avec barre latérale. Vous pouvez également le mettre dans la feuille dans un endroit à l'écart.
vinnief

Pour les feuilles de calcul, la journalisation ici correspond à la bibliothèque BetterLog
Igor Savinkin

17

Juste pour s'appuyer sur la solution hacky de vinnief ci-dessus, j'utilise MsgBox comme ceci:

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

et il agit un peu comme un point de rupture, arrête le script et affiche la chaîne dont vous avez besoin dans une boîte de dialogue. Je trouve en particulier dans Sheets, où j'ai des problèmes avec Logger.log, cela fournit une solution de contournement adéquate la plupart du temps.


12

Même si Logger.log()c'est techniquement le moyen correct de sortir quelque chose sur la console, cela présente quelques inconvénients:

  1. Le résultat peut être un désordre non structuré et difficile à digérer rapidement.
  2. Vous devez d'abord exécuter le script, puis cliquez sur Afficher / Journaux, ce qui correspond à deux clics supplémentaires (un si vous vous souvenez du raccourci clavier Ctrl + Entrée).
  3. Vous devez insérer Logger.log(playerArray), puis après le débogage, vous voudrez probablement supprimer Logger.log(playerArray), d'où 1-2 étapes supplémentaires.
  4. Vous devez cliquer sur OK pour fermer la superposition (encore un autre clic supplémentaire).

Au lieu de cela, chaque fois que je veux déboguer quelque chose, j'ajoute des points d'arrêt (cliquez sur le numéro de ligne) et appuyez sur le bouton Déboguer (icône de bogue). Les points d'arrêt fonctionnent bien lorsque vous affectez quelque chose à une variable, mais pas si bien lorsque vous lancez une variable et que vous voulez y jeter un coup d'œil ultérieurement, ce qui est similaire à ce que l'op essaie de faire. Dans ce cas, je forcerais une condition de rupture en entrant "x" (x marque l'endroit!) Pour lancer une erreur d'exécution:

entrez la description de l'image ici

Comparer avec l'affichage des journaux:

entrez la description de l'image ici

La console de débogage contient plus d'informations et est beaucoup plus facile à lire que la superposition des journaux. Un avantage mineur de cette méthode est que vous n'avez jamais à vous soucier de polluer votre code avec un tas de commandes de journalisation si vous voulez garder un code propre. Même si vous entrez "x", vous êtes obligé de vous rappeler de le supprimer dans le cadre du processus de débogage, sinon votre code ne fonctionnera pas (mesure de nettoyage intégrée, yay).


1
l'ajout xserait la même fonctionnalité que l'ajoutdebugger;
JSDBroughton

Entièrement d'accord. Logger.log n'est pas utile par rapport à Debug.
Steve Gon

10

Répondre aux questions du PO

A) Qu'est-ce que je ne comprends pas sur le fonctionnement de la console Google Apps Script en ce qui concerne l'impression afin que je puisse voir si mon code accomplit ce que je souhaite?

Le code sur les fichiers .gs d'un projet Google Apps Script s'exécute sur le serveur plutôt que sur le navigateur Web. La façon de consigner les messages était d'utiliser le Class Logger .

B) Est-ce un problème avec le code?

Comme le message d'erreur l'indique, le problème était que ce consolen'était pas défini mais de nos jours, le même code générera une autre erreur:

ReferenceError: "playerArray" n'est pas défini. (ligne 12, fichier "Code")

C'est parce que le playerArray est défini comme une variable locale. Sortir la ligne de la fonction résoudra ce problème.

var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Maintenant que le code s'exécute sans générer d'erreurs, au lieu de regarder la console du navigateur, nous devrions regarder Stackdriver Logging. Dans l'interface utilisateur de l'éditeur de scripts Google Apps, cliquez sur Afficher> Stackdriver Logging .

Addenda

En 2017, Google a publié tous les scripts Stackdriver Logging et ajouté la console de classe console.log('Hello world!').

À partir des notes de publication de Google Apps Script 2017

23 juin 2017

Stackdriver Logging a été déplacé de l'accès anticipé. Tous les scripts ont désormais accès à la journalisation Stackdriver.

Depuis Journalisation> Journalisation Stackdriver

L'exemple suivant montre comment utiliser le service de console pour consigner des informations dans 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

Dans un projet de script google, vous pouvez créer des fichiers html (exemple: index.html) ou des fichiers gs (exemple: code.gs). Les fichiers .gs sont exécutés sur le serveur et vous pouvez utiliser Logger.log comme le décrit @Peter Herrman. Cependant, si la fonction est créée dans un fichier .html, elle est exécutée sur le navigateur de l'utilisateur et vous pouvez utiliser console.log. La console du navigateur Chrome peut être visualisée par Ctrl Shift J sous Windows / Linux ou Cmd Opt J sur Mac

Si vous souhaitez utiliser Logger.log sur un fichier html, vous pouvez utiliser un scriptlet pour appeler la fonction Logger.log à partir du fichier html. Pour ce faire, insérez <? Logger.log (quelque chose)?> En remplaçant quelque chose par ce que vous voulez enregistrer. Scriptlets standard, qui utilisent la syntaxe <? ...?>, exécutez le code sans afficher explicitement le contenu de la page.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.