Выпадающий фильтр по продукту

Мой специальный раскрывающийся список фильтров не фильтрует некоторые продукты в моем списке продуктов. Например, два параметра отображаются, если я выбираю «Телефоны» в категории и выбираю «Samsung». Но если я выберу часы Apple Watch, ничего не отобразится. Как я могу убедиться, что что-то отображается, когда я выбираю их в категории и подкатегории, пока они находятся в листах Google? Я добавил изображения.

Вот код

    function getCategories() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Product");
  var categories = [];
  var data = sheet.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    var category = data[i][0];
    if (categories.indexOf(category) == -1) {
      categories.push(category);
    }
  }
  return categories;
}

function getSubCategories(category) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Product");
  var subCategories = [];
  var data = sheet.getDataRange().getValues();
  for (var i = 1; i < data.length; i++) {
    var rowCategory = data[i][0];
    var subCategory = data[i][1];
    if (rowCategory == category && subCategories.indexOf(subCategory) == -1) {
      subCategories.push(subCategory);
    }
  }
  return subCategories;
}


function filterProducts(category, subCategory) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Product");
  var [headers, ...data] = sheet.getDataRange().getValues();
  var filteredData = data.filter(function (row) {
    return row[0] == category && row[1] == subCategory;
  });
  return [headers, ...filteredData];
}

function doGet() {
  var template = HtmlService.createTemplateFromFile('index');
  template.categories = getCategories();
  template.category = '';
  template.subCategory='';
  return template.evaluate().setTitle('Product Filter');
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

function getSheetData()  { 
  var ss= SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Product'); 
  var dataRange = sheet.getDataRange();
  var dataValues = dataRange.getValues();  
  return dataValues;
}


function getUrl() {
 var url = ScriptApp.getService().getUrl();
 return url;
}

Это скрипт и html код.

 <!DOCTYPE html>
<html>
  <head>
    <base target = "_top">
    <script>
    function getSubCategories(category) 
    {
    
    google.script.run.withSuccessHandler(function(ar) 
    {

    console.info(ar);
    
    subCategory.length = 0;
    
    let option = document.createElement("option");
    option.value = "";
    option.text = "";
    subCategory.appendChild(option);
    
    ar.forEach(function(item, index) 
    {    
      let option = document.createElement("option");
      option.value = item;
      option.text = item;
      subCategory.appendChild(option);    
    });
    
    }).getSubCategories(category);
    
    };

      function updateSubCategories() {
        var category = document.getElementById('category').value;
        google.script.run.withSuccessHandler(function(subCategories) {
          var subCategoryDropdown = document.getElementById('sub-category');
          subCategoryDropdown.innerHTML = '';
          for (var i = 0; i < subCategories.length; i++) {
            var option = document.createElement('option');
            option.value = subCategories[i];
            option.text = subCategories[i];
            subCategoryDropdown.appendChild(option);
          }
        }).getSubCategories(category);
      }
     
function filterProducts() {
  var category = document.getElementById('category').value;
  var subCategory = document.getElementById('sub-category').value;
  google.script.run.withSuccessHandler(function(filteredData) {
    var [headers, ...filteredData] = filteredData;
    var productTable = document.getElementById('product-table');
    productTable.innerHTML = '';
    var headerRow = document.createElement('tr');
    for (var i = 0; i < headers.length; i++) {
      var headerCell = document.createElement('th');
      headerCell.textContent = headers[i];
      headerRow.appendChild(headerCell);
    }
    productTable.appendChild(headerRow);
    for (var i = 0; i < filteredData.length; i++) {
      var row = filteredData[i];
      var tableRow = document.createElement('tr');
      for (var j = 0; j < row.length; j++) { 
        var tableCell = document.createElement('td');
        tableCell.textContent = row[j];
        tableRow.appendChild(tableCell);
      }
      productTable.appendChild(tableRow);
    }
  }).filterProducts(category, subCategory);
}
    </script>
  </head>
  <body>
    <h1>Product Filter</h1>
    <?var tableData = getSheetData();?>
    <?var url = getUrl();?>
    <label for = "category">Category:</label>
    <select id = "category" onchange = "updateSubCategories()">
      <? for (var i = 0; i < categories.length; i++) { ?>
        <option value = "<?= categories[i] ?>"><?= categories[i] ?></option>
      <? } ?>
    </select>
    <label for = "sub-category">Sub-Category:</label>
    <select id = "sub-category" onchange = "filterProducts()">
    </select><br><br>

    <? if (category != '' || subCategory != '')
    {
        var output_array = [];
        tableData.forEach(function(value, index) {
        
          if (index == 0)
          {
            output_array.push(value);
          }
          else if (index > 0 && category != '' && subCategory != '')
          {
            if (value[0] == category && value[2] == subCategory)
            {
              output_array.push(value);
             }
            }
            else if (index > 0 && category != '')
            {
              if (value[0] == category)
              {                       
                output_array.push(value);
              }            
            }
            else if (index > 0 && subCategory != '')
            {
              if (value[2] == subCategory)
              {                       
                output_array.push(value);
              }           
            }                           
        });
    }
    else
    {
      var output_array = tableData;    
    }  ?>
    <!-- <table id = "product-table">

    </table> -->

    <table id = "product-table" border = "1" cellpadding = "5px" >
    <?for(var i = 0; i < tableData.length; i++) { ?>
      <?if (i == 0) { ?>
        <tr>
        <?for(var j = 0; j < tableData[i].length; j++) { ?>
        <th><?= tableData[i][j] ?></th>
        <? } ?>
        </tr>
      <? } else { ?>
        <tr>
        <? for(var j = 0; j < tableData[i].length; j++) { ?>
          <td><?= tableData[i][j] ?></td>
          <? } ?>
        </tr>
      <? } ?>
    <? } ?>
    </table>
  </body>
</html> 

Вот изображение со списком всех продуктов

Вот продукт после того, как я фильтрую для компьютера Dell

Это фильтр для часов.

Хотя я не уверен, правильно ли я понял ваш вопрос, я предложил ответ. Пожалуйста, подтвердите это. Если я неправильно понял ваш вопрос, прошу прощения.

Tanaike 19.04.2023 03:04

Проблема в том, что если у меня есть данные более чем в пяти столбцах, этот фильтр не отображается. Так, например, у меня есть категория, подкатегория, цена, скидка, новая цена и комментарий. Если есть какая-либо категория, в которой есть данные во всех этих полях, она не будет отображать эту строку.

Lamin 19.04.2023 17:43

Спасибо за ответ. Насчет The problem is if I have data in more than five columns, it does not display that filter. So, for example, I have Category, Subcategory, price, discount, new price, and comment. If there is any category that has data in all of those fields, it will not display that row., в вашем сценарии показа есть 4 столбца. Итак, я не могу понять ваш ответ. Но, я хотел бы поддержать вас. Итак, могу я спросить вас о деталях вашего фактического вопроса?

Tanaike 20.04.2023 01:44

Я обновил картинки. Если в столбцах 6, 7 или 8 есть какая-либо информация, фильтр не работает. Он фильтрует, только если информация находится только в столбцах с 1 по 5.

Lamin 20.04.2023 06:55

Спасибо за ответ. Теперь, когда я увидел ваш обновленный вопрос, я был удивлен, что вы изменились по сравнению с исходной ситуацией. В этом случае, во-первых, могу ли я спросить вас, был ли мой предложенный ответ полезен для вашей исходной ситуации? Потому что мой ответ на ваш первоначальный вопрос.

Tanaike 20.04.2023 07:04

Да, это помогло. Я добавил код. Просто фильтр до сих пор не работает.

Lamin 20.04.2023 07:10

Спасибо за ответ. Что касается вашего нового вопроса, я хотел бы поддержать вас. Но я думаю, что когда вы предоставите больше информации, это поможет понять причину вашей текущей проблемы и решение. Итак, можете ли вы опубликовать его как новый вопрос, включив дополнительную информацию? Этим я хотел бы подтвердить это. Кстати, насчет It's just that the filter is still not working., в данном случае какой фильтр это 1-й выпадающий список или 2-й выпадающий список?

Tanaike 20.04.2023 07:13

Первый и второй выпадающие списки заполняются. Просто не обновляется таблица

Lamin 20.04.2023 07:15

Спасибо за ответ. Что касается The first and second dropdown lists are populating. It is just not updating the table, в этом случае, когда вы проверяете исходную ситуацию (5 столбцов), проблем не возникает. И при изменении количества столбцов с 5 на 8 возникла эта проблема. Правильно ли я понимаю?

Tanaike 20.04.2023 07:20

Если я правильно понимаю, из того, что вы показываете новую электронную таблицу, я обеспокоен тем, что ваша электронная таблица включает объект даты. Если я правильно понимаю, возникает ошибка, когда значения отправляются из скрипта Google Apps в Javascript из-за текущей спецификации. Я предположил, что это может быть причиной вашей текущей проблемы. В этом случае замените все getValues() на getDisplayValues() на стороне скрипта Google Apps, отразите последний скрипт в веб-приложениях и протестируйте его снова. Таким образом, ваша новая проблема может быть удалена. Во-первых, пожалуйста, проверьте это.

Tanaike 20.04.2023 07:23

Да это верно. Когда я изменил с 5 на 8 столбцов, возникла проблема.

Lamin 20.04.2023 07:29

Перейдя с getValues() на getDisplayValues(), это сработало. большое спасибо за вашу помощь

Lamin 20.04.2023 07:32

Спасибо за ответ и повторный тест. Я рад, что ваша вторая проблема была решена. И тебе спасибо.

Tanaike 20.04.2023 07:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
13
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя я не уверен, правильно ли я понял ваш ожидаемый результат, как насчет добавления начального значения во второй раскрывающийся список? Когда это отражено в вашем сценарии, получается следующее.

Пожалуйста, измените updateSubCategories() Javascript следующим образом.

Модифицированный скрипт:

function updateSubCategories() {
  var category = document.getElementById('category').value;
  google.script.run.withSuccessHandler(function (subCategories) {
    var subCategoryDropdown = document.getElementById('sub-category');
    subCategoryDropdown.innerHTML = '';
    
    // --- I added the below script.
    var option = document.createElement('option');
    option.value = "";
    option.text = "Please select";
    option.hidden = true;
    subCategoryDropdown.appendChild(option);
    // ---
    
    for (var i = 0; i < subCategories.length; i++) {
      var option = document.createElement('option');
      option.value = subCategories[i];
      option.text = subCategories[i];
      subCategoryDropdown.appendChild(option);
    }
  }).getSubCategories(category);
}
  • В соответствии с этой модификацией, когда значения установлены во 2-м раскрывающемся списке, начальным значением является «Пожалуйста, выберите». Я догадался, что это может быть ваш ожидаемый результат.

Примечание:

Другие вопросы по теме