2017-09-13 99 views
0

我想在滿足多個條件時計算一些行。一切正常,但我得到了一個錯誤的計數。使用數組對我來說是痛苦的(仍在努力改進)。下面你可以找到我的代碼,我也有這個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

你有幾個問題:

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; 
} 
1
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]); 
    } 

返回循環,這大概應該是外部的(這樣後返回循環,而不是之後的第一循環)內。

0

您無條件地在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; 
}