问:Google Apps 脚本中的循环错误:无法读取未定义的属性"length"



我拿到了Error: Cannot read property length of undefined,但不太理解这个问题。

从stackoverflow的其他帖子中,我发现该函数无法确定解析对象的长度。

我正在做的是:

我确实将=Index(GOOGLEFINANCE("NASDAQ:GOOG";"price";HEUTE()-60;HEUTE());;2)的谷歌股价历史数据导入到我的电子表格中。然后用CCD_ 3从数据中计算出21个简单移动平均值。

现在我比较股票价格和21 SMA,以确定股票价格是高于还是低于21 SMA。到目前为止还不错。

最后,我尝试编写一个函数,从最新的值开始计算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,其包含以上或以下。

编辑:我甚至试着在一个包含手动编写的"above"&"under",因此与谷歌金融没有任何联系。仍然不起作用。

所以回到问题上来:应该定义长度或对象。这里怎么了?

错误:无法读取未定义的属性长度

发生这种情况是因为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"){

CCD_ 9将为4
input.length-1将为3
i初始化为3
请注意,在javascript数组中,第一个元素的索引为0
["over"、"over"、"over"one_answers"over"]从前到后的索引分别为0,1,2,3
input[i][0]==input[3][0]将是C1:C4中的最后一个元素
下一个语句调用i+1,即input[4],它就是undefined。未定义不是数组。因此,我们无法读取undefined的属性[0]
如果你要做一个自下而上的循环,那么确保一切都是相反的。因此,可以通过使用input[i-1][0]作为下一个语句并将condition更改为i>0来修复循环。还有其他语法错误。考虑复习阵列并参加教程


无论如何,
如官方文件所述,

历史数据无法通过Sheets API或应用程序脚本下载或访问如果您尝试这样做,您将在电子表格的相应单元格中看到#N/a错误。

您的脚本在任何情况下都会失败,因为它引用了谷歌财务的历史数据。


如果您只想计算下面天数以上的天数,请使用

=COUNTIF(C1:C4,"over")-COUNTIF(C1:C4,"under")

最新更新