2014-03-01 62 views
0

我絕對不是專家,並且在簡單的工作流程的Google應用程序腳本中撰寫。一個幫助重複性任務,另外兩個幫助不斷嘗試和學習編程。Javascript/Google Apps腳本for循環查找匹配,但繼續

我正在尋找助手是如何接近以下設置。我不確定是否想要一個「for」循環,也許「if/else」是一種方法。

我將從電子表格中讀取數據,特別是4行4列。其中一列會有日期。我將這些日期與當前日期進行比較,以查看日期是否爲7天前。如果是這樣做,但繼續查看日期,看看是否還有一天也在七天之內,如果是的話也做一些事情。

例如: 日期:2014年2月4日,2014年2月28日,2014年2月11日,2014年2月25日 今天的日期:2014年3月1日

我要循環在日期內,請注意2014年2月28日是在今天的七天之內,併發送一封電子郵件,然後繼續檢查日期,並查看2014年2/25/20也在七天內,併發送另一封電子郵件。

我不是在找我找對如何處理這個答案,

我的思想(粗糙)

for (i=0, i<dates.length; i++) { 
    if (dates[i] <= (different between today's date and dates[i]) { 
    send an email; 
    continue looping; 
    } else if { 
    continue; 
    } 
    } 

希望還挺明白了吧。 :)

編輯:UPDATE* * 這裏是我想出來的那麼遠,下面是日期代碼和電子表格值。

日期在電子表格C1:C4(2014年2月5日,2014年2月15日,2014年2月28日,2014年3月2日)

function calculateDays() { 
    //Gets the dates of schedule 
    var ss = SpreadsheetApp.getActiveSheet(); 
    var dataRange = ss.getRange("C1:C4"); 
    var values = dataRange.getValues(); 

    //Caculation for single day 
    var one_day = (1000 * 60 * 60 * 24); 

    //For loop to get the values from spreadsheet 
    for (i = 0; i < values.length; i++) { 
    //Puts dataRange values into date format 
    var scheduledDays = new Date(values[i]); 
    var today = new Date(); 
    //grabs times from today and scheduled days in millseconds and subtracts 
    var difference = scheduledDays.getTime() - today.getTime(); 
    //divides to get number of dates, rounds, and converts to positive integer 
    var diffDay = Math.abs(Math.floor(difference/one_day)); 
    Logger.log(diffDay); 
} 

我是什麼未來不確定如何循環變量diffDays以確定日期是否在今天的日期之前七天。我知道一個是......可能是我只是累了,但思想會有所幫助。

我試圖

for (j = 0; j < diffDays; j++) { 
    Logger.Log(diffDays[j]); 
} 

作爲一個起點,看看發生了什麼記錄,但它顯示空白......這就是爲什麼我下跌套牢。新問題

下面是使用嗶嘰的推薦代碼更新的代碼 -

更新塞爾回覆爲主。調整了一下,以幫助理解在記錄器中返回給我的值。還要調整爲今天的日期添加7天以獲得比較的未來日期。 (請參見下面的代碼爲補充意見)

function myFunction() { 
    var data = SpreadsheetApp.getActiveSheet().getRange("C1:C4").getValues(); 
    var week = (1000*60*60*24*7); 
    Logger.log('a week is ' + week); 
    var todayDaysTime = new Date().setHours(0,0,0,0); 
    Logger.log('this is today= ' +todayDaysTime); 
    var weekPlusSevenDays = week + todayDaysTime; 
    Logger.log('this is todayDaysTime + a week ' +weekPlusSevenDays); 

    for (i=0 ; i<data.length; i++) { 
    Logger.log('Value of date in cell = '+data[i][0].getTime()); 
    if (data[i][0].getTime() == weekPlusSevenDays) { 
     //send an email; 
     Logger.log('mail sent'); 
    } 
    } 
} 

我已經在電子表格中列C更新日期是2014年3月9日,2014年3月10日,2014年3月11日,和3/12/2014。所以我期望的是代碼將運行,看到電子表格中的值3/11/2014等於todaysDaysTime + week。我正在嘗試使用今天的日期並添加七天,並查看它是否與電子表格中的日期匹配。到目前爲止,它不匹配。這裏是logger.log的副本。

[14-03-04 09:55:09:770 PST]一週是604800000

[14-03-04 09:55:09:770 PST]這是今天= 13939.2億

[14-03-04 09:55:09:770 PST]這是todayDaysTime +一週1394524800000

日期在細胞的[14-03-04 09:55:09 770 PST]值= 13943.52億

[14-03-04 09:55:09:770 PST]日期在單元格中的值= 1394434800000

[14-03-04 09:55:09:770 PST]日期在細胞的值= 1394521200000

日期在細胞的[14-03-04 09:55 ...... 09 771 PST]值= 1394607600000

我不確定爲什麼它不適合未來的日期。我期望有一個完全匹配的電子表格,當電子表格中的日期與今天的日期+一週(7天)匹配時,它會發送一封電子郵件。

任何想法,爲什麼它不匹配?

+0

使用'continue'是不必要的,因爲'for'循環將在它自己完成運行時進入下一次迭代。 – plalx

回答

1

JavaScript日期表示從1970年1月開始計算的毫秒數。要知道,獲得7天前的值非常簡單:您必須從當前值減去正確的毫秒數,在你的例子7*24*3600*1000

要記住這一點,並檢查它自己只需鍵入腳本編輯器這個簡單的語句,並運行任何其他功能則看記錄:

Logger.log('reference JS date = '+new Date(0));// new Date(0) is the reference date for Javascript date objects. 

隨後環路內一個簡單的對比將盡一切你需要。您甚至不必定義else語句,因爲循環將默認繼續。

另一個重要問題是,您從電子表格中讀取的數據是二維數組,即矩陣矩陣,因此您必須使用2個索引來獲取正確的數據。在下面的示例代碼片斷中,我假設日期在第1列,因此我使用索引[0]作爲第二個索引,即選擇列等效的索引。

function myFunction() { 
    var data = SpreadsheetApp.getActiveSheet().getRange(1,1,4,4).getValues(); 
    var sevenDayBeforeToday = new Date().setHours(0,0,0,0)-(7*24*3600*1000);// value in milliseconds, parenthesis are not necessary but make the code more readable imho... 
    Logger.log('sevenDayBeforeToday = '+sevenDayBeforeToday); 
    for (i=0 ; i<data.length; i++) { 
    Logger.log('Value of date in cell = '+data[i][0].getTime()); 
    if (data[i][0].getTime() <= sevenDayBeforeToday) { 
     //send an email; 
     Logger.log('mail sent'); 
    } 
    } 
} 

編輯:這裏是一個使用更容易調試和相同的結果字符串比較的版本。

注意,我查了一個測試SS上面的代碼和它的工作時,時區選項設置一樣表格預期,見下:) enter image description here

function myFunction() { 
    var data = SpreadsheetApp.getActiveSheet().getRange(1,1,4,4).getValues(); 
    var sevenDayAfterToday = new Date().setHours(0,0,0,0)+(7*24*3600*1000);// value in milliseconds, parenthesis are not necessary but make the code more readable imho... 
    Logger.log('sevenDayAfterToday = '+Utilities.formatDate(new Date(sevenDayAfterToday),Session.getScriptTimeZone(),'MM-dd-yyyy')); 
    for (i=0 ; i<data.length; i++) { 
    Logger.log('Value of date in cell = '+Utilities.formatDate(new Date(data[i][0]),Session.getScriptTimeZone(),'MM-dd-yyyy')); 
    if (Utilities.formatDate(new Date(data[i][0]),Session.getScriptTimeZone(),'MM-dd-yyyy') == Utilities.formatDate(new Date(sevenDayAfterToday),Session.getScriptTimeZone(),'MM-dd-yyyy')) { 
     //send an email; 
     Logger.log('mail sent'); 
    } 
    } 
} 

enter image description here

記錄儀
+0

我剛剛發佈了我一直在工作的更新..感謝您的回覆..我會在本週末閱讀和測試檢查..我是在想這件事嗎?好像我的代碼比較冗長......:) – jjones312

+0

我已閱讀您的更新,嘗試添加一些記錄的值,以檢查您是否真的獲得了您期望的單元格...請參閱我有關2維數組的答案。 –

+0

謝謝。我會添加一些額外的日誌 – jjones312