Search code examples
javascriptgoogle-apps-scriptgoogle-sheetsgoogle-apps

GAS Find All Matching Values Then Email Them Together


GAS beginner is stuck with a problem of retrieving all condition-matching values from a loop in Google Apps Script.

One of the columns in my spreadsheet has dates. Conditional operator if (formattedCheckInDate == formattedTodaysDate) { inside a loop for (var i = 0; i < data.length; ++i) { comparing those dates to the current date to check if they match. If they match then get values from other columns in a row with a date matching current date but then continue looking over the dates to check if another date in a column is also equal to a current date.

formattedCheckInDate GuestName
10/08/2016           Anna
09/08/2016           Mary
10/08/2016           David
11/08/2016           Peter

After all current-date-matching values have been recognised I need to send them in a single email:

Hi,

<Other column values of a *first found* current date matching row>

<Other column values of a *second found* current date matching row>

<Other column values of a *third found* current date matching row>

...

<Other column values of a *N found* current date matching row>

Having an example data above, here is what I should finally get inside a single email (i.e, if today is August 10):

Hi,

Anna

David

Hope for your assistance and cooperation. Please give examples of solving my problem.

EDIT № 1. Here is what I do have now.

function NotifyManagerOfUpcomingArrivals() {
    // 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 bookingsListLink = "www.google.com";
    var senderName = "John The Sender";
    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 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") + " в 14:00";
        var fullCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd.MM.yyyy") + " в 12:00";
        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 + " руб. к оплате"; // Сумма, которую необходимо оплатить гостю по приезде.
            /* Сегодняшние заезды. */
            if (formattedCheckInDate == formattedTodaysDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на сегодня, но кроме тех, которые уже были отменены гостями.
            var todaysArrivalsSection = "‖ Заезды" + " сегодня, " + formattedTodaysDate + ":";
            var todaysArrivalsBookings = roomType + " (бронирование № " + bookingNumber + ")" + "\nТип размещения: " + numberOfGuests + "\n(" + formattedCostPerNight + " × " + formattedNumberOfNights + ")" + " – " + formattedPrepaymentCost + " = " + formattedUnpaidCost + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
            var todaysArrivalsMessage = todaysArrivalsSection + "\n" + "\n" + todaysArrivalsBookings; 
            Logger.log("Сформирован набор бронирований с заездами сегодня: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
            }
            /* Завтрашние заезды. */
            if (formattedCheckInDate == formattedTomorrowsDate && reviewDummy !== "–") { // Условное выражение, позволяющее отобрать бронирования с заездом на завтра, но кроме тех, которые уже были отменены гостями.
            var tomorrowsArrivalsSection = "‖ Заезды" + " завтра, " + formattedTomorrowsDate + ":";
            var tomorrowsArrivalsBookings = roomType + " (бронирование № " + bookingNumber + ")" + "\nТип размещения: " + numberOfGuests + "\n(" + formattedCostPerNight + " × " + formattedNumberOfNights + ")" + " – " + formattedPrepaymentCost + " = " + formattedUnpaidCost + "\nГость: " + contactFullName + "\nМобильный телефон: " + contactPhone;
            var tomorrowsArrivalsMessage = tomorrowsArrivalsSection + "\n" + "\n" + tomorrowsArrivalsBookings; 
            Logger.log("Сформирован набор бронирований с заездами завтра: № " + bookingNumber + " (" + contactFullName + ")" + " и отправлен на " + recipientEmail + ".");
            }
            /* Если заезды сегодня не найдены. */
            if (todaysArrivalsMessage == undefined) {
            todaysArrivalsMessage = "‖ Заезды" + " сегодня, " + formattedTodaysDate + ":" + "\n" + "\nБронирования с заездами сегодня не найдены. Возможно, кто-то ещё успеет сделать бронирование в течении дня.";
            }
            /* Если заезды завтра не найдены. */
            if (tomorrowsArrivalsMessage == undefined) {
            tomorrowsArrivalsMessage = "‖ Заезды" + " завтра, " + formattedTomorrowsDate + ":" + "\n" + "\nБронирования с заездами завтра не найдены. Возможно, кто-то ещё успеет сделать бронирование до завтрашнего дня.";
            }
            var subject = "Сводка заездов гостей" + " сегодня (" + formattedTodaysDate + ") и" + " завтра (" + formattedTomorrowsDate + ")";
            var messageBeginning = "Доброе утро," + "\n" + "\nВ этом письме собрана информация о заездах гостей сегодня и завтра.";
            var messageSignature = "Пожалуйста, предупреди горничную о предстоящих заездах, а также сделай всё возможное, чтобы подготовить номера к заезду гостей как сегодня, так и завтра!" + "\n" + "\n* Посмотреть полный список бронирований всегда можно тут: " + bookingsListLink + ".";
            var message = messageBeginning + "\n" + "\n" + todaysArrivalsMessage + "\n" + "\n" + "\n" + tomorrowsArrivalsMessage + "\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 + ") на " + recipientEmail + ".");
    SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу.
}

Solution

  • Ok, it seems your lock is your complexity. Use KISS. Always!

    at first

    Declare the message variable

    at second

    Accumulate data

    finally

    The short answer is "Accumulate your data"

    todaysArrivalsMessage += todaysArrivalsSection + "\n" + "\n" + todaysArrivalsBookings;
    tomorrowsArrivalsMessage += tomorrowsArrivalsSection + "\n" + "\n" + tomorrowsArrivalsBookings;
    

    WITHOUT VAR

    result

    https://gist.github.com/oshliaer/c0c663cfa4779e193adcc91edfe0d672#file-result-md