Google Apps Script를 통해 날짜를 비교하는 지루한 문제

루슬란 셀 레츠 키

오늘 나는 GAS를 사용하여 두 날짜를 비교하는 문제에 직면했습니다. currentDate오늘 날짜를 scheduledDate포함하고으로 결정된 열에 날짜를 포함 row[3]합니다.

나는 이미 5 시간을 보냈고 (불행 이길 바래요) 여기에서 설명 할 첫 번째 것은 셀 scheduledDate이 채워지 는 방법입니다 . 사용자 정의 함수 (코드는 아래에 있음)를 사용하여 날짜에서 날짜를 =SubtractDaysFromDate('2016'!A54, 8)뺍니다 8. '2016'!A54셀에 결과를 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()확인한 다음 이메일을 보냅니다.

문제는 scheduledDate(에 의해 생성 된 =SubtractDaysFromDate()) 의 날짜의 작은 부분 이 올바르게 인식되지만 다른 부분은으로 인식 및 검색되지 않는 상태로 남아 있다는 것 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

이해를 돕기 위해 여기 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]시트 의 값을 가져 와서 링크에 Рассылка배치 된 변수에 쓰는 방법입니다 . 적절한 사용 방법 일까요?for (var i = 0; i < bookingsData.length; ++i) {2016var mailingTopic = mailingData.row[2];

EvSunWoodard

이것은 매우 멍청하고 문제를 해결하지 못할 수도 있지만 GAS가 때때로 매우 까다 로움을 발견했습니다. 보통은 그냥 버리는 일이지만 스크립트를 직접 편집 할 수 없기 때문에 ...

왼쪽 '('를 d 주위로 움직여보십시오. 작업 순서는 이것을 처리해야하지만 그렇지 않을 수도 있습니다. 그러면 심각한 문제가 발생할 수 있습니다. 그리고 다른 원인이 문제를 일으키는 지 생각할 수 없습니다. 스프레드 시트의 날짜 형식이 올바르지 않은 경우를 제외하고 일부 날짜에만 해당됩니다.

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

시험:

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

편집하다:

이것은 분명히 당신의 후와 정확히 일치하지는 않지만 동일한 SS의 두 시트 사이에 세포를 옮기는 것을 보여줍니다.

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);
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

특정 값에 대한 비교 시간 범위 비교를 위해 날짜를 구문 분석하는 방법

분류에서Dev

Stripe 결제를 Google Apps Script와 통합하는 방법

분류에서Dev

Google Apps Script를 통해 Chrome 탭 열기

분류에서Dev

Python을 통해 Google Apps Script를 어떻게 사용하나요?

분류에서Dev

파일에서 현재 날짜와 현재 날짜를 비교하는 while 루프 문제

분류에서Dev

Google 스프레드 시트의 날짜를 Google Apps Script와 비교하면 부정확 한 부울 값이 반환됩니다.

분류에서Dev

Google Apps Script를 사용하여 Google 스프레드 시트의 값을 기반으로 날짜 선택기에서 날짜를 사용 중지합니다.

분류에서Dev

Google 시트를 반복하여 행 제거-날짜 비교

분류에서Dev

Google Script-스크립트를 통해 변경된 마지막 수정 날짜

분류에서Dev

신속하게 두 날짜를 비교하는 동안 문제

분류에서Dev

Google Apps Script를 사용하여 query.setquery를 현재 날짜로

분류에서Dev

날짜 문제를 비교하는 Symfony 2 PHP

분류에서Dev

JSON 문자열 날짜를 자바 스크립트로 변환 (Google Apps Script)

분류에서Dev

다중 날짜 선택기-$ _POST를 통해 날짜를 보내는 데 문제가 있습니다.

분류에서Dev

날짜를 UTC 문자열로 반환하는 날짜는 하루이지만 비교는 false를 반환합니다.

분류에서Dev

HTMLService / Google Apps Script에서 날짜 선택기를 사용하여 값 반환

분류에서Dev

Apps Script HTML 서비스를 통해 드라이브의 Json에 액세스하여 Google지도를 만듭니다.

분류에서Dev

Google Apps Script에서 행 수를 제한하는 방법은 무엇입니까?

분류에서Dev

기본 날짜 범위를 1 주로 설정하고 입력 한 날짜 범위가 제출 [Ruby on Rails]를 통해 유지되도록합니다.

분류에서Dev

Gumroad API를 Google Apps Script와 통합하는 방법

분류에서Dev

SQLITE3 날짜 쿼리를 MYSQL에 통합하는 문제

분류에서Dev

누구든지 내 날짜 함수가 JS 날짜 개체를 통해 잘못된 변환을 제공하는 이유를 설명 할 수 있습니까?

분류에서Dev

날짜를 포함하지만 형식을 무시해야하는 2 개의 문자열 유형 목록 비교

분류에서Dev

루프를 끝내기 위해 작동하지 않는 문자 비교

분류에서Dev

"날짜를 문자열로 변환 할 수 없습니다"라는 오류가 발생하는 레일에있는 루비의 두 날짜 비교

분류에서Dev

Google Apps Script를 통해 Google 캘린더의 "위치"설정을 가져 오는 방법은 무엇입니까?

분류에서Dev

where 문을 사용하여 날짜를 비교하는 방법?

분류에서Dev

Google Apps Script를 통해 양식을 제출할 때 Access-Control-Allow-Origin 오류 수신

분류에서Dev

for 루프를 통해 숫자의 제곱을 만드는 문제

Related 관련 기사

  1. 1

    특정 값에 대한 비교 시간 범위 비교를 위해 날짜를 구문 분석하는 방법

  2. 2

    Stripe 결제를 Google Apps Script와 통합하는 방법

  3. 3

    Google Apps Script를 통해 Chrome 탭 열기

  4. 4

    Python을 통해 Google Apps Script를 어떻게 사용하나요?

  5. 5

    파일에서 현재 날짜와 현재 날짜를 비교하는 while 루프 문제

  6. 6

    Google 스프레드 시트의 날짜를 Google Apps Script와 비교하면 부정확 한 부울 값이 반환됩니다.

  7. 7

    Google Apps Script를 사용하여 Google 스프레드 시트의 값을 기반으로 날짜 선택기에서 날짜를 사용 중지합니다.

  8. 8

    Google 시트를 반복하여 행 제거-날짜 비교

  9. 9

    Google Script-스크립트를 통해 변경된 마지막 수정 날짜

  10. 10

    신속하게 두 날짜를 비교하는 동안 문제

  11. 11

    Google Apps Script를 사용하여 query.setquery를 현재 날짜로

  12. 12

    날짜 문제를 비교하는 Symfony 2 PHP

  13. 13

    JSON 문자열 날짜를 자바 스크립트로 변환 (Google Apps Script)

  14. 14

    다중 날짜 선택기-$ _POST를 통해 날짜를 보내는 데 문제가 있습니다.

  15. 15

    날짜를 UTC 문자열로 반환하는 날짜는 하루이지만 비교는 false를 반환합니다.

  16. 16

    HTMLService / Google Apps Script에서 날짜 선택기를 사용하여 값 반환

  17. 17

    Apps Script HTML 서비스를 통해 드라이브의 Json에 액세스하여 Google지도를 만듭니다.

  18. 18

    Google Apps Script에서 행 수를 제한하는 방법은 무엇입니까?

  19. 19

    기본 날짜 범위를 1 주로 설정하고 입력 한 날짜 범위가 제출 [Ruby on Rails]를 통해 유지되도록합니다.

  20. 20

    Gumroad API를 Google Apps Script와 통합하는 방법

  21. 21

    SQLITE3 날짜 쿼리를 MYSQL에 통합하는 문제

  22. 22

    누구든지 내 날짜 함수가 JS 날짜 개체를 통해 잘못된 변환을 제공하는 이유를 설명 할 수 있습니까?

  23. 23

    날짜를 포함하지만 형식을 무시해야하는 2 개의 문자열 유형 목록 비교

  24. 24

    루프를 끝내기 위해 작동하지 않는 문자 비교

  25. 25

    "날짜를 문자열로 변환 할 수 없습니다"라는 오류가 발생하는 레일에있는 루비의 두 날짜 비교

  26. 26

    Google Apps Script를 통해 Google 캘린더의 "위치"설정을 가져 오는 방법은 무엇입니까?

  27. 27

    where 문을 사용하여 날짜를 비교하는 방법?

  28. 28

    Google Apps Script를 통해 양식을 제출할 때 Access-Control-Allow-Origin 오류 수신

  29. 29

    for 루프를 통해 숫자의 제곱을 만드는 문제

뜨겁다태그

보관