2013-09-22 4 views
7

Я получаю очень странную неопределенную ошибку: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, в котором while (name! = Data [i] [0]) утверждает, что вы не можете прочитать свойство «0» из undefined. Что странно в этом, если я удалю данные [i] [0] в инструкции while, он все равно работает в logger.log. И везде. Что, черт возьми, происходит?

EDIT: Если я изменяю while на оператор if, он также работает.

+0

- это массив данных, основанный на 1? Обычно они начинаются с индекса 0 ... – rene

+0

, вы должны проверить размерность родительского массива для существования, прежде чем пытаться использовать дочернее измерение, 'if (typeof (data [i])! ==" undefined ")' и предотвратить цикл while от выхода из массива bounds 'data [i] .length' будет указывать количество элементов в нем. –

+4

Вы увеличиваете 'i' без учета границ. – user2736012

ответ

4

Приращение i. Таким образом, вы получите:

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

Похоже имя не соответствует ни одному из элементов данных. Таким образом, пока все еще увеличивается, и вы достигаете конца массива. Я предлагаю использовать для цикла.

+0

'i' начинается с 1 в коде OP, он никогда не будет' data [0] ' – rene

+0

Согласен. Ответ изменен. – Krasimir

1

Похоже, что вы пытаетесь получить доступ к свойству '0' неопределенного значения в массиве 'data'. Если вы посмотрите на свой оператор while, похоже, это происходит, потому что вы увеличиваете число «i» на 1 для каждого цикла. Таким образом, в первый раз вы получите доступ к «данным [1]», но в следующем цикле вы получите доступ к «данным [2]» и т. Д. И т. Д., Независимо от длины массива. Это приведет к тому, что вы в конечном итоге удалите элемент массива, который не определен, если вы никогда не найдете элемент в своем массиве с свойством «0», которое равно «имя».

Ammend ваше время заявления к этому ...

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

Проверьте индекс массива, чтобы увидеть, если он доступен из границы.

Как только я получил доступ к категориям [0]. Позже я изменил имя массива из категории в категорию, но забыл изменить точку доступа - от категорий [0] до категории [0], таким образом, я также получаю эту ошибку.

JavaScript выполняет плохое отладочное сообщение. В вашем случае, я полагаю, что доступ выходит из строя.

0

При нормальных обстоятельствах, из массива при возникновении ошибки. Итак, проверьте uo ваш индекс массива.

+0

Это может быть комментарий. Ответ должен быть более объяснен некоторыми кодами/ссылками/пояснениями. – Ironic

Смежные вопросы