Imprimindo para o console no Google Apps Script?

87

Eu sou muito novo em programação (fiz alguns dos cursos JS em Codecademy). Estou tentando criar um script simples para determinar, se for dada uma planilha com os resultados de um jogo de pôquer, quem deve pagar quem. Abri o Google Apps Script e escrevi o seguinte para começar:

function addplayerstoArray(numplayers) {

  var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

A ideia é criar um array com o número total de jogadores nele. Ao executar o código, pensei que imprimiria "3" no console. Mas nada aconteceu. Disse

"ReferenceError:" console "não está definido."

A) O que eu não entendo sobre como o console do Google Apps Script funciona com relação à impressão para que eu possa ver se meu código está funcionando como eu gostaria?

B) É um problema com o código?

Jim_shook
fonte

Respostas:

139

O console não está disponível porque o código está sendo executado na nuvem, não em seu navegador. Em vez disso, use a classe Logger fornecida pelo GAS:

Logger.log(playerArray[3])

e, em seguida, visualize os resultados no IDE em Exibir> Logs ...

Aqui estão algumas documentações sobre o registro com GAS .

Edit: 2016-07-20 Apps script agora também fornece Stackdriver Logging . Visualize esses logs no editor de script em Exibir - Logs do console.

Peter H
fonte
27
Como isso é feito ao escrever funções para planilhas? Não consigo descobrir para onde vai a saída de log.
TechplexEngineer
4
Muito útil. Obrigado! Agora, se apenas o log fosse atualizado ao vivo e em um local fora do caminho para testes rápidos.
kevincoleman
1
E em um modelo HTML?
Trevor
1
Em planilhas, você pode colocar a saída em um pop-up com MsgBox ou em uma barra lateral com a barra lateral. Você também pode colocá-lo na folha em um lugar fora do caminho.
vinnief
Para registro de planilhas aqui se encaixa a biblioteca BetterLog
Igor Savinkin,
17

Apenas para desenvolver a solução hacky de vinnief acima, eu uso MsgBox assim:

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

e atua como um ponto de interrupção, interrompe o script e exibe qualquer string de que você precisa em uma caixa pop-up. Acho que, especialmente em Planilhas, onde tenho problemas com Logger.log, isso fornece uma solução alternativa adequada na maioria das vezes.

Skathan
fonte
12

Embora Logger.log()seja tecnicamente a maneira correta de enviar algo para o console, há alguns incômodos:

  1. A saída pode ser uma bagunça não estruturada e difícil de digerir rapidamente.
  2. Você deve primeiro executar o script e, em seguida, clicar em Exibir / Logs, que são dois cliques extras (um se você se lembrar do atalho de teclado Ctrl + Enter).
  3. Você tem que inserir Logger.log(playerArray)e, depois de depurar, provavelmente deseja removerLogger.log(playerArray) ; portanto, mais 1-2 etapas adicionais.
  4. Você tem que clicar em OK para fechar a sobreposição (mais um clique extra).

Em vez disso, sempre que quero depurar algo, adiciono pontos de interrupção (clique no número da linha) e pressiono o botão Depurar (ícone de bug). Os pontos de interrupção funcionam bem quando você está atribuindo algo a uma variável, mas não tão bem quando você está iniciando uma variável e quer dar uma olhada dentro dela em um ponto posterior, que é semelhante ao que o op está tentando fazer. Nesse caso, eu forçaria uma condição de interrupção inserindo "x" (x marca o local!) Para lançar um erro de tempo de execução:

insira a descrição da imagem aqui

Compare com a exibição de Logs:

insira a descrição da imagem aqui

O console de depuração contém mais informações e é muito mais fácil de ler do que a sobreposição de registros. Um pequeno benefício desse método é que você nunca precisa se preocupar em poluir seu código com um monte de comandos de registro se você preferir manter o código limpo. Mesmo se você inserir "x", será forçado a lembrar de removê-lo como parte do processo de depuração, caso contrário, seu código não será executado (medida de limpeza integrada, yay).

thdoan
fonte
1
adicionar xseria a mesma funcionalidade que adicionardebugger;
JSDBroughton
Concordo plenamente. Logger.log não é útil em comparação com Debug.
Steve Gon
10

Respondendo às perguntas do OP

A) O que eu não entendo sobre como o console do Google Apps Script funciona com relação à impressão para que eu possa ver se meu código está funcionando como eu gostaria?

O código em arquivos .gs de um projeto do Google Apps Script executado no servidor em vez de no navegador da web. A maneira de registrar as mensagens era usar o Class Logger .

B) É um problema com o código?

Como dizia a mensagem de erro, o problema era que consolenão estava definido, mas hoje em dia o mesmo código vai lançar outro erro:

ReferenceError: "playerArray" não está definido. (linha 12, arquivo "Código")

Isso ocorre porque o playerArray é definido como variável local. Mover a linha para fora da função resolverá isso.

var playerArray = [];

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

addplayerstoArray(7);

console.log(playerArray[3])

Agora que o código é executado sem gerar erros, em vez de olhar o console do navegador, devemos olhar o Stackdriver Logging. Na IU do editor do Google Apps Script, clique em Exibir> Stackdriver Logging .

Termo aditivo

Em 2017, o Google lançou o Stackdriver Logging para todos os scripts e adicionou o Class Console, incluindo algo como console.log('Hello world!') não gerará um erro, mas o log estará no Google Cloud Platform Stackdriver Logging Service em vez do console do navegador.

Das notas de lançamento do Google Apps Script 2017

23 de junho de 2017

O Stackdriver Logging foi removido do acesso antecipado. Todos os scripts agora têm acesso ao registro do Stackdriver.

Em Logging> Stackdriver Logging

O exemplo a seguir mostra como usar o serviço de console para registrar informações no 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.
}
Rubén
fonte
6

Em um projeto de script do google, você pode criar arquivos html (exemplo: index.html) ou arquivos gs (exemplo: code.gs). Os arquivos .gs são executados no servidor e você pode usar Logger.log como @Peter Herrman descreve. No entanto, se a função for criada em um arquivo .html, ela está sendo executada no navegador do usuário e você pode usar console.log. O console do navegador Chrome pode ser visualizado por Ctrl Shift J no Windows / Linux ou Cmd Opt J no Mac

Se quiser usar Logger.log em um arquivo html, você pode usar um scriptlet para chamar a função Logger.log a partir do arquivo html. Para fazer isso, você deve inserir <? Logger.log (algo)?> Substituindo algo pelo que você deseja registrar. Scriptlets padrão, que usam a sintaxe <? ...?>, execute o código sem enviar explicitamente o conteúdo para a página.

Tanya Gupta
fonte
2

Atualizado para 2020

Em fevereiro de 2020, o Google anunciou uma grande atualização para o IDE embutido do Google Apps Script, que agora oferece suporte a console.log () . Então, agora você pode usar ambos:

  1. Logger.log ()
  2. console.log ()

Boa codificação!

Davis Jones
fonte
console.logera suportado antes do referido upgrade (ver minha resposta )
Rubén