编程语言
首页 > 编程语言> > javascript – 将URL参数传递到Web App脚本中

javascript – 将URL参数传递到Web App脚本中

作者:互联网

这个问题让我想把头发拉出来.我正在尝试将URL参数传递给Google Apps脚本,其中包含我想要呈现的数据的行ID(来自电子表格).我的参数是故事.但是,无论我尝试什么,我都会遇到各种各样的错误.最新的是:

TypeError: Cannot read property “parameter” from undefined. (line 2, file “Code”, project “singleStory”)

下面是我的Code.gs和Index.html文件(项目不完整.这就是我目前所处的位置.)

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>

我用来测试的URL参数是:

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

谁能给我一些关于它为什么不起作用的想法?

解决方法:

TypeError: Cannot read property “parameter” from undefined. (line 2, file “Code”, project “singleStory”)

这告诉您期望包含命名属性“parameter”的对象是未定义的.

查看您的代码(e.parameter.story),它指的是事件参数e.对于那些不熟悉这个的人,当它在部署的Web App中调用时,特别命名的doGet()函数会收到一个event parameter,在本例中名为e.)

为什么在这里未定义?

您可能会看到这一点的一个原因是您是从调试器运行该函数,而不是将其作为Web应用程序进行测试.这不是你的情况,凯文,因为你在浏览器中输入一个URL来尝试启动网络应用程序.

问题最终出现在Templated HTML中.您HTML中的第一个语句是:

<? var data = doGet(); ?>

一旦我们尝试.evaluate()模板,这会导致麻烦,因为它重新调用doGet()函数,这次没有任何事件对象.就是那个时间吐出错误信息.

您可能打算这样做,以便从电子表格中获取数据:

<? var data = getData(); ?>

有了这个改变,你现在收到事件参数e(你总是这样做……),代码继续.直到下一个bug:

ReferenceError: “i” is not defined. (line 3, file “Code”)

现在事情变得棘手,因为在Code.gs中针对此语句报告错误:

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

可是等等!我不是刚刚在第2行定义的吗?是的,它是……但是这个错误是关于evaluate()试图填写模板,而你的代码还没有设置我.您需要分解此语句以首先获取模板,然后为其设置参数,最后对其进行评估.像这样:

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()'

这应该让你滚动.你还有其他错误:

>阻止你的函数是错误的,你想要getData()在全局范围内,而不是在doGet()中.
>您可能需要调试模板,请遵循Debugging templates中的指导.
>模板化代码随附<?因此?>,而不是<?=喜欢这个?>.

标签:javascript,google-apps-script,parameters
来源: https://codeday.me/bug/20191007/1865003.html