2016-07-27 2 views
0

В настоящее время я пишу сценарий статистики для моей гильдии, в котором читается класс одного человека и рассчитывается его на статистическом листе.Цикл «для» для значений электронной таблицы Google, а не цикл

По какой-то причине петли for не работают. Когда я выполняю скрипт, он ничего не делает. Все, что до цикла for, похоже, работает. Я использовал отладчик и установил точку отладки с точки цикла for, и окно открывается и закрывается через 1 секунду.

Это мой код, как сейчас:

function addToStatistik() { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();   

    var source_sheet = spreadsheet.getSheetByName("Raid Montag");  
    var source_range_names = source_sheet.getRange("C4:C13"); 
    var source_range_setup_boss1 = source_sheet.getRange("M4:M13"); 

    var target_sheet = spreadsheet.getSheetByName("Statistik");  
    var target_range_names = target_sheet.getRange("A4:A31"); 
    var target_range_boss1 = target_sheet.getRange("K4:S31"); 


    target_sheet.getRange(2,1).setValue("Debug1"); //testing stuff 
    for (var i=0; i < source_range_names.length; i++) { 
    for (var j=0; j < target_range_names.length; j++) { 
     if (source_range_names[i][0] == target_range_names[j][0]) { 
     if (source_range_setup_boss1[i][0].indexOf("War") > -1) { 
      target_sheet.getRange(9,5).setValue("TEST"); 
     } 
     } 
    } 
    } 
} 

Кто-то может найти какие-либо ошибки там? Я ничего не могу найти, и Google тоже не помогает мне.

ответ

2

Вы получаете диапазон, но не значения. Эта строка:

var source_range_names = source_sheet.getRange("C4:C13"); 

получает диапазон, но не любые значения.

Должно быть:

var source_range_names = source_sheet.getRange("C4:C13").getValues(); 

Внешний цикл никогда не петли. Существует нет length диапазона.

for (var i=0; i < source_range_names.length; i++) { 

Вам не нужно менять эту строку, но в данный момент переменная source_range_names это диапазон, а не 2D массив значений.

+0

Спасибо! Теперь, когда вы это сказали, это имеет смысл, но я просто не думал об этом. Могу ли я использовать диапазоны, которые я установил выше, с f.e. .setValue позже, если я просто добавлю .getValues ​​() теперь на каждый диапазон? – derRAV3N

+0

Если вам нужно использовать диапазон (или любую переменную) более одного раза, вы можете захотеть иметь переменную только для диапазона. Затем вы можете повторно использовать эту переменную. Нужно ли создавать переменную для чего-то, зависит от того, сколько раз вам нужно повторно использовать ее, и, возможно, читаемость кода. Возможно, вы захотите использовать 'SpreadsheetApp.flush()', чтобы обновлять ожидающие изменения, если у вас есть код, который считывает значения очень скоро после внесения изменений. –

+0

Хорошо, спасибо, я посмотрю. Другой вопрос, это не та же тема, но как-то возможно получить диапазон в пределах диапазона? У меня есть «var target_range_boss1 = target_sheet.getRange (« K4: S31 »); например, сейчас и хотите установить одну ячейку в этом диапазоне, как этого достичь? – derRAV3N

0

Перед итерации необходимо получить значение диапазона, для достижения этой цели необходимо использовать метод getValues() или getDisplayValues():

function leFunction() { 
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();   
    var source_sheet = spreadsheet.getSheetByName("Raid Montag"); 
    var source_range_names = source_sheet.getRange("A1:C13"); 
    var values_range_names = source_range_names.getDisplayValues(); 

    Logger.log(values_range_names); 

    for (var i=0; i < values_range_names.length; i++) { 
    // Do Something 
    } 

}