类型错误:无法从未定义中读取属性“参数”。 (第 2 行,文件“Code”,项目“singleStory”)
这告诉您,您期望包含命名属性“parameter”的对象未定义。
查看您的代码(e.parameter.story
),指的是事件参数e
。对于那些不熟悉这一点的人来说,当在部署的 Web 应用程序中调用它时,专门命名的doGet()
函数接收一个事件参数,它被命名为e
在这个例子中。)
Why is e
这里未定义?
您可能会看到这种情况的原因之一是,您是否从调试器运行该函数,而不是将其作为 Web 应用程序进行测试。 Kevin,这不是您的情况,因为您正在浏览器中输入 URL 来尝试启动 Web 应用程序。
问题出在模板化 HTML。 HTML 中的第一条语句是:
<? var data = doGet(); ?>
一旦我们尝试这样做,这就会引起麻烦.evaluate()
模板,因为它重新调用doGet()
函数,这次没有任何事件对象。这是that吐出错误消息的时间。
您可能打算这样做,而不是从电子表格中获取数据:
<? var data = getData(); ?>
完成此更改后,您现在会收到事件参数e
(你总是这样做......)并且代码继续。直到下一个错误:
ReferenceError:“i”未定义。 (第 3 行,文件“代码”)
现在事情变得棘手,因为根据 Code.gs 中的此语句报告错误:
return HtmlService
.createTemplateFromFile('Index')
.evaluate()
.setSandboxMode(HtmlService.SandboxMode.IFRAME);
可是等等!不是i
刚刚在第 2 行定义?是的,它是...但是这个错误是关于evaluate()
正在尝试填写模板,但您的代码尚未设置i
为了那个原因。您需要分解此语句以首先获取模板,然后为其设置参数,最后对其进行评估。像这样:
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()
.
- 您可能需要调试您的模板,请按照中的指导进行操作调试模板.
- 附有模板代码
<? thusly ?>
, not <?= like this ?>
.