Сегодня я снова столкнулся с трудностью создания механизма, положив все строк (в моих заказах), которые соответствуют условию (в моем случае дата регистрации) в a одиночный электронная почта.Как вернуть несколько значений из петли в GAS
Проблема заключается в том, что если есть более чем один соответствующей строки (например, , когда несколько возвраты соответствует текущей дате), чем сценарий помещает значения одного и первого обретенной Состояние- сопоставление строки в электронную почту. До сих пор я сделал несколько исследований (для получения дополнительной справки, пожалуйста, проверьте: Email All Rows in Single Email If Dates Match) и преуспел в создании исходного кода, который достигает цели в случае только если есть только одно условие синхронизма строки, а не в наименее два из них.
Вот мой исходный код. В качестве части он проверяет, соответствует ли formattedTodaysDate
formattedCheckInDate
(formattedCheckInDate == formattedTodaysDate
), а затем собирает значения этих строк соответствия условий.
Это не удается скопировать эти значения в сообщение электронной почты, если число условия встречается строки больше 1:
function NotifyChambermaidOfUpcomingArrivalsAndDepartures() {
var ui = SpreadsheetApp.getUi(); // Используется только для тестирования.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // Строка с первым бронированием для начала обработки.
var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки.
var dataRange = sheet.getRange(startRow, 1, numRows, 18); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 18-ый.
var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом.
/* Здесь установка параметров отправителя. */
var message = undefined;
var subject = undefined;
var recipientEmail = "[email protected]"; // Электропочта горничной.
var senderName = "name";
var replyTo = "[email protected]";
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var bookingNumber = [i+2];
var todaysDate = new Date(); // Сегодняшняя дата.
var tomorrowsDate = new Date(todaysDate.getTime()+(1*24*3600*1000)); // Завтрашняя дата.
var dayAfterTomorrowsDate = new Date(todaysDate.getTime()+(2*24*3600*1000)); // Послезавтрашняя дата.
var checkInDate = new Date(row[0]);
var checkOutDate = new Date(row[1]);
var checkInTime = "14:00";
var checkOutTime = "12:00";
var formattedTodaysDate = Utilities.formatDate(todaysDate, "GMT+0300", "dd.MM.yyyy");
var formattedTomorrowsDate = Utilities.formatDate(tomorrowsDate, "GMT+0300", "dd.MM.yyyy");
var formattedDayAfterTomorrowsDate = Utilities.formatDate(dayAfterTomorrowsDate, "GMT+0300", "dd.MM.yyyy");
var formattedCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy");
var formattedCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy");
var fullCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd.MM.yyyy") + " в " + checkInTime;
var fullCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy") + " в " + checkOutTime;
var roomType = "«" + row[2] + "»";
var numberOfGuests = row[3];
var costPerNight = row[4];
var prepaymentCost = row[8];
var formattedCostPerNight = costPerNight + " руб. за номер/ночь";
var formattedPrepaymentCost = prepaymentCost + " руб. предоплата";
var contactFullName = row[5];
var contactPhone = row[6];
var contactEmail = row[7];
var bookingNotes = row[11];
var reviewDummy = row[13];
/* Здесь расчёт промежуточных переменных. */
var numberOfNights = Math.round(Math.abs((checkOutDate.getTime() - checkInDate.getTime())/(24*60*60*1000)));
var unpaidCost = (costPerNight*numberOfNights)-prepaymentCost;
var formattedNumberOfNights = numberOfNights + " ночей"; // Количество ночей проживания.
var formattedUnpaidCost = unpaidCost + " руб. к оплате"; // Сумма, которую необходимо оплатить гостю по приезде.
/* Сегодняшние заезды и выезды. */
var todaysSection = "‖ Сегодня, " + formattedTodaysDate + ":";
/* Сегодняшние заезды. */
if (formattedCheckInDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездами сегодня, но кроме тех, которые уже были отменены гостями.
var todaysArrivalsSection = "• Заезды:";
var todaysArrivalsBookings = roomType + " в " + checkInTime + " (бронирование № " + bookingNumber + ")" + "\nТип размещения: " + numberOfGuests + "\nВыезд: " + fullCheckOutDate + " (" + formattedNumberOfNights + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var todaysArrivalsMessage = todaysArrivalsSection + "\n" + "\n" + todaysArrivalsBookings;
Logger.log("Сформирован набор бронирований для горничной с заездами сегодня: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Сегодняшние выезды. */
if (formattedCheckOutDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с выездами сегодня, но кроме тех, которые уже были отменены гостями.
var todaysDeparturesSection = "◦ Выезды:";
var todaysDeparturesBookings = roomType + " в " + checkOutTime + " (бронирование № " + bookingNumber + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var todaysDeparturesMessage = todaysDeparturesSection + "\n" + "\n" + todaysDeparturesBookings;
Logger.log("Сформирован набор бронирований для горничной с выездами сегодня: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Завтрашние заезды и выезды. */
var tomorrowsSection = "‖ Завтра, " + formattedTomorrowsDate + ":";
/* Завтрашние заезды. */
if (formattedCheckInDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездами завтра, но кроме тех, которые уже были отменены гостями.
var tomorrowsArrivalsSection = "• Заезды:";
var tomorrowsArrivalsBookings = roomType + " в " + checkInTime + " (бронирование № " + bookingNumber + ")" + "\nТип размещения: " + numberOfGuests + "\nВыезд: " + fullCheckOutDate + " (" + formattedNumberOfNights + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var tomorrowsArrivalsMessage = tomorrowsArrivalsSection + "\n" + "\n" + tomorrowsArrivalsBookings;
Logger.log("Сформирован набор бронирований для горничной с заездами завтра: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Завтрашние выезды. */
if (formattedCheckOutDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с выездами завтра, но кроме тех, которые уже были отменены гостями.
var tomorrowsDeparturesSection = "◦ Выезды:";
var tomorrowsDeparturesBookings = roomType + " в " + checkOutTime + " (бронирование № " + bookingNumber + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var tomorrowsDeparturesMessage = tomorrowsDeparturesSection + "\n" + "\n" + tomorrowsDeparturesBookings;
Logger.log("Сформирован набор бронирований для горничной с выездами завтра: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Послезавтрашние заезды и выезды. */
var dayAfterTomorrowsSection = "‖ Послезавтра, " + formattedDayAfterTomorrowsDate + ":";
/* Послезавтрашние заезды. */
if (formattedCheckInDate == formattedDayAfterTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездами послезавтра, но кроме тех, которые уже были отменены гостями.
var dayAfterTomorrowsArrivalsSection = "• Заезды:";
var dayAfterTomorrowsArrivalsBookings = roomType + " в " + checkInTime + " (бронирование № " + bookingNumber + ")" + "\nТип размещения: " + numberOfGuests + "\nВыезд: " + fullCheckOutDate + " (" + formattedNumberOfNights + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var dayAfterTomorrowsArrivalsMessage = dayAfterTomorrowsArrivalsSection + "\n" + "\n" + dayAfterTomorrowsArrivalsBookings;
Logger.log("Сформирован набор бронирований для горничной с заездами послезавтра: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Послезавтрашние выезды. */
if (formattedCheckOutDate == formattedDayAfterTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с выездами послезавтра, но кроме тех, которые уже были отменены гостями.
var dayAfterTomorrowsDeparturesSection = "◦ Выезды:";
var dayAfterTomorrowsDeparturesBookings = roomType + " в " + checkOutTime + " (бронирование № " + bookingNumber + ")" + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
var dayAfterTomorrowsDeparturesMessage = dayAfterTomorrowsDeparturesSection + "\n" + "\n" + dayAfterTomorrowsDeparturesBookings;
Logger.log("Сформирован набор бронирований для горничной с выездами послезавтра: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
}
/* Сегодняшние заезды и выезды. */
/* Если сегодняшние заезды не найдены. */
if (todaysArrivalsMessage == undefined) {
todaysArrivalsMessage = "• Заезды:" + "\n" + "\nБронирования с заездами сегодня не найдены. Возможно, кто-то ещё успеет сделать бронирование в течении дня.";
}
/* Если сегодняшние выезды не найдены. */
if (todaysDeparturesMessage == undefined) {
todaysDeparturesMessage = "◦ Выезды:" + "\n" + "\nБронирования с выездами сегодня не найдены.";
}
/* Завтрашние заезды и выезды. */
/* Если завтрашние заезды не найдены. */
if (tomorrowsArrivalsMessage == undefined) {
tomorrowsArrivalsMessage = "• Заезды:" + "\n" + "\nБронирования с заездами завтра не найдены. Возможно, кто-то ещё успеет сделать бронирование до завтрашнего дня.";
}
/* Если завтрашние выезды не найдены. */
if (tomorrowsDeparturesMessage == undefined) {
tomorrowsDeparturesMessage = "◦ Выезды:" + "\n" + "\nБронирования с выездами завтра не найдены.";
}
/* Послезавтрашние заезды и выезды. */
/* Если послезавтрашние заезды не найдены. */
if (dayAfterTomorrowsArrivalsMessage == undefined) {
dayAfterTomorrowsArrivalsMessage = "• Заезды:" + "\n" + "\nБронирования с заездами послезавтра не найдены. Возможно, кто-то ещё успеет сделать бронирование до послезавтрашнего дня.";
}
/* Если послезавтрашние выезды не найдены. */
if (dayAfterTomorrowsDeparturesMessage == undefined) {
dayAfterTomorrowsDeparturesMessage = "◦ Выезды:" + "\n" + "\nБронирования с выездами послезавтра не найдены.";
}
var subject = "Сводка заездов и выездов гостей" + " сегодня (" + formattedTodaysDate + ")," + " завтра (" + formattedTomorrowsDate + ")" + " и послезавтра (" + formattedDayAfterTomorrowsDate + ")";
var messageBeginning = "Доброе утро," + "\n" + "\nВ этом письме собрана информация о заездах и выездах гостей сегодня, завтра и послезавтра.";
var messageSignature = "Пожалуйста, сделайте всё возможное, чтобы номера были готовы к заезду гостей как сегодня, так завтра и послезавтра. После выезда гостей номера также должны быть подготовлены к заезду новых постояльцев." + "\n" + "\nУспешного рабочего дня!";
var message = messageBeginning + "\n" + "\n" + todaysSection + "\n" + "\n" + todaysArrivalsMessage + "\n" + "\n" + todaysDeparturesMessage + "\n" + "\n" + "\n" + tomorrowsSection + "\n" + "\n" + tomorrowsArrivalsMessage + "\n" + "\n" + tomorrowsDeparturesMessage + "\n" + "\n" + "\n" + dayAfterTomorrowsSection + "\n" + "\n" + dayAfterTomorrowsArrivalsMessage + "\n" + "\n" + dayAfterTomorrowsDeparturesMessage + "\n" + "\n" + messageSignature;
}
ui.alert("Тестирования механизма формирования и отправки уведомлений о предстоящих заездах", "Тема письма:" + "\n" + "\n" + subject + "\n" + "\nТекст письма:" + "\n" + "\n" + message, ui.ButtonSet.OK); // Используется только для тестирования.
// MailApp.sendEmail(recipientEmail, subject, message, {name: senderName, replyTo: replyTo});
Logger.log("Горничной отправлено уведомление с предстоящими заездами и выездами сегодня, завтра и послезавтра (" + formattedTodaysDate + ", " + formattedTomorrowsDate + " и " + formattedDayAfterTomorrowsDate + ") на " + recipientEmail + ".");
SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу.
}
Как я могу это исправить?
Замечания по разъяснению и разъяснению знаний, заслуживающие решения, очень ценятся и вознаграждаются членами сообщества.
@MasterCrander, Спасибо за удержание конфиденциальности. – RLearnsR