开发者问题收集

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