簡體   English   中英

循環查找匹配的Javascript / Google Apps腳本,但繼續

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM