当条件满足时错误计数

问题描述:

我想在满足多个条件时计算一些行。一切正常,但我得到了一个错误的计数。使用数组对我来说是痛苦的(仍在努力改进)。下面你可以找到我的代码,我也有这个sample当条件满足时错误计数

function countD() 
{ 
    var ss=SpreadsheetApp.openById('1FoHkogaCMpozdRsVdErMNbQTaTgZaG5DORO_4kGHKl8'); 
    var sh=ss.getSheetByName('Response Data'); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    var td = Utilities.formatDate(subDaysFromDate(new Date(),1), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
    var mbs = 0; 
    var cities = getCity(); 
    sh.getRange(2, 19, cities.length, 1).setValues(cities); 
// Logger.log(cities); 
    for (var j=1;j<vA.length;j++) 
    { 

    var d = Utilities.formatDate(new Date(vA[j][0]), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
     if(vA[j][2]=="ABC1" && d==td && vA[j][10]=="Appointment booked" && vA[j][17]=='London') 
     Logger.log(vA[j][10]); 
     { 
     mbs++; 
     } 
     Logger.log(mbs) 
    return mbs; 
    } 

    } 

它每次都返回值1.我在这个脚本里还有两个其他的函数。 getCity()其中提取L列的城市和subDaysFromDate(),它获得今天的日期和减去n天。如果您从样本中打开脚本文件,则可以找到这两个脚本。

谢谢!

+0

您开始第一个for循环,而不是的数组是基于0的索引在javascript – tommyO

+0

Theres在你的代码中的一个不必要的块语句,我认为它的意图是成为if的一部分。 –

你有几个问题:

1)你的循环从j = 1开始。 JavaScript中的数组从零开始,所以你可能打算从j = 0开始。如果你故意跳过j = 0,那么不要介意。

2)return mbs;语句里面的for循环,所以对循环将执行只有一个时间,然后返回COUNT天

3)你做的if(vA[j][2]=="ABC1" && d==td && vA[j][10]=="Appointment booked" && vA[j][17]=='London')检查后,会立刻有一个logger.log声明这是而不是里面的大括号。这样做意味着一条语句 - 日志语句 - 是条件为真时将执行的全部内容。之后的部分{ mbs++; }与if语句完全无关,并且将始终运行。

所以这里的固定代码:

function countD() { 
    var ss = SpreadsheetApp.openById('1FoHkogaCMpozdRsVdErMNbQTaTgZaG5DORO_4kGHKl8'); 
    var sh = ss.getSheetByName('Response Data'); 
    var rg = sh.getDataRange(); 
    var vA = rg.getValues(); 
    var td = Utilities.formatDate(subDaysFromDate(new Date(), 1), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
    var mbs = 0; 
    var cities = getCity(); 
    sh.getRange(2, 19, cities.length, 1).setValues(cities); 
    // Logger.log(cities); 

    for (var j = 0; j < vA.length; j++) { 
     var d = Utilities.formatDate(new Date(vA[j][0]), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
     if (vA[j][2] == "ABC1" && d == td && vA[j][10] == "Appointment booked" && vA[j][17] == 'London') { 
      Logger.log(vA[j][10]); 
      mbs++; 
     } 
     Logger.log(mbs) 
    } 
    return mbs; 
} 

if(vA[j][2]=="ABC1" && d==td && vA[j][10]=="Appointment booked" && vA[j][17]=='London') 
    Logger.log(vA[j][10]); 
    { 
    mbs++; 
    } 

上的代码记录只有在当条件为真。 mbs++然而是总是执行(包装{ }是无用的)。你可能想这样做:

if(vA[j][2]=="ABC1" && d==td && vA[j][10]=="Appointment booked" && vA[j][17]=='London')  
    { 
    mbs++; 
    Logger.log(vA[j][10]); 
    } 

返回循环,这大概应该是外部的(这样后返回循环,而不是之后的第一循环)内。

您无条件地在for循环中返回mbs。你的循环只运行一次。

MBS也总会有1的值,因为该块实际上不是由你的if语句来实现:

{ 
    mbs++; 
} 

,你登录的是什么将你的病情,该代码中受影响的行上面的块将无条件运行。

最后,我想这是你想要什么来实现(我没有测试过这一点,你可能有更多的bug):在索引1

function countD() { 
    var ss=SpreadsheetApp.openById('1FoHkogaCMpozdRsVdErMNbQTaTgZaG5DORO_4kGHKl8'); 
    var sh=ss.getSheetByName('Response Data'); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    var td = Utilities.formatDate(subDaysFromDate(new Date(),1), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
    var mbs = 0; 
    var cities = getCity(); 
    sh.getRange(2, 19, cities.length, 1).setValues(cities); 
    for (var j=1;j<vA.length;j++) { 

     var d = Utilities.formatDate(new Date(vA[j][0]), Session.getScriptTimeZone(), "dd/MM/yyyy"); 
     if(vA[j][2]=="ABC1" && d==td && vA[j][10]=="Appointment booked" && vA[j][17]=='London') 
     { 
      Logger.log(vA[j][10]); 
      mbs++; 
     } 
     Logger.log(mbs) 

    } 
    return mbs; 
}