How to fill a multiple string to filter a data in Google Apps Script

Viewed 76

I'm going to build web to be used in search for label information My database is in Google Sheets, so I went looking for a Google Sheets fetch and gave it a try. I have no experience with Google App Scripts so I want to fill all and search data form database but it can run just one of them how to do it all (first is .gs second is Index.html) this is my reference.

  1. https://gist.github.com/neno-tech/15d9c3fe32a2d8896c1875b7a827a6e5
  2. https://docs.google.com/document/d/1EhzxSy-L5kBt5E-BA1B446G0OjQAuKqEgLUPpiZh3Pw/edit

This is my database : https://docs.google.com/spreadsheets/d/1j-r4gD1zV3e0yrNJTnHezXRlv1w-aOf6UqQs_P2jsRY/edit?usp=sharing

function doGet() {
  return HtmlService.createTemplateFromFile('Index').evaluate()
  .setTitle('System Search Lable')
  .addMetaTag('viewport', 'width=device-width, inital-scale=1')
  .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
 
function processForm(formObject){ 
  var concat = formObject.searchtext+formObject.searchtext2+formObject.searchtext3+formObject.searchtext4+formObject.searchtext5; 
  var result = "";
  if(concat){
      result = search(concat);
  }
  return result;
}

function search(searchtext){
  var spreadsheetId   = '1j-r4gD1zV3e0yrNJTnHezXRlv1w-aOf6UqQs_P2jsRY'; 
  var dataRange        = 'Master Barcode!A2:O10';  
  var data = Sheets.Spreadsheets.Values.get(spreadsheetId, dataRange).values;
  var ar = [];
data.forEach(function(f) {
    if (~f.toString().toLowerCase().indexOf(searchtext.toString().toLowerCase())) {
      ar.push(f);
    }
  });
  return ar;
}

!DOCTYPE html>
<html>
    <head>
        <base target="_top">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
    </head>
    <body>
        <div class="container">
            <br>
            <div class="row">
              <div class="col">
                  <center><form id="search-form" onsubmit="handleFormSubmit(this)">
                    <div class="form-group mb-2">
                      <label for="searchtext">Search a Label</label>
                    </div><p>
                    <div class="col-md-6 mb-2">
                      <input type="text" class="form-control" id="searchtext" name="searchtext" placeholder="Category">
                      <br>
                      <input type="text" class="form-control" id="searchtext2" name="searchtext2" placeholder="Size">
                      <br>
                      <input type="text" class="form-control" id="searchtext3" name="searchtext3" placeholder="Brand">
                      <br>
                      <input type="text" class="form-control" id="searchtext4" name="searchtext4" placeholder="Color">
                      <br>
                      <input type="text" class="form-control" id="searchtext5" name="searchtext5" placeholder="Lenght">
                      <br>
                    </div><p>
                    <button id="search" type="submit" class="btn btn-success mb-2">Search</button>
                    <span id="spinner" class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
                  </form>
                  </center>
              </div>    
            </div>
            <div class="row">
              <div class="col">
                <div id="search-results" class="table-responsive">
                </div>
              </div>
            </div>
        </div>
 
       <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" integrity="sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.min.js" integrity="sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" crossorigin="anonymous"></script>

        <script>
          function preventFormSubmit() {
            var forms = document.querySelectorAll('form');
            for (var i = 0; i < forms.length; i++) {
              forms[i].addEventListener('submit', function(event) {
              event.preventDefault();
              });
            }
          }
          window.addEventListener("load", preventFormSubmit, true); 
             
          function handleFormSubmit(formObject) {
            document.getElementById('search').innerHTML = "Loading";
            document.getElementById('spinner').classList.remove("d-none");
            google.script.run.withSuccessHandler(createTable).processForm(formObject);
            document.getElementById("search-form").reset();
          }
        
          function createTable(dataArray) {
            document.getElementById('search').innerHTML = "Search";
            document.getElementById('spinner').classList.add("d-none");
            if(dataArray && dataArray !== undefined && dataArray.length != 0){
              var result = "<table class='table table-sm table-striped' id='dtable' style='font-size:0.8em'>"+
                           "<thead style='white-space: nowrap'>"+
                             "<tr>"+ 
                              "<th scope='col'>Barcode</th>"+
                              "<th scope='col'>Brand</th>"+
                              "<th scope='col'>Standard</th>"+
                              "<th scope='col'>Year</th>"+
                              "<th scope='col'>Table</th>"+
                              "<th scope='col'>Type</th>"+
                              "<th scope='col'>Category</th>"+
                              "<th scope='col'>Coil</th>"+
                              "<th scope='col'>X</th>"+
                              "<th scope='col'>Size</th>"+
                              "<th scope='col'>Lenght</th>"+
                              "<th scope='col'>Weight</th>"+
                              "<th scope='col'>Color</th>"+
                              "<th scope='col'>Voltage</th>"+
                              "<th scope='col'>Size lable</th>"+
                            "</tr>"+
                          "</thead>";
              for(var i=0; i<dataArray.length; i++) {
                  result += "<tr>";
                  for(var j=0; j<dataArray[i].length; j++){
                      result += "<td>"+dataArray[i][j]+"</td>";
                  }
                  result += "</tr>";
              }
              result += "</table>";
              var div = document.getElementById('search-results');
              div.innerHTML = result;
            }else{
              var div = document.getElementById('search-results');
              div.innerHTML = "Data not found!";
            }
          }
        </script>
    </body>
</html>

The results are here is that I fill in only one field. What I mean is I filled out the required information into each field, however I would like to know a way to fill in all fields in order to make it easier to filter.

enter image description here

1 Answers

To filter results based on the values you enter in the web form, pass all search elements to your search function and then check that that they are all either blank or match. This assumes that the search terms and the columns in your sheet are in the same order. Example:

const MAPPING = [7, 10, 2, 13, 11];

function processForm({ searchtext, searchtext2, searchtext3, searchtext4, searchtext5 }){ 
  let searchTerms = [searchtext, searchtext2, searchtext3, searchtext4, searchtext5];
  var result = "";
  if(searchTerms.find(Boolean)){
      result = search(searchTerms);
  }
  return result;
}

function search(searchTerms){
  var spreadsheetId   = '1B0hcELJcoLxiYXNCDx9iRl8JxijwgdFBkte90oPfCnY'; 
  var dataRange        = 'Master Barcode!A46:O1346';  
  var data = Sheets.Spreadsheets.Values.get(spreadsheetId, dataRange).values;
  var ar = [];
  data.forEach(function(f) {
    if (searchTerms.every((e, i) => !e || e === f[MAPPING[i]-1])) {
      ar.push(f);
    }
  });
  return ar;
}
Related