it-swarm.dev

Depurando uma função personalizada no script do Google Apps

Estou tentando criar minha primeira função personalizada para uma planilha do Google no Google Apps Script e estou tendo dificuldades em usar o depurador.

Estou trabalhando no código de demonstração de função personalizada da documentação do Google e defini um ponto de interrupção na função personalizada drivingDistance(Origin, destination) que é usada em uma célula da minha planilha. O problema que tenho é que o depurador mostra os parâmetros que são passados ​​para a função como sendo undefined. O conteúdo de quaisquer outras variáveis ​​criadas durante a execução é exibido corretamente (desde que não dependam dos parâmetros de entrada).

O engraçado é que, embora os parâmetros de entrada sejam exibidos como indefinidos, os cálculos da função são bem-sucedidos, portanto, isso parece ser um problema do depurador. Infelizmente, esse problema me impede de aprender a criar e depurar o próprio código (já que precisarei trabalhar com parâmetros de entrada complexos). 

Tenho a sensação de que o problema está ligado à execução do Script do Google no lado do servidor, então tentei registrar os parâmetros de entrada usando a classe Logger e também tentei copiar essas variáveis ​​em novas variáveis ​​locais. Mas tudo o que eu inventei foi undefined.

Outra dica estranha é que typeof dos parâmetros retorna String. Mas, ao obter o comprimento deles, um erro é lançado e tentar concatená-los com outra string retorna a string "undefined" (veja meu dump de tela).

enter image description here

Eu estou procurando insights sobre o que está acontecendo aqui.

29
Jpsy

O depurador provavelmente não está mentindo para você - se você ativar essa função no depurador, ele não terá parâmetros passados ​​para ele. Não se preocupe, porém, você só precisa ter certeza de obter valores para usar na depuração. Dê uma olhada em Como posso testar uma função de gatilho no GAS? , que demonstra técnicas que podem ser aplicadas a funções personalizadas.

Em vez de definir um evento para passar para a função, você desejará fornecer (ou recuperar de sua planilha eletrônica) valores para os parâmetros.

function test_drivingDistance() {
  // Define a set of test values
  var testSet = [[ 'Washington, DC', 'Seattle, WA' ],
                 [ 'Ottawa, ON', 'Orlando, FL'],
                 [ 'Paris, France', 'Dakar, Senegal']];

  // Run multiple tests
  for (var test in testSet) {
    Logger.log('Test ' + test + ' = ' + drivingDistance(testSet[test][0],testSet[test][1]));
  }

  // Get parameters from sheet
  var TestFromSheet = drivingDistance(ss.getRange('A1').getValue(),ss.getRange('A2').getValue());
}

Você entendeu a ideia. Você ainda pode definir pontos de interrupção dentro de sua função ou usar debugger para pausar a execução.


Editar - examinando argumentos

Quais argumentos a função personalizada recebe quando é chamada de uma planilha?

Você está limitado no que pode ser feito para depurar isso, pois o depurador não pode ser usado para examinar sua função personalizada quando chamado no Planilhas e as limitações de segurança em funções personalizadas bloqueiam o registro em log. Pode ser o suficiente para entender o argumento em geral. Enquanto funções javascript podem ter parâmetros nomeados, todos os argumentos são passados ​​como um objeto tipo Array, chamado arguments. Esta função personalizada retornará uma matriz que relata os argumentos recebidos. Quando chamado a partir de uma planilha, cada argumento aparecerá em sua própria célula, iniciando na célula na qual você inseriu a função:

function testArguments(  ) {
  var argArray = [];
  for (var arg in arguments) {
    argArray.Push("arguments[" + arg + "] = " + JSON.stringify(arguments[arg]))
  }

  return argArray;
}

Screenshot

Em javascript, não existem realmente tipos como int ou float - apenas Number. Esses parâmetros aparecerão sem aspas e parecerão números. As datas chegam como objetos Date, mas quando impressas dessa forma, aparecem como strings Date-y. Cordas têm citações.

Uma função personalizada nunca recebe um intervalo como argumento; Quando você fornece um parâmetro de intervalo na planilha, seu conteúdo é coletado em uma matriz unidimensional ou bidimensional e a matriz é o argumento.

34
Mogsdad

Você pode usar este hack para ver a estrutura dos argumentos sendo enviados para a função personalizada:

function TEST(input) {
  return (JSON.stringify(input));
}

Os resultados aparecerão na sua planilha assim:

 enter image description here

0
Joseph Combs