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

时间:2018-07-30 12:34:07

标签: loops google-apps-script google-sheets google-finance

我得到了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财务无关。仍然不起作用。

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

1 个答案:

答案 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")