2017-02-20 8 views
0

У меня возникла проблема поиска определенного содержимого (например, даты или текста строки) в 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. Чтобы найти бронирования, попробуйте запустить процедуру поиска снова."); 
    } 
} 

Однако:

  1. Он никогда находит что-либо. (ui.alert с результатами поиска всегда пуст).
  2. После закрытия окна без каких-либо результатов он начинает итеративно выскакивать. Уверен, что это происходит из-за неправильной настройки if loop, но я не смог ее исправить.

Я не нашел много на StackOverflow, который помогает.

Как решить эту проблему? Есть ли что-нибудь с строками кода, которые проверяют ячейки для хранения значений поиска?

ответ

0

Я не уверен, что будет происходить на этой линии

(reservationNotes == "") {fullReservationNotes == ""} 

, потому что я предполагаю, что вы хотите сказать, что это вместо этого.

(reservationNotes == "") {fullReservationNotes = "";} 

Так что точка с запятой и вторая должны быть назначением. Первое - это сравнение.

Я думаю, что видел этот код раньше, и он смирил меня, чтобы понять, как трудно было бы ходить в школу в другой стране, где весь их текст выйдет в моем редакторе, как это "??????? "," ?????? ??????? ??????? ".

+0

Да, я уже отредактировал эту строку. Что касается комментариев, я использую русский язык, чтобы сделать его более продуманным для моих коллег. – RLearnsR