我得到了Error: Cannot read property length of undefined
,但对这个问题不太了解。
从stackoverflow的其他文章中,我发现该函数无法确定已解析对象的长度。
我正在做的是以下事情:
我确实导入了例如Google股票价格中有=Index(GOOGLEFINANCE("NASDAQ:GOOG";"price";HEUTE()-60;HEUTE());;2)
到我的电子表格中。
然后,我用=average(A128:A148)
根据数据计算出21个简单移动平均线。
现在,我将股票价格与21均线进行比较,以确定股票价格高于还是低于21均线。到目前为止,一切都很好。
最后,我尝试编写一个函数,该函数从最新值开始计算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包含上方或下方。
编辑:我什至试图在包含手动编写的“上方”和“下方”的范围内运行该函数,以便与Google财务无关。仍然不起作用。
所以回到问题:应该定义长度或对象。怎么了?
答案 0 :(得分:3)
错误:无法读取未定义的属性长度
之所以会这样,是因为input
是未定义的,当从脚本编辑器调用时没有{length}属性,因为您没有将任何值作为输入传递给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,即input[4]
,即undefined
。未定义不是数组。因此,我们无法读取未定义的属性[0]。
如果您要进行一个自下而上的循环,请确保一切都是相反的。因此,可以通过使用input[i-1][0]
作为下一条语句并将for-condition更改为i>0
来修复循环。还有其他语法错误。考虑查看arrays并参加tutorial
无论如何,
如Official documentation所述,
无法通过Sheets API或 Apps脚本下载或访问历史数据。如果尝试这样做,则会看到#N / A错误,而不是相应单元格中的值。您的电子表格。
您的脚本在任何情况下都会失败,因为它引用了Google的历史财务数据。
如果您只想计算超出此天数的天数,请使用
=COUNTIF(C1:C4,"over")-COUNTIF(C1:C4,"under")