条件满足时错误计数

时间:2017-09-13 14:55:38

标签: javascript arrays google-apps-script

我正在尝试在满足多个条件时计算一些行。一切都很好,但我错了。使用数组对我来说很痛苦(仍在努力改进)。下面你可以找到我的代码,我也有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天。如果从示例中打开脚本文件,则可以找到这两个脚本。

谢谢!

3 个答案:

答案 0 :(得分:1)

你有几个问题:

1)你的循环从j = 1开始。 javascript中的数组从索引0开始,所以你可能意味着从j = 0开始。如果你故意跳过j = 0,那么就不要错过。

2)return mbs;语句在for循环中,因此for循环将只执行一次,然后countD返回

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;
}

答案 1 :(得分:1)

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

仅当if条件为真时,上面的代码才会记录。 mbs++然而总是执行(包装{ }无用)。你可能想这样做:

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

你在循环中返回,这可能应该在外面(这样它在循环之后返回,而不是在第一次循环之后 )。

答案 2 :(得分:0)

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

mbs也将始终具有值1,因为此块实际上不受if语句的影响:

{
    mbs++;
}

您记录的行将受您的条件影响,上述块中的代码将无条件运行。

总之,我认为这是你想要实现的目标(我还没有对此进行测试,你可能还有其他错误):

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;
}