我正在尝试在满足多个条件时计算一些行。一切都很好,但我错了。使用数组对我来说很痛苦(仍在努力改进)。下面你可以找到我的代码,我也有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 :(得分: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;
}