0

今日、私はGASを使用して2つの日付を比較する問題に直面しました。と決定された日付がscheduledDateに含まれています。Google Apps Scriptで日付を比較すると面倒な問題が発生しました

私はすでにそれを5時間を費やしてきた(私は不運だったことを願っています)と私たちはここに記述するために最初にすることはscheduledDateで細胞が満たされている方法です開始する前に:カスタム関数を使用して(コードを以下に置かれている)=SubtractDaysFromDate('2016'!A54, 8)、それを'2016'!A54にある日付から8日を減算し、セル内の結果を08/07/2016または08.07.2016(表示形式の設定方法によって異なります)として表示します。ここで

=SubtractDaysFromDate()ソースコードである:ここで

function SubtractDaysFromDate(date, d) { 
    var output = new Date(date.getTime()-d*(24*3600*1000)); // d — количество вычитаемых дней, date — дата или ячейка с датой, из которой вычитается данное количество дней. 
    return output; 
} 

は私のスクリプトのソースコードです:入力を確認するには

function SendElectronicMailing() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheetName = "Рассылка"; // Здесь указывается название листа в таблице. 
var sheet = ss.getSheetByName(sheetName); 
var startRow = 2; // Здесь первая строка для отправки рассылки. 
var numRows = sheet.getLastRow()-1; // Здесь количество строк, которые необходимо обработать для отправки рассылки. 
var dataRange = sheet.getRange(startRow, 1, numRows, 6); 
var data = dataRange.getValues(); 
/* Здесь переменные с тематическими рассылками. */ 
var mailingChildrenHealth = "Здоровье детей перед отдыхом"; 
var mailingNonPersonalized = "–"; 
/* Здесь переменные со статусами электропочтовых рассылок. */ 
var statusMailingAwaiting = "Рассылка ожидает отправки"; 
var statusMailingSent = "Рассылка отправлена"; 
var statusMailingNotRequired = "Рассылка не требуется"; 
    for (var i = 0; i < data.length; ++i) { 
    var row = data[i]; 
    var currentDate = new Date(); 
    var scheduledDate = new Date(row[3]); // Здесь указывается столбец с назначенной датой для отправки электропочтовой рассылки. 
    var formattedCurrentDate = Utilities.formatDate(currentDate, "GMT+0300", "dd.MM.yyyy"); 
    Logger.log(currentDate); 
    var formattedScheduledDate = Utilities.formatDate(scheduledDate, "GMT+0300", "dd.MM.yyyy"); 
    Logger.log("Getting new Date(): " + scheduledDate); 
    Logger.log("Getting plain row[3]: " + row[3]); 
    Logger.log("Using toString() and after replace(): " + row[3].toString().replace(/\./g, "/")); 
    Logger.log("Using valueOf() of row[3]: " + scheduledDate.valueOf()); 
    var bookingNumber = [i+2]; 
    var contactFullName = row[0]; 
    var contactGivenName = contactFullName.split(" ").slice(0, -1).join(" "); 
    var contactEmail = row[1]; 
    var mailingTopic = row[2]; 
    var cheapTicketsFinderLink = "http://go.ruslanchik.ru/"; 
    var mailingStatus = row[4]; // Столбец, в котором выставляется статус отправки/неотправки писем электропочтовой рассылки. 
    var senderName = "Наталья Селецкая (Мини-гостиница Бердянская 56)"; 
    var replyTo = "[email protected]"; 
    Logger.log(formattedCurrentDate + " ==? " + formattedScheduledDate); 


     /* Выставление статуса «Рассылка не требуется» для бронирований, по которым ввиду своего скудоумия не смог настроить отправку рассылки. */ 
     if (currentDate.valueOf() > scheduledDate.valueOf() && mailingStatus == statusMailingAwaiting) { 
     sheet.getRange(startRow + i, 5).setValue(statusMailingNotRequired); 
     Logger.log("Выставлен статус " + "«" + statusMailingNotRequired + "»" + " электропочтовой рассылки для бронирования № " + bookingNumber + " (" + contactFullName + ")" + " по причине несвоевременности её отправки гостю."); 
     } 

     /* Тематическая рассылка для гостей с детьми («забота о здоровье детей») с общей рассылкой о дешёвых билетах в Ейск и обратно. */ 
     if (formattedCurrentDate == formattedScheduledDate && mailingTopic == mailingChildrenHealth && mailingStatus == statusMailingAwaiting) { 
     /* Здесь рассылка о здоровье детей перед отдыхом. */ 
     var subject_children_health = "Email subject"; 
     var message_children_health = "Email body."; 
     MailApp.sendEmail(contactEmail, subject_children_health, message_children_health, {name: senderName, replyTo: replyTo}); 
     /* Здесь рассылка о дешёвых билетах в Ейск и обратно для гостей с детьми. */ 
     var subject_cheap_tickets = "Email subject"; 
     var message_cheap_tickets = "Email body"; 
     MailApp.sendEmail(contactEmail, subject_cheap_tickets, message_cheap_tickets, {name: senderName, replyTo: replyTo}); 
     /* А здесь уже проставление статуса отправки. */ 
     sheet.getRange(startRow + i, 5).setValue(statusMailingSent); 
     Logger.log("Отправлены тематическая и общая электропочтовые рассылки для бронирования № " + bookingNumber + " (" + contactFullName + ")" + " гостю на " + contactEmail + "."); 
     } 
     SpreadsheetApp.flush(); // Здесь завершается обновление ячеек 5-го столбца, в котором проставляется статус отправки электропочтовых рассылок гостям. 
    } 
} 

、あなた上記のリンクに行くことという名前のシートを確認することができます2016(このシートから=SubtractDatesFromDate()には、日付を引きます)とРассылка(このシートのスクリプトが実行されています)。続行するには

、私のスクリプトは、シートの上にこれらを差し引いた日付(=SubtractDaysFromDate())ですべてのセルを通過するには、現在の日付がscheduledDate(すなわち、このシートに=SubtractDaysFromDate()ですべてのセルを含む列)に等しいかどうかРассылкаとチェックと呼ばれます電子メールを送信します。

問題は(=SubtractDaysFromDate()によって結果)scheduledDateの日付の小さな一部が正しく認識されている間、それらの他の部分が認識され、01.01.1970として検索されないことがままあることです。

[16-07-08 14:31:40:171 EAT] 08.07.2016 ==? 01.01.1970 
[16-07-08 14:31:40:172 EAT] Fri Jul 08 14:31:40 GMT+03:00 2016 
[16-07-08 14:31:40:173 EAT] Getting new Date(): Fri Jun 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:173 EAT] Getting plain row[3]: Fri Jun 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:174 EAT] Using toString() and after replace(): Fri Jun 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:175 EAT] Using valueOf() of row[3]: 1464901200000 
[16-07-08 14:31:40:175 EAT] 08.07.2016 ==? 03.06.2016 
[16-07-08 14:31:40:176 EAT] Fri Jul 08 14:31:40 GMT+03:00 2016 
[16-07-08 14:31:40:177 EAT] Getting new Date(): Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:178 EAT] Getting plain row[3]: Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:178 EAT] Using toString() and after replace(): Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:179 EAT] Using valueOf() of row[3]: 1470171600000 
[16-07-08 14:31:40:179 EAT] 08.07.2016 ==? 03.08.2016 
[16-07-08 14:31:40:181 EAT] Fri Jul 08 14:31:40 GMT+03:00 2016 
[16-07-08 14:31:40:181 EAT] Getting new Date(): Invalid Date 
[16-07-08 14:31:40:182 EAT] Getting plain row[3]: #ERROR! 
[16-07-08 14:31:40:182 EAT] Using toString() and after replace(): #ERROR! 
[16-07-08 14:31:40:183 EAT] Using valueOf() of row[3]: NaN 
[16-07-08 14:31:40:183 EAT] 08.07.2016 ==? 01.01.1970 

あなたは上記のコードを見れば、いくつかの日付の比較は完璧に動作しながら、ことは明らかである:

[16-07-08 14:31:40:176 EAT] Fri Jul 08 14:31:40 GMT+03:00 2016 (note: this a current date) 
[16-07-08 14:31:40:177 EAT] Getting new Date(): Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:178 EAT] Getting plain row[3]: Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:178 EAT] Using toString() and after replace(): Wed Aug 03 2016 00:00:00 GMT+0300 (MSK) 
[16-07-08 14:31:40:179 EAT] Using valueOf() of row[3]: 1470171600000 
[16-07-08 14:31:40:179 EAT] 08.07.2016 ==? 03.08.2016 

については

問題を説明するためには、ここでは、スクリプトログですそれらの他の部分は、それはしていません:

[16-07-08 14:31:40:181 EAT] Fri Jul 08 14:31:40 GMT+03:00 2016 (note: this a current date) 
[16-07-08 14:31:40:181 EAT] Getting new Date(): Invalid Date 
[16-07-08 14:31:40:182 EAT] Getting plain row[3]: #ERROR! 
[16-07-08 14:31:40:182 EAT] Using toString() and after replace(): #ERROR! 
[16-07-08 14:31:40:183 EAT] Using valueOf() of row[3]: NaN 
[16-07-08 14:31:40:183 EAT] 08.07.2016 ==? 01.01.1970 

良くundestandについてここに私のGSシートへのリンク:https://docs.google.com/spreadsheets/d/1azDfWZWDSVTVVKLaJZlsRDbW21-Cps8Hx8M2kbclw-g/edit?pli=1#gid=2147296153です。

正常に動作させるために重要なことを忘れていないか確認してください。なぜ=SubtractDatesFromDate()で計算された日付の一部が私のスクリプトによって正しく認識されているのですか?

どうすれば修正できますか?すべての結果指向のこの問題を解決しようとする試みは非常に感謝しています。


編集されました。それは私がすでに編集した私のコードの一部です:

function SendElectronicMailing1() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var bookingsSheetName = "2016"; // Здесь указывается название листа откуда брать даты заезда по бронированиям. 
var mailingSheetName = "M1"; // Здесь указывается название листа где обновлять статусы отправки электропочтовой рассылки. 
var bookingsTableSheet = ss.getSheetByName(bookingsSheetName); 
var mailingListSheet = ss.getSheetByName(mailingSheetName); 
var startRow = 2; // Здесь первая строка для отправки рассылки. 
var bookingsNumRows = bookingsTableSheet.getLastRow()-1; // Здесь количество строк, которые необходимо обработать для отправки рассылки. 
var mailingNumRows = mailingListSheet.getLastRow()-1; 
var bookingsDataRange = bookingsTableSheet.getRange(startRow, 1, bookingsNumRows, 2); 
var mailingDataRange = mailingListSheet.getRange(startRow, 1, mailingNumRows, 6); 
var bookingsData = bookingsDataRange.getValues(); 
var mailingData = mailingDataRange.getValues(); 
/* Здесь переменные с тематическими рассылками. */ 
var mailingChildrenHealth = "Здоровье детей перед отдыхом"; 
var mailingNonPersonalized = "–"; 
/* Здесь переменные со статусами электропочтовых рассылок. */ 
var statusMailingAwaiting = "Рассылка ожидает отправки"; 
var statusMailingSent = "Рассылка отправлена"; 
var statusMailingNotRequired = "Рассылка не требуется"; 
    for (var i = 0; i < bookingsData.length; ++i) { 
    var row = bookingsData[i]; 
    var currentDate = new Date(); 
    var scheduledDate = new Date(row[0]).setHours(0,0,0,0)+(-10*24*3600*1000); // Здесь указывается столбец с назначенной датой для отправки электропочтовой рассылки. Её еще можно считать через new Date().setHours(0,0,0,0)+(-10*24*3600*1000). 
    var formattedCurrentDate = Utilities.formatDate(currentDate, "GMT+0300", "dd.MM.yyyy"); 
    Logger.log("It is a current date: " + currentDate); 
    var formattedScheduledDate = Utilities.formatDate(scheduledDate, "GMT+0300", "dd.MM.yyyy"); 
    Logger.log("Getting new Date() of row " + [i+2] + ": " + scheduledDate); 
    Logger.log("Getting clear value of row " + [i+2] + ": " + row[3]); 
    Logger.log("Using toString() and after replace(): " + [i+2] + ": " + row[3].toString().replace(/\./g, "/")); 
    Logger.log("Using valueOf() of row " + [i+2] + ": " + scheduledDate.valueOf()); 
    var bookingNumber = [i+2]; 
    var contactFullName = row[0]; 
    var contactGivenName = contactFullName.split(" ").slice(0, -1).join(" "); 
    var contactEmail = row[1]; 
    var mailingTopic = mailingData.row[2]; 
    var cheapTicketsFinderLink = "http://go.ruslanchik.ru/"; 
    var mailingStatus = row[4]; // Столбец, в котором выставляется статус отправки/неотправки писем электропочтовой рассылки. 
    var senderName = "Наталья Селецкая (Мини-гостиница Бердянская 56)"; 
    var replyTo = "[email protected]"; 
    Logger.log(formattedCurrentDate + " ==? " + formattedScheduledDate); 
} 
} 

ムーの質問は、シートРассылкаrow[2]の値を取得し、2016にリンクfor (var i = 0; i < bookingsData.length; ++i) {に配置された変数に書き込む方法ですか? var mailingTopic = mailingData.row[2];を使用するのが適切な方法ですか?

+0

スプレッドシートに日付として認識される日付が含まれている場合、getValue/getValuesメソッドはそのセルの日付オブジェクトを返します。文字列ではありません。 'new Date()'を呼び出す必要はありません: 'var scheduledDate = row [3];' –

+0

@Bookendを使用してください。上記のログからログを確認してください。 '[16-07-08 19:23:54:543 EAT]を返す' Logger.log( "行+" i + 2 "+": "+行[3]行54の値をクリア:#ERROR! ' – RLearnsR

+0

@Bookend、それは未知の理由で(私にとって)それを読むことさえありません。 – RLearnsR

答えて

0

これはかなり愚かで、問題を解決できないかもしれませんが、GASが時には非常に厄介であることがわかりました。これは通常、私が使い捨てとして行うことですが、自分でスクリプトを編集することはできません。

左に移動すると 'd'になります。操作の順序はこれを処理しなければなりませんスプレッドシートの日付が間違って書式設定されていない限り、問題の原因となるものはないと思う。これに代えて、そうである:

var output = new Date(date.getTime()-d*(24*3600*1000)); 

試してみてください。

var output = new Date(date.getTime()-(d*24*3600*1000)); 

ED IT:

これは明らかにあなたの後のことではありませんが、同じSS上の2枚のシート間に細胞を移すことを示しています。

function example() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = ss.getActiveSheet(); 
    var sheet2 = ss.getSheetByName('sheet2'); 

    var startRow = 1; 
    var numRows = sheet1.getLastRow()-1; 
    var dataRange = sheet1.getRange(startRow, 1, numRows, 6); 
    var data = dataRange.getValues(); 

    var row = [] 

    for (var i in data) { 
    row.push(data[i] + 10); 
    } 

    sheet2.appendRow(row); 
} 
+0

それを試してみましょう。投稿更新のためにしばらくお待ちください。 – RLearnsR

+0

いいえ、残念ながら、それは助けになりませんでした: '[16-07-08 18:31:06:783 EAT]行54の新しいDate()の取得:無効な日付'。 – RLearnsR

+0

何時にエラーが表示されますか?それは適切に数ヶ月下がっていますか?それとも、それは日付の負の数に入っていますか? – EvSunWoodard

関連する問題