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