TypeError:无法从未定义读取属性“0”
2013-09-22
191189
我收到一个非常奇怪的未定义错误:
function login(name,pass) {
var blob = Utilities.newBlob(pass);
var passwordencode = Utilities.base64Encode(blob.getBytes());
var ss = SpreadsheetApp.openById("");
var sheet = ss.getActiveSheet();
var data = sheet.getDataRange().getValues();
var i=1;
while (name != data[i][0]){
Logger.log(data[i][0]);
i++;
}
if (passwordencode == data[i][1]){
UserProperties.setProperties({
"name" :name,
"pass" : passwordencode
});
Logger.log("You are logged in");
}
else if (passwordencode != data[i][1]) {
Logger.log("You are not logged in");
UserProperties.setProperties({
"name" : "",
"pass" : ""
});
}
}
使用 Google Apps Script。未定义的是 while 语句,其中
while(name != data[i][0])
声称您无法从未定义中读取属性“0”。这有什么奇怪的,如果我删除 while 语句中的
data[i][0]
,它仍然可以在
logger.log
中工作。以及其他地方。到底发生了什么?
编辑:如果我将
while
更改为
if
语句,它也会起作用。
3个回答
while 循环使 i 递增。因此,您得到:
data[1][0]
data[2][0]
data[3][0]
...
看起来 name 与数据的任何元素都不匹配。因此,while 循环仍然递增,并且您到达数组的末尾。我建议使用 for 循环。
Krasimir
2013-09-22
看起来您试图做的是访问“data”数组中未定义值的属性“0”。如果您查看 while 语句,似乎会发生这种情况,因为您每次循环都会将“i”增加 1。因此,第一次循环时,您将访问“data[1]”,但在下一次循环中,您将访问“data[2]”,依此类推,无论数组的长度是多少。如果您在数组中从未找到属性为“0”且等于“name”的项目,这将导致您最终遇到未定义的数组元素。
将您的 while 语句修改为...
for(var iIndex = 1; iIndex <= data.length; iIndex++){
if (data[iIndex][0] === name){
i = iIndex;
break;
};
Logger.log(data[iIndex][0]);
};
Justin Russo
2013-09-22
检查数组索引,看看是否超出范围访问。
有一次我访问了 categories[0]。后来我将数组名称从 categories 更改为 category,但忘记更改访问点——从 categories[0] 更改为 category[0],因此我也收到此错误。
JavaScript 的调试消息很差。对于你的情况,我认为访问可能超出范围。
Daniel C. Deng
2015-06-14