Письмо на день рождения, пустые строки и неправильные даты - PullRequest
0 голосов
/ 13 мая 2018

У меня есть лист Google со списком имен, адресов электронной почты и дня рождения.Содержимое выглядит примерно так:

--------------------------------------------
| Name      | email        | Birthday      |
--------------------------------------------
| John Doe  | john@doe.com | 2018-05-13    |
| Jane Doe  | jane@doe.com | 2018-05-12    |

Дата в столбце дня рождения проверяется на листе Google как дата, и я использовал указатель даты для ввода этих дат.
Что я хотел бы сделать дальше, это отправить электронное письмо на соответствующий день рождения человеку, но я столкнулся с несколькими проблемами.
Вот код, и я объясню проблемы после:

var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2;  // First row of data to process
var numRows = 1000;   // Number of rows to process
// Fetch the range of cells B2:B1000
var dataRange = sheet.getRange(startRow, 1, numRows, 1000)
// Fetch values for each row in the Range.
var data = dataRange.getValues();

function sendBirthdayEmails() {
  for (i in data) {
    var row = data[i];
    var startday = Utilities.formatDate(row[2], "UTC+2", "MM-dd"); //Store birthday without year
    var today = Utilities.formatDate(new Date(), "UTC+2", "MM-dd"); //Store current date and remove year
    if (today == startday) { //Evaluate if today is a birthday
      var emailAddress = row[1]; // gather the email address
      var message = "Woop woop, " + row[0] + "!<br>Today is your " + (Utilities.formatDate(new Date(), "UTC+1", "yyyy") - Utilities.formatDate(row[2], "UTC+1", "yyyy")) + " year(s) birthday!"; // Create the email message
      var subject = "Your birthday!"; //Set email subject
      //MailApp.sendEmail(emailAddress, subject, message, {htmlBody: message, replyTo: "birthday@example.com", name: "Birthday wishes", bcc: "myself@exmaple.com"}); //Invoke sending the email
    }
  }
}

Я уверен, что есть много более плавных способов справиться с этими вещами, и если есть, дайте мне знать.Однако я в основном сталкиваюсь с двумя проблемами:
1. По причинам, которые я не могу объяснить, дата из столбца дня рождения оценивается как предыдущий день в 22:00.Это звучит как проблема часового пояса, так как я в настоящее время нахожусь в UTC + 2 (CEST).Но как мне решить эту проблему?
2. В скрипте возникают проблемы с пустыми строками / ячейками, и при их обработке возникают ошибки, как правильно это исправить?Я предполагаю, что то, что я делаю выше, когда извлекаю строки со 2 по 1000, может быть сделано лучше?

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 14 мая 2018

Я посмотрел ваши данные и повторил ошибку:

У меня есть ячейка, которая содержит «2018-05-13». Столбец форматируется как Дата, а для проверки данных устанавливается Дата. В настройках электронной таблицы указано, что часовой пояс - GMT, а в свойствах сценария - часовой пояс GMT.

var value = SpreadsheetApp.getActiveSheet().getActiveCell();
Utilities.formatDate(value, "GMT", "MM-dd);

Возвращает "05-12", что неверно на 1 день.

Многие копаются в поисках этого решения :

Utilities.formatDate(value, Session.getScriptTimeZone(), "MM-dd");

Что возвращает правильное значение.

Session.getScriptTimeZone() возвращает значение «Европа / Лондон» для меня, которое должно учитывать летнее время и заставляет Utilities.formatDate вести себя по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...