![](/img/trans.png)
[英]How to filter array for only exact match in Google Apps Script/Javascript
[英]Javascript / Google Apps Script for loop find match but continue
我絕對不是專家,請使用Google Apps腳本編寫簡單的工作流程。 一種幫助重復性任務,另一種不斷嘗試和學習編程。
我在尋找助手是如何進行以下設置的。 我不確定是否要考慮使用“ for”循環和“ if / else”循環。
我將從電子表格中讀取數據,特別是4行4列。 其中一列將有日期。 我正在將這些日期與當前日期進行比較,以查看該日期是否早於7天。 如果是這樣,請執行一些操作,然后繼續查看日期以查看是否也有7天在另一天,如果可以,請執行某些操作。
例如:日期:2/4 / 2014、2 / 28 / 2014、2 / 11 / 2014、2 / 25/2014今天的日期:3/1/2014
我想遍歷日期,看到2/28/2014在今天的日期之后的7天內發送一封電子郵件,然后繼續檢查日期,並且看到2/25/2014也在今天的日期的7天內發送另一封電子郵件。
我不是要尋找答案,而是要尋求解決方法,
我的想法(粗略)
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;
}
}
希望有點明白。 :)
編輯:更新 * *這是到目前為止我要提出的...下面是日期的代碼和電子表格值。
電子表格C1:C4中的日期(2/5 / 2014、2 / 15 / 2014、2 / 28 / 2014、3 / 2/2014)
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以確定日期是否在今天的日期之前7天。 我知道一個是..可能是我只是累了,但想法會有所幫助。
我試過了
for (j = 0; j < diffDays; j++) {
Logger.Log(diffDays[j]);
}
作為查看記錄內容的起點,但顯示空白...這就是為什么我陷入困境的原因。
更新基於Serge回復-新問題
這是使用Serge建議代碼的更新代碼。 進行了一些調整,以幫助了解記錄器中返回給我的值。 還要調整添加到今天日期的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列中的日期更新為3/9 / 2014、3 / 10 / 2014、3 / 11/2014和3/12/2014。 因此,我希望代碼可以運行,請參閱電子表格中的3/11/2014值等於TodaysDaysTime + week。 我正在嘗試獲取今天的日期,並在其中添加7天,以查看它是否與電子表格中的日期匹配。 到目前為止,它不匹配。 這是logger.log的副本。
[14-03-04 09:55:09:770 PST]一周是604800000
[14-03-04 09:55:09:770 PST]這是今天= 1393920000000
[14-03-04 09:55:09:770 PST]這是今天DaysTime +一周1394524800000
[14-03-04 09:55:09:770 PST]單元格中的日期值= 1394352000000
[14-03-04 09:55:09:770 PST]單元格中的日期值= 1394434800000
[14-03-04 09:55:09:770 PST]單元格中的日期值= 1394221200000
[14-03-04 09:55:09:771 PST]單元格中的日期值= 1394607600000
我不確定為什么它與將來的日期不正確。 我希望有一個完全匹配的內容,以便當電子表格中的日期與今天的日期+一周(7天)匹配時,它會發送一封電子郵件。
有什么想法為什么不匹配?
JavaScript日期表示從1970年1月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
語句,因為默認情況下循環將繼續。
另一個重要的一點是,您從電子表格中讀取的數據是2D數組,即矩陣矩陣,因此您將必須使用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上檢查了上面的代碼,並且當timeZone設置與電子表格相同時,它按預期工作 ,請參閱下面的記錄器:)
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');
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.