2014-12-04 2 views
0

как новичок, когда дело доходит до кодирования, я столкнулся с этой проблемой с моим кодом: Я использую скрипт Google App Script [Edit: Corrected Google App Engine для скрипта приложения Google] через список временных меток и фильтр для марок, которые соответствуют текущему месяцу. Поэтому я загружаю электронную таблицу, соответствующий лист и получаю данные из всех строк в качестве объекта.Если оператор in for loop ссылается на добавленную переменную

На следующем шаге я прохожу через все элементы объекта и проверяю, содержат ли они текущую дату.

/* Initial data */ 

    var email = "[email protected]"; 
    var spreadsheet = SpreadsheetApp.openById("1bN7PTOa6PwryVvcGxzDxuNVkeZMRwYKAGFnQvxJ_0nU"); 
    var tasklist = spreadsheet.getSheets()[0].getDataRange(); 
    var tasks = tasklist.getValues(); 
    var tasksnum = tasklist.getNumRows(); 

    Logger.log(tasks[7][2]); //Console returns "01.12.2014" 
    Logger.log(tasks[7][2].indexOf(month)); //Console returns "12.2014" 

/* Filter tasks by month */ 

    for (var i = 1; i < 9; i++) { 
    if (tasks[i][2].indexOf(month) >= 0) { 
     Logger.log(tasks[i]); 
    } 
    else { 
     return; 
    } 
    } 

Что сбивает меня с ума, так это следующее: Как указано выше, цикл for не работает. Но если я его так изменяю

if (tasks[7][2].indexOf(month) >= o) { 

это работает как шарм. И этого я не понимаю. я должен быть увеличен до 9, поэтому в какой-то момент должно быть семь. По крайней мере, тогда условие должно быть истинным, и цикл должен возвращать журнал.

Что мне не хватает?

Благодарим вас заблаговременно.

ps: Если я просто следую неправильному пути реализации функции, пожалуйста, дайте мне знать. ps2: Я думаю, что заголовок моего вопроса немного загадочен. Если у вас есть лучшее в виду, я бы хотел изменить его.

+0

Кстати, вы не используете Google App Engine здесь или, по крайней мере, не так, как это важно для вашего вопроса. Скрипт Google Apps работает на Google Диске, Google App Engine - это совершенно отдельный продукт, который запускает приложения, разработанные на Python, Java, PHP или GO, а не в Google Apps Script. Имена немного запутаны. Если вы ищете помощь по скрипту приложений, не используйте термин Google App Engine или вы получите неверные результаты. –

+0

Благодарим вас за эту заметку. Я изменил свой пост, чтобы разобраться. :-) – nehalem

ответ

0

Причины исходный код не работает из-за заявление возвращения в вашем еще блоке. Возврат выходит из функции немедленно, поэтому ваш цикл никогда не пройдет мимо первого «ложного» вашего IF.

удалить «возврат» (или полностью блокировать), и ваш код должен работать.

+0

Спасибо, это действительно помогло. Я все еще на очень базовом уровне, но это здорово, что даже можно найти помощь для тривиальных ошибок. – nehalem

+0

Рад помочь. Часто в программировании мы делаем предположения, которые ведут нас в неправильном направлении, в этом случае вы предполагали, что цикл работает все 9 раз, когда на самом деле это не так. Мой номер один для тех, кто смущен поведением своего кода, - «Проверьте свои предположения!». В этом случае, если вы поставили Регистратор.войти (я); сразу после цикла for, вы бы увидели, что он не доходит до 7, и это могло бы привести вас к заявлению о возврате. Счастливое кодирование! –

0

Я не уверен, что должно быть в переменной month, но я предложил создать строку в соответствии с вашим форматом даты и выполнять сопоставление строк вместо стратегии indexOf(), которую вы пытаетесь использовать. Этот код проверяется и делает только что:

function test() { 
    /* Initial data */ 

    var spreadsheet = SpreadsheetApp.openById(""); 
    var tasklist = spreadsheet.getSheets()[0].getDataRange(); 
    var tasks = tasklist.getValues(); 
    var tasksnum = tasklist.getNumRows(); 

    /* Filter tasks by month */ 
    var today = Utilities.formatDate(
    new Date(), 
    spreadsheet.getSpreadsheetTimeZone(), 
    "dd.MM.yyyy" 
); 

    for(var i=1; i<9; i++){ 
    if (tasks[i][2] == today){ 
     Logger.log(tasks[i]); 
    } 
    } 
} 
+0

Привет, это выглядит действительно намного более элегантным решением. Большое спасибо. :-) Но моя проблема в том, что все метки времени в таблице разные (например: 02.12.2014 17:07:32; 02.12.2014 17:07:32; 02.12.2014 17:07:32). Я хотел бы отфильтровать их по их общей функции, которая составляет месяц и год (12.2014). Или можно переформатировать строку обычного текста из таблицы в соответствии с форматом MM.YYYY? – nehalem

+0

Это можно сделать с помощью регулярного выражения. Я могу показать вам, как использовать его, если вы создаете новый вопрос. – John