通过 Google Apps 脚本比较日期的繁琐问题
Tedious issue with comparing dates through Google Apps Script
今天我遇到了使用 GAS 比较两个日期的问题:currentDate
包含今天的日期,scheduledDate
包含列中确定为 row[3]
的日期。
我已经花了 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 = "natalya@berdyanskaya56.ru";
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-го столбца, в котором проставляется статус отправки электропочтовых рассылок гостям.
}
}
要检查输入,转到上面的link,你可以检查名为2016
的sheet(来自这个sheet =SubtractDatesFromDate()
获取要减去的日期)以及 Рассылка
(在此 sheet 我的脚本是 运行)。
为了继续,我的脚本遍历了 sheet 上所有带有这些减去日期 (=SubtractDaysFromDate()
) 的单元格 Рассылка
,并检查当前日期是否等于 scheduledDate
(即包含在此 sheet 上具有 =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
为了更好地理解这里是 link 我的 GS sheet: 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 = "natalya@berdyanskaya56.ru";
Logger.log(formattedCurrentDate + " ==? " + formattedScheduledDate);
}
}
Mu的问题是如何在sheetРассылка
中获取row[2]
的值并将其写入for (var i = 0; i < bookingsData.length; ++i) {
linking中的变量2016
?使用 var mailingTopic = mailingData.row[2];
是正确的方法吗?
这很愚蠢,可能无法解决问题,但是,我发现 GAS 有时非常挑剔。通常我会做一些一次性的事情,但是因为我不能自己编辑脚本...
尝试向左移动“(”,使其位于 d 周围。我知道操作顺序应该处理这个问题,但它可能不会,那么你会遇到严重的问题。我想不出是什么else 只会在某些日期引起问题,除非电子表格中的日期格式不正确,但事实并非如此。所以,而不是这样:
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);
}
今天我遇到了使用 GAS 比较两个日期的问题:currentDate
包含今天的日期,scheduledDate
包含列中确定为 row[3]
的日期。
我已经花了 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 = "natalya@berdyanskaya56.ru";
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-го столбца, в котором проставляется статус отправки электропочтовых рассылок гостям.
}
}
要检查输入,转到上面的link,你可以检查名为2016
的sheet(来自这个sheet =SubtractDatesFromDate()
获取要减去的日期)以及 Рассылка
(在此 sheet 我的脚本是 运行)。
为了继续,我的脚本遍历了 sheet 上所有带有这些减去日期 (=SubtractDaysFromDate()
) 的单元格 Рассылка
,并检查当前日期是否等于 scheduledDate
(即包含在此 sheet 上具有 =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
为了更好地理解这里是 link 我的 GS sheet: 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 = "natalya@berdyanskaya56.ru";
Logger.log(formattedCurrentDate + " ==? " + formattedScheduledDate);
}
}
Mu的问题是如何在sheetРассылка
中获取row[2]
的值并将其写入for (var i = 0; i < bookingsData.length; ++i) {
linking中的变量2016
?使用 var mailingTopic = mailingData.row[2];
是正确的方法吗?
这很愚蠢,可能无法解决问题,但是,我发现 GAS 有时非常挑剔。通常我会做一些一次性的事情,但是因为我不能自己编辑脚本...
尝试向左移动“(”,使其位于 d 周围。我知道操作顺序应该处理这个问题,但它可能不会,那么你会遇到严重的问题。我想不出是什么else 只会在某些日期引起问题,除非电子表格中的日期格式不正确,但事实并非如此。所以,而不是这样:
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);
}