19

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

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

使用谷歌脚本。未定义的是 while 语句,其中 while(name != data[i][0]) 声称您无法从未定义中读取属性“0”。这有什么奇怪的,如果我删除了 while 语句中的 data[i][0],它仍然可以在 logger.log 中使用。以及其他任何地方。到底他妈发生了什么?

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

4

5 回答 5

4

while 增加i。所以你得到:

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

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

于 2013-09-22T18:56:34.640 回答
4

看起来您正在尝试做的是访问“数据”数组中未定义值的属性“0”。如果您查看您的 while 语句,似乎正在发生这种情况,因为您为每个循环将 'i' 递增 1。因此,第一次通过时,您将访问“data[1]”,但在下一个循环中,您将访问“data[2]”等等,无论数组的长度如何。如果您从未在数组中找到属性“0”等于“名称”的项目,这将导致您最终命中未定义的数组元素。

将您的 while 语句修改为此...

for(var iIndex = 1; iIndex <= data.length; iIndex++){
    if (data[iIndex][0] === name){
         i = iIndex;
         break;
    };
    Logger.log(data[iIndex][0]);
 };
于 2013-09-22T19:05:02.707 回答
2

检查您的数组索引以查看它是否被越界访问。

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

JavaScript 的调试信息很差。在您的情况下,我认为访问权限可能超出范围。

于 2015-06-14T22:06:20.093 回答
0

For me, the problem was I was using a package that isn't included in package.json nor installed.

import { ToastrService } from 'ngx-toastr';

So when the compiler tried to compile this, it threw an error.

(I installed it locally, and when running a build on an external server the error was thrown)

于 2020-11-08T10:26:43.847 回答
-4

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

于 2017-09-11T06:27:08.670 回答