【问题标题】:Issue with replacing value if cell is empty如果单元格为空,则替换值的问题
【发布时间】:2017-02-15 16:29:34
【问题描述】:

在我的 Google Apps 电子表格中,我有多个列:第一列是 row[0] 的入住日期,第二列是 row[1] 的退房日期……等等,直到 row[17]。我的函数旨在为新注册的预订发送确认,这由 预订状态列 (row[16]) 确定,如果单元格中包含的值为 Новое бронирование,则该函数会发送通知给前台经理(但如果 value 不同,那么除了检查列单元格的值之外什么都不做)。

问题是当且仅当相应行中的单元格(即具有新预订)包含预订备注本身时,我无法修改我的函数以发送 reservationNotes (row[11]): row[11] 中的单元格值应该不为空

这里是源代码:

/* Отправка уведомлений о добавлении новых бронирований (т.е., новых строк в таблице на активном листе). */
function NotifyManagerOfNewReservation() {
    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 statusNewReservation = "Новое бронирование";
    var statusNotificationSent = "Уведомление отправлено";
    for (var i = 0; i < data.length; ++i) {
        var row = data[i];
        var checkInDate = new Date(row[0]);
        var checkOutDate = new Date(row[1]);
        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 reservationNumber = [i+2] + "0" + checkInDate.getFullYear(); // С 18:35, 26.09.2016 (МСК) используется универсальный формат номера бронирований (до этого момента он формировался по формуле [i+2]).
        var roomType = "«" + row[2] + "»";
        var numberOfGuests = row[3];
        var numberOfNights = Math.round(Math.abs((checkOutDate.getTime() - checkInDate.getTime())/(24*60*60*1000)));
        var costPerNight = row[4];
        var prepaymentCost = row[8];
        var unpaidCost = (costPerNight*numberOfNights)-prepaymentCost;
        var formattedNumberOfNights = numberOfNights + " ночей"; // Количество ночей проживания.
        var formattedCostPerNight = costPerNight + " руб.";
        var formattedPrepaymentCost = prepaymentCost + " руб.";
        var formattedUnpaidCost = unpaidCost + " руб."; // Сумма, которую необходимо оплатить гостю по приезде.
        var contactFullName = row[5];
        var contactPhone = row[6];
        var contactEmail = row[7];
        var reservationNotes = row[11];
        var fullReservationNotes = "";
        var notificationStatus = row[16]; // Столбец, в котором выставляется статус отправки/неотправки уведомлений о новых бронированиях.
        var reservationsListLink = "https://www.berdyanskaya56.ru/intranet/reservations/";
        /* Установка параметров отправителя. */
        var senderAliases = GmailApp.getAliases(); // Запрашиваем список всех элиасов электропочтового аккаунта.
        Logger.log(senderAliases); // Проверяем список электропочтовых эллиасов и выбираем требующийся в формате senderAliases[N], где алиас, идущий первым по порядку, имеет значение «0» (к примеру, senderAliases[0] для ruslanseletskiy@gmail.com).
        var senderAddress = "ruslan@berdyanskaya56.ru"; // Указываем выбранный алиас.
        var senderName = "Робот Руслана (мини-гостиница «Бердянская 56»)"; // Уточняем имя отправителя.
        var replyTo = "ruslan@berdyanskaya56.ru"; // Указываем электропочтовый адрес для ответа.
        var highriseDropbox = "dropbox@18407830.minihotelberdyanskaya56.highrisehq.com"; // Адрес общего ящика аккаунта ruslan@berdyanskaya56.ru в Хайрайзе.
        var bccAddress = highriseDropbox;
        var managerEmail = "natalya@berdyanskaya56.ru"; // Электропочта менеджера фронт-офиса.
        var subject = "Новое бронирование № " + reservationNumber + " (" + contactFullName + ")";
        /* Не показываем строку с примечаниями к бронированию в случае их отсутствия. */
        if (reservationNotes !== "") {fullReservationNotes == "\nПримечания к бронированию: " + reservationNotes + "\n"}
        var message = "Добавлено бронирование № " + reservationNumber + "!" + "\n" + "\nДанные нового бронирования:" + "\n" + "\nЗаезд: " + fullCheckInDate + "\nВыезд: " + fullCheckOutDate + "\nНомер: " + roomType + "\nТип размещения: " + numberOfGuests + "\n" + "\nКоличество ночей: " + formattedNumberOfNights + "\nЦена за ночь: " + formattedCostPerNight + "\nВнесённый депозит: " + formattedPrepaymentCost + "\n(" + formattedCostPerNight + " × " + formattedNumberOfNights + ")" + " – " + formattedPrepaymentCost + " = " + formattedUnpaidCost + " к оплате" + "\n" + "\nИмя и фамилия гостя: " + contactFullName + "\nМобильный телефон: " + contactPhone + "\nЭлектронная почта: " + contactEmail + "\n" + fullReservationNotes + "\nПожалуйста, срочно сделай занятым номер " + roomType + " в период с " + formattedCheckInDate + " (с 14:00)" + " по " + formattedCheckOutDate + " (до 12:00)" + " в экселевском файле!" + "\n" + "\n* Посмотреть полный список бронирований всегда можно тут: " + reservationsListLink + ".";  
            if (notificationStatus == statusNewReservation) { // Условное выражение, позволяющее не отправлять письма о тех же бронировациях повторно.
            // MailApp.sendEmail(managerEmail, subject, message, {name: senderName, replyTo: replyTo});
            GmailApp.sendEmail(managerEmail, subject, message, {from: senderAddress, name: senderName, replyTo: replyTo, bcc: bccAddress});
            sheet.getRange(startRow + i, 17).setValue(statusNotificationSent);
            Logger.log("Отправлено уведомление о новом бронировании № " + reservationNumber + " (" + contactFullName + ")" + " на " + managerEmail + ".");
            }
            SpreadsheetApp.flush(); // Показываем пользователю что изменения вступают в силу.
       }
}

我使用“间接”变量fullReservationNotes 来检查if (reservationNotes !== "") {fullReservationNotes == "\nПримечания к бронированию: " + reservationNotes + "\n"} 以实现此功能,但它无法正常工作:即使reservationNotes (row[11]) 列中的单元格也不会显示任何保留注释已满或为空。

因此,如果row[11] 中的单元格对于任何添加的预订都是空的,那么"\nПримечания к бронированию: " + reservationNotes + "\n" 中应该什么都没有 并且fullReservationNotes 在通知消息中也应该留空。

我也花了半个小时搜索现有的问题,但我没有找到任何与我自己类似的案例。

如何解决这个问题?也许我错过了上面描述的 if 子句循环的任何内容?

非常感谢您为解决此问题所做的所有贡献!

【问题讨论】:

    标签: javascript google-apps-script google-sheets gmail-api


    【解决方案1】:

    如果我没看错,我认为问题出在 if 之后的赋值,您使用的是比较运算符 (==) 而不是赋值运算符 (=)

    试试:

    if (reservationNotes !== "") {fullReservationNotes = "\nПримечания к бронированию: " + reservationNotes + "\n"}
    

    【讨论】:

      【解决方案2】:

      我在您的代码中看到的唯一问题是完整的 reservationNotes 赋值末尾没有分号,而且我不认为 == 是赋值运算符。

      if (reservationNotes !== "") 
      {
         fullReservationNotes == "\nПримечания к бронированию: " + reservationNotes + "\n"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多