Débogage d'une fonction personnalisée dans le Script Googleapps

j'essaie de créer ma première fonction personnalisée pour un tableur Google dans le Script Apps et j'ai du mal à utiliser le débogueur.

je travaille sur le custom function demo code de la documentation Google et j'ai défini un point de rupture dans la fonction custom drivingDistance(origin, destination) qui est utilisé 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 transmis à la fonction undefined . Le contenu de toutes les autres variables qui sont créés pendant l'exécution s'affiche correctement (tant qu'ils ne dépendent pas sur les paramètres d'entrée).

chose drôle est que, bien que les paramètres d'entrée soient affichés comme non définis, les calculs de la fonction réussir, il semble donc que ce soit un problème de débogueur. Malheureusement, ce problème m'empêche d'apprendre avec succès à créer et déboguer mon propre code (car je vais devoir travailler avec des entrées complexes). paramètre.)

j'ai le sentiment que le problème est lié à l'exécution côté serveur du Script Apps, donc j'ai essayé de journaliser les paramètres d'entrée en utilisant la classe Logger et j'ai aussi essayé de copier ces variables dans de nouvelles variables locales. Mais tout ce que j'ai trouvé, c'est undefined .

une autre indication étrange est que typeof des paramètres renvoie String . Mais obtenir la longueur d'eux déclenche une erreur et essayer de les concaténer avec une autre chaîne renvoie la chaîne "undefined" (voir mon dump d'écran).

enter image description here

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

24
demandé sur Rubén 2013-11-29 18:51:03

1 réponses

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 soucis, cependant, vous avez juste besoin de vous assurer que vous obtenez des valeurs à utiliser pour le débogage. Jetez un oeil à Comment puis-je tester une fonction de déclenchement dans le gaz? , qui montre des techniques qui peuvent être appliquées pour des fonctions personnalisées.

au lieu de définir un événement à passer à la fonction, vous voudrez fournir (ou extraire de votre tableur) les valeurs des 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 comprenez. Vous pouvez toujours définir des points de rupture à l'intérieur de votre fonction, ou utiliser debugger pour arrêter l'exécution.


Modifier, - d'examiner les arguments

quels arguments la fonction personnalisée reçoit - elle lorsqu'elle est appelée à partir d'une feuille de calcul?

vous êtes limité dans ce que vous pouvez faire pour déboguer ceci, depuis le débogueur ne peut pas être utilisé pour examiner votre fonction personnalisée lorsqu'elle est invoquée à partir de feuilles, et les limitations de sécurité sur les fonctions personnalisées bloquent L'enregistrement. Il pourrait être suffisant d'obtenir une compréhension de l'argument passant en général. Alors que les fonctions javascript peuvent avoir des paramètres nommés, tous les arguments sont passés comme un objet de type tableau, appelé arguments . Cette fonction personnalisée retournera un tableau qui rapportera les arguments reçus. Lorsqu'il est appelé à partir d'un tableur, chaque argument apparaîtra dans sa propre cellule, à partir de 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 - just 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 cordes ont des guillemets.

une fonction personnalisée ne reçoit jamais une plage comme argument; quand vous fournissez paramètre de portée dans le tableur, son contenu est collecté dans un tableau unidimensionnel ou bidimensionnel, et le tableau est l'argument.

31
répondu Mogsdad 2017-05-23 11:54:25