无法从undefined中读取属性

时间:2017-06-08 14:05:37

标签: google-apps-script

我有以下代码,它可以正常运行并完成它应该做的事情。

然而我的桌子顶部有两排我不感兴趣(他们也不会匹配if子句,因此它不会影响我,只是试图弄清楚这一点)所以我试图定制我的范围以简单地排除它们。

我所做的只是将getRange中的A1更改为A3,并且它将无法读取属性" 1" from undefined(指if语句中的硬编码1)。

我不明白为什么它未定义的原因是因为改变这样的范围根本不应该影响它,因为我从A1减去我的范围:B6(在我的工作表中有6行,其中前两行是空的或不需要)到A3:B6,但是集合(A3)中的第一个值仍然应该在[0] [0]内部结束' data&#39 ; ...除非getValues()混淆了我不知道的事情......

var lastRow = sheet.getLastRow();
var myRange = sheet.getRange("A1:B" + lastRow);
var options = new Array();  
var data = myRange.getValues();
for(var i = 0; i < lastRow; i++) {
    if(data[i][1] == region)
    {
     options.push(data[i][0]);
    }
} 

谢谢!

2 个答案:

答案 0 :(得分:2)

您的错误源自 for 循环;它希望迭代超过6行( i 从0开始并递增1到5),当你真正想要的是迭代超过4行匹配范围A3 :B6。所以数组只有4个元素,但你的for循环试图引用不存在的第5个元素。

最简单的解决方案是使用Array对象的内置数组方法(在本例中我使用forEach)来迭代特定于您定义的范围内的项目,如下所示:

var range = sheet.getRange("A3:B"), // you automatically reference the last row with A3:B, no need for A3:B6
    options = [],
    region = '[some-region-value]';

range.getValues().forEach(function(row){
    row[1] == region && options.push(row[0]); // exploit short-circuit mechanism in logical AND operator (in this case the operand on the right, the push, only gets executed if the operand on the left is true)
});

答案 1 :(得分:1)

数组索引从零开始。最后一个元素的索引是一个数组的长度(元素总数) - 1.像这样修改你的'for'循环它会起作用

for(var i = 0; i < data.length; i++)

正如前面的海报指出的那样,你从0迭代到函数getLastRow()返回的内容。请记住,它会返回包含中数据的最后一行。它与你的数组无关。