У меня возникла проблема поиска определенного содержимого (например, даты или текста строки) в 3 указанных столбцах (например, row[0]
для даты регистрации, row[1]
для выписки, row[5]
для гостей, полное имя). Скрипт открывает диалоговое окно и просит ввести поисковый запрос. Впоследствии, предположительно, он проверяет все указанные ячейки в диапазоне данных для запрошенного поискового запроса.Проблема с поиском текста в указанных столбцах
Если он находит что-либо, то это показывает, найдено ui.alert
найденные результаты обрабатываются как:
var foundReservations = "\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;
reservationsSearchResults += foundReservations; // Собираем воедино все найденные бронирования.
Полный исходный код:
function FindReservationsBySpecifiedDetails() {
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, 11); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 12-ый.
var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом.
var statusConfirmationSent = "Подтверждение отправлено";
var statusConfirmationNotSent = "Подтверждение не отправлено";
/* Поехали. */
var step1 = ui.prompt("Поиск бронирований", "Чтобы начать поиск бронирований по (1) дате заезда, (2) дате выезда, (3) номеру бронированию и (4) имени и фамилии гостя, введите запрос. Например, 03/07/2016.", ui.ButtonSet.OK);
var step1Button = step1.getSelectedButton();
var searchQuery = step1.getResponseText();
var formattedSearchQuery = "«" + searchQuery + "»";
var numberOfReservationsFound = "";
var reservationsSearchResults = "";
if (step1Button == ui.Button.OK) {
for (var i = 0; i < data.length; ++i) {
for (var j = 0; j < data[i].length; j++) {
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 comissionFeeForPayingWithBankCard = "0.02"; // Комиссия при оплате стоимости проживания с помощью банковской карты.
var formattedComissionFeeForPayingWithBankCard = comissionFeeForPayingWithBankCard*100 + "%";
var fullComissionFeeForPayingWithBankCard = formattedComissionFeeForPayingWithBankCard + " комиссии";
var totalUnpaidCostPaidWithBankCard = unpaidCost+(unpaidCost*comissionFeeForPayingWithBankCard);
var formattedNumberOfNights = numberOfNights + " ночей"; // Количество ночей проживания.
var formattedCostPerNight = costPerNight + " руб.";
var formattedPrepaymentCost = prepaymentCost + " руб.";
var formattedUnpaidCost = unpaidCost + " руб."; // Сумма, которую необходимо оплатить гостю по приезде.
var formattedTotalUnpaidCostPaidWithBankCard = totalUnpaidCostPaidWithBankCard + " руб.";
var contactFullName = row[5];
var contactGivenName = contactFullName.split(" ").slice(0, -1).join(" ");
var contactPhone = row[6];
var contactEmail = row[7];
var reservationNotes = row[11];
/* Не показываем строку с примечаниями к бронированию в случае их отсутствия. */
var fullReservationNotes = "\nПримечания к бронированию: " + reservationNotes + "\n";
if (data[i][j].toString().indexOf(searchQuery) > -1) {
if (reservationNotes == "") {fullReservationNotes == ""}
var foundReservations = "\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;
reservationsSearchResults += foundReservations; // Собираем воедино все найденные бронирования.
}
}
// return(count);
}
var step2 = ui.alert("Результаты поиска бронирований", "По вашему запросу найдено " + numberOfReservationsFound + " результат(ов):" + reservationsSearchResults, ui.ButtonSet.YES_NO);
var step2Button = step2.getSelectedButton();
/* Когда пользователь нажимает «Да» на шаге № 2. */
if (step2 == ui.Button.YES) {
ui.alert("Результаты поиска бронирований были приняты пользователем на шаге представления результатов поиска.");
Logger.log("Результаты поиска бронирований были приняты пользователем на шаге представления результатов поиска.");
}
/* Когда пользователь нажимает «Нет» на шаге № 2. */
else if (step2 == ui.Button.NO) {
ui.alert("Результаты поиска бронирований были отклонены пользователем на шаге представления результатов поиска.");
Logger.log("Результаты поиска бронирований были отклонены пользователем на шаге представления результатов поиска.");
}
/* Когда пользователь нажимает «Закрыть» на шаге № 2. */
else if (step2 == ui.Button.CLOSE) {
ui.alert("Окно с представленными результатами поиска бронирований были закрыты пользователем.");
Logger.log("Окно с представленными результатами поиска бронирований были закрыты пользователем.");
}
} else {
ui.alert("По запросу " + formattedSearchQuery + " не найдено ни одного бронирования. Пожалуйста, попробуйте задать другой запрос.");
}
if (step1Button == ui.Button.CLOSE) {
ui.alert("Поиск бронирований был прерван пользователем на шаге № 1. Чтобы найти бронирования, попробуйте запустить процедуру поиска снова.");
}
}
Однако:
- Он никогда находит что-либо. (
ui.alert
с результатами поиска всегда пуст). - После закрытия окна без каких-либо результатов он начинает итеративно выскакивать. Уверен, что это происходит из-за неправильной настройки if loop, но я не смог ее исправить.
Я не нашел много на StackOverflow, который помогает.
Как решить эту проблему? Есть ли что-нибудь с строками кода, которые проверяют ячейки для хранения значений поиска?
Да, я уже отредактировал эту строку. Что касается комментариев, я использую русский язык, чтобы сделать его более продуманным для моих коллег. – RLearnsR