web-dev-qa-db-fra.com

Débogage d'une fonction personnalisée dans le script Google Apps

J'essaie de créer ma première fonction personnalisée pour une feuille de calcul Google dans le script Apps et j'éprouve de la difficulté à utiliser le débogueur.

Je travaille sur le code de démonstration de la fonction personnalisée de la documentation Google et j'ai défini un point d'arrêt dans la fonction personnalisée drivingDistance(Origin, destination) qui est utilisée dans une cellule de ma feuille de calcul. Le problème que j'ai est que le débogueur affiche les paramètres qui sont passés à la fonction comme étant undefined. Le contenu de toutes les autres variables créées lors de l'exécution s'affiche cependant correctement (tant qu'elles ne dépendent pas des paramètres d'entrée).

Ce qui est drôle, c'est que, même si les paramètres d'entrée sont affichés comme non définis, les calculs de la fonction aboutissent, ce qui semble donc être un problème de débogage. Malheureusement, ce problème m'empêche d'apprendre à créer et à déboguer mon propre code (car je vais devoir travailler avec des paramètres d'entrée complexes). 

J'ai l'impression que le problème est lié à l'exécution côté script du script Apps. J'ai donc essayé de consigner les paramètres d'entrée à l'aide de la classe Logger et de copier ces variables dans de nouvelles variables locales. Mais tout ce que je suis venu avec était undefined.

Un autre indice étrange est que typeof des paramètres retourne String. Mais obtenir leur longueur génère une erreur et essayer de les concaténer avec une autre chaîne renvoie la chaîne "indéfinie" (voir mon vidage d'écran).

enter image description here

Je cherche des idées sur ce qui se passe ici.

29
Jpsy

Le débogueur ne vous ment probablement pas - si vous lancez cette fonction dans le débogueur, aucun paramètre ne lui sera transmis. Pas de problème, cependant, vous devez simplement vous assurer que vous obtenez les valeurs à utiliser pour le débogage. Jetez un oeil à Comment puis-je tester une fonction de déclenchement dans GAS? , qui illustre des techniques pouvant être appliquées à des fonctions personnalisées.

Au lieu de définir un événement à transmettre à la fonction, vous souhaiterez fournir (ou extraire de votre feuille de calcul) des valeurs pour les paramètres.

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());
}

Vous avez eu l'idée. Vous pouvez toujours définir des points d'arrêt dans votre fonction ou utiliser debugger pour suspendre l'exécution.


Éditer - examiner des arguments

Quels arguments la fonction personnalisée reçoit-elle lorsqu'elle est appelée depuis une feuille de calcul?

Vous êtes limité dans ce que vous pouvez faire pour déboguer ceci, car le débogueur ne peut pas être utilisé pour examiner votre fonction personnalisée lorsqu'il est appelé à partir de feuilles, et les limitations de sécurité des fonctions personnalisées bloquent la journalisation. Cela suffira peut-être pour comprendre les arguments qui passent. Bien que les fonctions javascript puissent avoir des paramètres nommés, tous les arguments sont transmis sous la forme d'un objet de type tableau, appelé arguments. Cette fonction personnalisée renverra un tableau indiquant les arguments reçus. Lorsqu'il est appelé depuis une feuille de calcul, chaque argument apparaît dans sa propre cellule, en commençant par la cellule dans laquelle vous entrez la fonction:

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

  return argArray;
}

Screenshot

En javascript, il n'y a pas vraiment de types comme int ou float - juste Number. Ces paramètres apparaîtront sans guillemets et ressembleront à des nombres. Les dates arrivent sous forme d'objets Date, mais lorsqu'elles sont imprimées de cette façon, elles apparaissent sous forme de chaînes Date-y. Les chaînes ont des guillemets.

Une fonction personnalisée ne reçoit jamais une plage en tant qu'argument. Lorsque vous fournissez un paramètre d'intervalle dans la feuille de calcul, son contenu est collecté dans un tableau à une ou deux dimensions et le tableau est l'argument.

34
Mogsdad

Vous pouvez utiliser ce hack pour voir la structure des arguments envoyés dans la fonction personnalisée:

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

Les résultats apparaîtront dans votre feuille comme ceci:

 enter image description here

0
Joseph Combs