首页 > 解决方案 > 问: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 包含高于或低于。

编辑:我什至尝试在包含手动编写的“上方”和“下方”的范围内运行该功能,以便与谷歌金融没有任何联系。还是不行。

所以回到问题:应该定义长度或对象。这里有什么问题?

标签: loopsgoogle-apps-scriptgoogle-sheetsgoogle-finance

解决方案


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

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

推荐阅读