web-dev-qa-db-fra.com

Impression sur la console dans Google Apps Script?

Je suis très novice en programmation (j'ai suivi certains cours JS sur Codecademy). J'essaie de créer un script simple pour déterminer, si un tableur contenant les résultats d'un jeu de poker est donné, qui doit payer qui. J'ai ouvert le script Google Apps 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 contenant le nombre total de joueurs. Lors de l'exécution du code, j'ai pensé qu'il imprimerait "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, de sorte que je puisse voir si mon code accomplit ce que j'aimerais?

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

62
jim_shook

La console n'est pas disponible car le code est exécuté dans le cloud, pas dans votre navigateur. Utilisez plutôt la classe Logger fournie par GAS:

Logger.log(playerArray[3])

puis affichez les résultats dans le IDE sous Afficher> Journaux ...

Voici de la documentation sur journalisation avec GAS .

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

108
Peter Herrmann

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

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

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

13
skathan

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, de sorte que je puisse voir si mon code accomplit ce que j'aimerais?

Le code des fichiers .gs d’un projet de script Google Apps s’exécute sur le serveur plutôt que sur le navigateur Web. La manière de consigner les messages consistait à utiliser le Class Logger .

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

Comme le message d'erreur le disait, le problème était que console n'était pas défini, mais de nos jours, le même code génère une autre erreur:

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

C'est parce que le playerArray est défini en tant que variable locale. Déplacer la ligne hors 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 la journalisation Stackdriver. Dans l'interface utilisateur de l'éditeur de scripts Google Apps, cliquez sur Affichage> Journalisation Stackdriver .

Addenda

En 2017, Google a publié dans tous les scripts la journalisation Stackdriver et ajouté la console de classes. L'inclusion de quelque chose comme console.log('Hello world!') ne générera pas d'erreur, mais le journal se trouvera sur le service de journalisation Stackdriver de Google Cloud Platform au lieu de la console du navigateur.

De Notes de version de Google Apps Script 2017

23 juin 2017

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

De Journalisation> Journalisation Stackdriver

L'exemple suivant montre comment utiliser le service console pour enregistrer les 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.
}
8
Rubén

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 décrit par Peter Herrman. Toutefois, si la fonction est créée dans un fichier .html, elle est en cours d'exécution sur le navigateur de l'utilisateur et vous pouvez utiliser console.log. La console du navigateur Chrome peut être visualisée par Ctrl Maj 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, vous insérez <? Logger.log (quelque chose)?> remplacer quelque chose par ce que vous voulez enregistrer. Scriptlets standard, qui utilisent la syntaxe <? ...?>, exécute du code sans sortir explicitement le contenu de la page.

6
Tanya Gupta

Bien que Logger.log() soit techniquement le moyen correct de générer quelque chose sur la console, il présente quelques inconvénients:

  1. La sortie peut être un désordre non structuré et difficile à digérer rapidement.
  2. Vous devez d’abord exécuter le script, puis cliquer 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 souhaiterez probablement supprimer Logger.log(playerArray), d'où 1 ou 2 étapes supplémentaires.
  4. Vous devez cliquer sur OK pour fermer la superposition (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ébogage (icône de bogue). Les points d'arrêt fonctionnent bien lorsque vous affectez quelque chose à une variable, mais pas autant lorsque vous lancez une variable et que vous souhaitez y jeter un coup d'œil ultérieurement, ce qui est similaire à ce que l'opérateur tente de faire. Dans ce cas, je forcerais une condition de rupture en entrant "x" (x marque l'endroit!) Pour générer une erreur d'exécution:

enter image description here

Comparez avec l'affichage des journaux:

enter image description here

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 conserver du code vierge est ce que vous préférez. Même si vous entrez "x", vous devez 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, oui).

6
thdoan