loops - 问:Google Apps 脚本中的循环错误:无法读取未定义的属性“长度”
问题描述
我得到了Error: Cannot read property length of undefined
并且不太明白这个问题。
从 stackoverflow 的其他帖子中,我发现该函数无法确定解析对象的长度。
我正在做的是以下内容:
我确实将谷歌股票价格的历史数据导入=Index(GOOGLEFINANCE("NASDAQ:GOOG";"price";HEUTE()-60;HEUTE());;2)
到我的电子表格中。然后我从数据中计算出 21 个简单移动平均线=average(A128:A148)
。
现在我比较股价和 21 SMA 以确定股价是高于还是低于 21 SMA。到目前为止,一切都很好。
最后我尝试编写一个函数,从最新的 Value 开始计算 21 SMA 以上的天数。
function daysabove(input){
var output = 0;
for (var i = input.length-1;i>= 0;i--){
if (input[i][0]=="over" ){
if (input[i+1][0]=="under"){
output++;
break;
}
else {
output++;
}
} `
else {
output--;
}
}
return output;}
在电子表格上,我用=daysabove(C129:C148)
. C129 至 C148 包含高于或低于。
编辑:我什至尝试在包含手动编写的“上方”和“下方”的范围内运行该功能,以便与谷歌金融没有任何联系。还是不行。
所以回到问题:应该定义长度或对象。这里有什么问题?
解决方案
错误:无法读取未定义的属性长度
发生这种情况,因为input
未定义,当从脚本编辑器调用并且没有长度属性时,因为您没有将任何值作为输入传递给function daysabove
.
错误:无法从未定义中读取属性 [0]
发生这种情况是因为i+1
计算结果超出了索引范围。说,你执行=daysabove(C1:C4)
。C1:C4 将全部“结束”。
for (var i = input.length-1;i>= 0;i--){
if (input[i][0]=="over" ){
if (input[i+1][0]=="under"){
input.length
将是 4;
input.length-1
将是 3;
i
初始化为 3;
请注意,在 javascript 数组中,第一个元素的索引为 0;
["over","over","over","over"]的索引从前到后分别为0,1,2,3;
input[i][0]
==input[3][0]
将是 C1:C4 中的最后一个元素;下一条
语句要求 i+1,即 ,即。Undefined 不是数组。因此我们无法读取 undefined 的属性 [0]。
如果您要进行自下而上的循环,请确保一切都颠倒过来。因此,您的循环可以通过使用as next 语句并将 for-condition 更改为. 还有其他语法错误。考虑查看数组并学习教程input[4]
undefined
input[i-1][0]
i>0
无论如何,
正如官方文档中所写,
无法通过 Sheets API 或Apps 脚本下载或访问历史数据。 如果您尝试这样做,您将看到 #N/A 错误代替电子表格相应单元格中的值。
无论如何,您的脚本都会失败,因为它引用了历史谷歌财务数据。
如果您只想计算天数以上的天数,请使用
=COUNTIF(C1:C4,"over")-COUNTIF(C1:C4,"under")