Passer le paramètre URL dans le script de l'application Web

Ce problème me fait envie de me retirer les cheveux. J'essaie de passer un paramètre d'URL au script Google Apps contenant l'ID de ligne (à partir d'une feuille de calcul) pour les données que je souhaite présenter. Mon paramètre est une story . Cependant, je reçois toutes sortes d'erreurs, peu importe ce que j'essaie. Le dernier être:

TypeError: Impossible de lire la propriété "paramètre" de indéfinie. (Ligne 2, fichier "Code", projet "singleStory")

Voici mes fichiers Code.gs et Index.html (Le projet n'est pas complet. C'est exactement là où je suis à ce jour).

Code.gs

 function doGet(e) { var i = e.parameter.story; return HtmlService .createTemplateFromFile('Index') .evaluate() .setSandboxMode(HtmlService.SandboxMode.IFRAME); function getData() { return SpreadsheetApp .openById("1Z582cnr03fkLC7xCca4pcj7QwDtSCS4KGneyFKMgdyo") .getSheetByName("StoryTopics") .getDataRange() .getValues(); } } 

Index.html

 <!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <? var data = doGet(); ?> <div id="container"> <div id="header"> <div id="topicname"> <?= data[i][0] ?> </div> <div id="todaysdate"> <p>As of: <?= new Date() ?></p> </div> <div id="topictype"> <?= data[i][1] ?> </div> <div id="locale"> <?= data[i][2] ?> </div> </div> <div id="contact_container"> <div id="subheader"> </div> <div id="contact_name"> <?= data[i][3] ?> </div> <div id="contact_title"> <?= data[i][4] ?>, <?= data[i][5] ?> </div> <div id="contact_email"> <?= data[i][6] ?> </div> <div id="contact_phone"> <?= data[i][7] ?> </div> </div> <div id="action_container"> <div id="subheader"> </div> <table id="action_table"> <tr> <td> Date: </td> <td> Type: </td> <td> Description: </td> </tr> </table> </div> <div id="story_container"> <div id="story_title"> </div> <div id="story_content"> </div> </div> </div> </body> </html> 

Le paramètre URL + que j'utilise pour tester est:

 https://script.google.com/a/macros/--DOMAIN--/s/--SCRIPTID--/exec?story=3 

Quelqu'un peut-il me donner des idées sur la raison pour laquelle il ne fonctionne pas?

TypeError: Impossible de lire la propriété "paramètre" de indéfinie. (Ligne 2, fichier "Code", projet "singleStory")

Cela vous indique que l'objet que vous souhaitez contenir la propriété nommée "paramètre" est indéfini.

En regardant votre code ( e.parameter.story ), cela se réfère au paramètre d'événement e . Pour ceux qui ne connaissent pas cela, lorsqu'il est invoqué dans une application Web déployée, la fonction doGet() spécialement nommée reçoit un paramètre d'événement nommé e dans cet exemple.)

Pourquoi est-il défini ici?

Une des raisons pour lesquelles vous pourriez voir cela est si vous exécutez la fonction à partir du débogueur, ne le testez pas en tant qu'application Web. Ce n'est pas votre cas, Kevin, puisque vous entrez une URL dans le navigateur pour essayer de lancer l'application Web.

Le problème se révèle être dans le HTML templé . La première déclaration dans votre HTML est:

 <? var data = doGet(); ?> 

Cela provoque des problèmes dès que nous essayons de .evaluate() le modèle, car il ré-invoque la fonction doGet() , cette fois sans aucun objet d'événement. Et c'est ce moment-là qui crache le message d'erreur.

Vous avez probablement l'intention de le faire, à la place, pour obtenir les données de votre feuille de calcul:

 <? var data = getData(); ?> 

Avec cette modification en place, vous recevez maintenant le paramètre d'événement e (que vous avez toujours fait …) et le code continue. Jusqu'au prochain bug:

ReferenceError: "i" n'est pas défini. (Ligne 3, fichier "Code")

Maintenant, les choses deviennent difficiles, car l'erreur est signalée contre cette déclaration dans Code.gs:

 return HtmlService .createTemplateFromFile('Index') .evaluate() .setSandboxMode(HtmlService.SandboxMode.IFRAME); 

Mais attendez! N'avais- i pas été défini dans la ligne 2? Oui, c'était … Cependant, cette erreur concerne l' evaluate() essayant de remplir le modèle, et votre code n'a pas encore défini i pour cela. Vous devrez diviser cette déclaration pour d'abord obtenir le modèle, puis définir des paramètres pour cela, et finalement l'évaluer. Comme ça:

 function doGet(e) { var i = e.parameter.story; // First, get the template var template = HtmlService.createTemplateFromFile('Index'); // Second, set template parameters template.i = i; // Finally, evaluate() the template return template.evaluate() .setSandboxMode(HtmlService.SandboxMode.IFRAME); } // <-- You had this on the other side of 'getData()' 

Cela devrait vous faire rouler. Vous avez d'autres erreurs:

  • Le blocage de vos fonctions est incorrect, vous voulez obtenir getData() à portée globale, pas dans doGet() .
  • Vous devrez probablement déboguer votre modèle, suivre les instructions dans les modèles de débogage .
  • Le code temporel est joint <? thusly ?> <? thusly ?> , Pas <?= like this ?> .