TypeError:无法从undefined中读取属性“0”

时间:2013-09-22 18:52:27

标签: javascript google-apps-script runtime-error

我收到一个非常奇怪的未定义错误:

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" : ""
      });
  }
}

使用googlescript。未定义的是while语句,其中while(name!= data [i] [0])声称您无法从undefined中读取属性“0”。这有什么奇怪的,如果我删除了while语句中的数据[i] [0],它仍然可以在logger.log中运行。在其他地方。到底是怎么回事?

编辑:如果我将while更改为if语句,它也可以。

5 个答案:

答案 0 :(得分:4)

while增加 i 。所以你得到:

data[1][0]
data[2][0]
data[3][0]
...

看起来 name 与任何数据元素都不匹配。因此,while仍会递增,并且您将到达数组的末尾。我建议使用进行循环。

答案 1 :(得分:2)

看起来你要做的是访问'data'数组中未定义值的属性'0'。如果你看一下你的while语句,看起来就会发生这种情况,因为你为每个循环增加了'i'。因此,第一次通过时,您将访问'data [1]',但在下一个循环中,您将访问'data [2]'等等,无论数组的长度如何。如果你从未在数组中找到属性为'0'且等于'name'的项,那么这将导致你最终命中一个未定义的数组元素。

向你提出你的声明......

for(var iIndex = 1; iIndex <= data.length; iIndex++){
    if (data[iIndex][0] === name){
         break;
    };
    Logger.log(data[i][0]);
 };

答案 2 :(得分:1)

检查您的数组索引以查看它是否超出范围。

一旦我访问了类别[0]。后来我将数组名称从类别更改为类别但忘记更改访问点 - 从类别[0]到类别[0],因此我也收到此错误。

JavaScript执行的调试消息很糟糕。在你的情况下,我认为访问可能超出范围。

答案 3 :(得分:0)

对我来说,问题在于我使用的是package.json中未包含或未安装的软件包。

import { ToastrService } from 'ngx-toastr';

因此,当编译器尝试对其进行编译时,它将引发错误。

(我在本地安装它,并且在外部服务器上运行构建时抛出了错误)

答案 4 :(得分:-1)

正常情况下,遇到错误时超出数组范围。 所以,检查你的数组下标。