当条件满足时错误计数
我想在满足多个条件时计算一些行。一切正常,但我得到了一个错误的计数。使用数组对我来说是痛苦的(仍在努力改进)。下面你可以找到我的代码,我也有这个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天。如果您从样本中打开脚本文件,则可以找到这两个脚本。
谢谢!
你有几个问题:
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;
}
您开始第一个for循环,而不是的数组是基于0的索引在javascript – tommyO
Theres在你的代码中的一个不必要的块语句,我认为它的意图是成为if的一部分。 –