web-dev-qa-db-ja.com

TypeError:未定義からプロパティ「0」を読み取ることができません

私は非常に奇妙な未定義のエラーを受け取っています:

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(name!= data [i] [0])がundefinedからプロパティ "0"を読み取れないと主張するwhileステートメントです。これについて奇妙なのは、whileステートメントでdata [i] [0]を削除しても、logger.logで機能することです。そして他のどこでも。一体何が起こっているのですか?

編集:whileをifステートメントに変更すると、それも機能します。

13
IGratch

Whileはiをインクリメントします。だからあなたは得る:

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

nameはデータのどの要素とも一致しないようです。したがって、whileはまだ増分され、配列の最後に到達します。 forループを使用することをお勧めします。

4
Krasimir

あなたがしようとしていることは、「データ」配列内の未定義値のプロパティ「0」にアクセスしているように見えます。 whileステートメントを見ると、ループごとに「i」を1増やしているため、これが起こっているようです。したがって、最初は「data [1]」にアクセスしますが、次のループでは、配列の長さに関係なく「data [2]」などにアクセスします。これにより、「名前」に等しいプロパティ「0」を持つ配列内の項目が見つからない場合、最終的に未定義の配列要素にヒットします。

While文をこれに修正します...

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

配列インデックスをチェックして、範囲外でアクセスされているかどうかを確認します。

カテゴリにアクセスしたら[0]。後でアレイ名をカテゴリからカテゴリに変更しましたが、アクセスポイントを変更するのを忘れていました。つまり、categories [0]からcategory [0]に変更したため、このエラーも発生します。

JavaScriptは貧弱なデバッグメッセージを行います。あなたの場合、おそらくアクセスが範囲外になると思います。

1
Daniel C. Deng

通常の状況では、エラーが発生すると配列の範囲外になります。したがって、配列の添え字を確認してください。

0
Lee Ran