2014-12-04 75 views
0

作为相当新手,当涉及到编码时,我遇到了这个问题与我的代码: 我使用谷歌应用脚​​本[编辑:更正谷歌应用引擎到谷歌应用脚​​本]去通过一系列时间戳和过滤器来查找与当前月份相同的邮票。因此,我加载电子表格,相应的表格并从所有行中获取数据作为对象。如果在for循环引用中增加变量

在下一步中,我会遍历对象的所有元素,并检查它们是否包含当前日期。

/* 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 App Engine。 Google Apps脚本在Google云端硬盘上运行,Google App Engine是完全独立的产品,可运行以Python,Java,PHP或GO开发的应用程序,而不是Google Apps脚本。名字有点混乱。如果您在Apps Script上寻求帮助,请不要使用Google App Engine这个词,否则您会得到令人误解的结果。 – 2014-12-04 13:29:13

+0

谢谢你的提示。我改变了我的帖子以清除它。 :-) – nehalem 2014-12-04 14:59:30

回答

0

的原因,你的原码不起作用是由于你的其他块return语句。返回立即退出函数,所以你的循环永远不会超过IF的第一个“假”。

删除“返回”(或其他块),你的代码应该工作。

+0

谢谢,这的确有诀窍。我仍然处于一个非常基础的层面,但是甚至可以找到帮助解决微不足道的错误。 – nehalem 2014-12-04 15:00:33

+0

很高兴能有所帮助。通常在编程中我们会做出假设,导致我们朝错误的方向发展,在这种情况下,您假设循环全部运行了9次,实际上并非如此。对于被他们的代码行为困惑的人来说,我的头号技巧是“检查你的假设!”。在这种情况下,如果你已经放了一台记录器。日志(ⅰ);紧接在for循环之后,你会看到它没有达到7,这可能会引导你走向返回语句。快乐的编码! – 2014-12-04 16:55:51

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 2014-12-04 15:03:45

+0

这可以用正则表达式来完成。如果您创建新问题,我可以帮助向您展示如何使用它。 – John 2014-12-04 17:40:58