2017-08-02 51 views
2

我想運行一個IF函數來匹配第一列中的日期到「上個月」,最後一列中的日期匹配到「最新日期」並複製並粘貼所有與此條件匹配的行(不包括第一列和最後一列)到列表底部。 這是我運行腳本,它沒有找到任何匹配的,當我知道一個事實,至少有100行符合此條件:IF函數 - 谷歌腳本 - 多個條件

function myFunction() { 
    var MCS = SpreadsheetApp.openById('[ID REMOVED FOR THIS Q]'); 
    var MRB = MCS.getSheetByName('Media Rates Back'); 
    var MRBrange = MRB.getRange(1,1,MRB.getLastRow(),1).getValues(); 
    var dest = MRBrange.filter(String).length + 1; 
    var LM = new Date(); 
    LM.setDate(1); 
    LM.setMonth(LM.getMonth()-1); 
    var LMs = Date.parse(LM); 
    var Datenew = MRB.getRange(MRB.getLastRow(),MRB.getLastColumn()).getValue(); 
    var Datecol = MRB.getRange(1,6,MRB.getLastRow(),1).getValues(); 
    var Datenews = Date.parse(Datenew); 

for(var i=0; i<MRBrange.length; i++) { 

if(Date.parse(MRBrange[i])==LMs && Date.parse(Datecol[i])==Datenews) { 
    var NewRange = MRB.getRange(i,2,(MRB.getLastRow()-i),5); 
    var NewRangeV = NewRange.getValues(); 
    var destination = MRB.getRange(MRB.getLastRow()+1,2); 
Logger.log(NewRange);             

NewRange.copyTo(destination); 


}else{ 
    Logger.log(i); 
} 
}} 

任何幫助,將不勝感激!

+0

您是否嘗試將Date.parse()方法中的數據放入if語句之前的var中?另外,你是否嘗試在兩個不同if語句中分開你的deux比較if(..){if(..){}}? –

+0

我剛剛做出這些更改,但仍然無法正常工作 - 謝謝。我認爲在使用[i] – SerCo

+0

時肯定會出現問題。事實上,您使用的是2維數組,您應該使用[I] [0]而不是簡單的[I]來捕捉正確的值 –

回答

0

我認爲問題可能是MRBrange是一個二維數組。所以我用另一個循環將其轉換爲1d數組。希望這可以幫助。

function myFunction() { 
    var MCS = SpreadsheetApp.openById('[ID REMOVED FOR THIS Q]'); 
    var MRB = MCS.getSheetByName('Media Rates Back'); 
    var MRBrangeA = MRB.getRange(1,1,MRB.getLastRow(),1).getValues();//2d array 
    var MRBrange=[]; 
    for(var i=0;i<MRBrangeA.length;i++) 
    { 
    MRBrange.push(MRBrangA[i][0]);//1d array 
    } 

    var dest = MRBrange.filter(String).length + 1; 
    var LM = new Date();//current day 
    LM.setDate(1);//first day of month 
    LM.setMonth(LM.getMonth()-1);//first day of last month 
    var LMs = Date.parse(LM); 
    var Datenew = MRB.getRange(MRB.getLastRow(),MRB.getLastColumn()).getValue(); 
    var Datecol = MRB.getRange(1,6,MRB.getLastRow(),1).getValues(); 
    var Datenews = Date.parse(Datenew); 

for(var i=0; i<MRBrange.length; i++) { 

if(Date.parse(MRBrange[i])==LMs && Date.parse(Datecol[i])==Datenews) { 
    var NewRange = MRB.getRange(i,2,(MRB.getLastRow()-i),5); 
    var NewRangeV = NewRange.getValues(); 
    var destination = MRB.getRange(MRB.getLastRow()+1,2); 
Logger.log(NewRange);             

NewRange.copyTo(destination); 


}else{ 
    Logger.log(i); 
} 
}} 
0

而不是讓列作爲單獨的範圍,我會得到整個範圍作爲一個數組,然後循環,並檢查兩列。

我還假設您的值被格式化爲工作表中的日期,在這種情況下,您不需要使用Date.parse(),並且您的實際日期邏輯是正確的。

您可以嘗試使用調試器並在IF處設置斷點,以便檢查它所比較的​​值。或者使用Logger.log調用來列出您的比較。

var last_month_column = 1; 
    var newest_date_column = MRB.getLastColumn(); 

    var MRBrange = MRB.getRange(1,1,MRB.getLastRow(),newest_date_column).getValues(); 

    for(var row in MRBrange) { 
     if(MRBrange[row][last_month_column]==LMs && Datecol[row][newest_date_column] ==Datenews) { 
      /* your copy logic here */ 
     }else{ 
      Logger.log(i); 
     } 
    }