Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

onchange function not executing on form field change

I have a form with only single field (DropDown) and assigned a function to execute on it’s change.

But it’s not working.

<select type="text" class="form-control" id="searchtext" onchange="handleFormSubmit(this)" name="searchtext" placeholder="Search Text">

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

What went wrong

here is the WebApp URL

Code.gs file

function doGet() {
  return HtmlService.createTemplateFromFile('Index').evaluate()
  .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}


/* PROCESS FORM */
function processForm(formObject){  
  var result = "";
  if(formObject.searchtext){//Execute if form passes search text
      result = search(formObject.searchtext);
  }
  return result;
}

//SEARCH FOR MATCHED CONTENTS 
function search(searchtext){
  var spreadsheetId   = '1fVBNWvZkFMOfnlt8r6fevt-ozTPweiR5oXot1GU4g2A'; //** CHANGE !!!
  var dataRage        = 'Data!A2:D';                                    //** CHANGE !!!
  var data = Sheets.Spreadsheets.Values.get(spreadsheetId, dataRage).values;

  var ar = [];
  
  data.forEach(function(f) {
    if (~f.indexOf(searchtext)) {
      ar.push(f);
    }
  });
  return ar;
}


Index.html file

<!DOCTYPE html>
<html>
    <head>
        <base target="_top">
        <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script>
        


<!--##JAVASCRIPT FUNCTIONS ---------------------------------------------------- -->
<script>
//PREVENT FORMS FROM SUBMITTING / PREVENT DEFAULT BEHAVIOUR
    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); 
             
          
          //HANDLE FORM SUBMISSION
          function handleFormSubmit(formObject) {
            google.script.run.withSuccessHandler(createTable).processForm(formObject);
            document.getElementById("search-form").reset();
          }
        
          //CREATE THE DATA TABLE
          function createTable(dataArray) {
            if(dataArray && dataArray !== undefined && dataArray.length != 0){
              var result = "<table class='table table-sm' id='dtable' style='font-size:0.8em'>"+
                           "<thead>"+
                             "<tr>"+                     //Change table headings to match witht he Google Sheet
                              "<th scope='col'>Model</th>"+
                              "<th scope='col'>Price</th>"+
                              "<th scope='col'>Warranty</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.empty()
              div.innerHTML = "Data not found!";
            }
          }
        </script>
        <!--##JAVASCRIPT FUNCTIONS ~ END ---------------------------------------------------- -->
        
    </head>

<style>
    body{
    margin:0;
    padding-top: 10px;
    font-family: sans-serif;
  }

 *{
    box-sizing: border-box;
  }

 .table{
    width: 100%;
    border-collapse: collapse;
  }

 .table td,.table th{
  padding:12px 15px;
  border:1px solid #ddd;
  text-align: center;
  font-size:16px;
  }

  .table th{
    background-color: darkblue;
    color:#ffffff;
  }

  .table tbody td:nth-child(even){
    background-color: #f5f5f5;
  }

  table td:nth-child(1){ display:none;} 

  /*responsive*/

  @media(max-width: 500px){

     .table tr{
        margin-bottom:15px;
     }

     .table td::before{
        left:0;
        font-size:15px;
        font-weight: bold;
        text-align: left;
     }
    
  }

</style>


<body>
        <div class="container">
      
                  <!-------------------------- SEARCH FORM ----------------------------------------->
                  <form id="search-form" style="margin: 0 auto; width:  50%" >
                    
                    <div class="form-group mx-sm-3 mb-2" >
                      <select type="text" class="form-control" id="searchtext" onchange="handleFormSubmit(this)" name="searchtext" placeholder="Search Text">
                        <option> Select </option>
                        <option> FLO </option>
                        <option> TUBULAR </option>
                      </select>
                    </div>

                    <button type="submit" class="btn btn-primary mb-2">Search</button>
                  </form>
                  <!-- ## SEARCH FORM ~ END -------------------------------------------->

              <!-- ## TABLE OF SEARCH RESULTS ------------------------------------------>
                <div id="search-results" class="table"  >
                  <!-- The Data Table is inserted here by JavaScript -->
                </div>
              <!-- ## TABLE OF SEARCH RESULTS ~ END ------------------------------------>
                
        </div>
</body>
</html>



>Solution :

Modification points:

  • In your script, I’m worried that formObject might not be able to be parsed with google.script.run.
  • You might want to run document.getElementById("search-form").reset() after processForm was finished.

When these points are reflected in your showing script, how about the following modification?

From:

function handleFormSubmit(formObject) {
  google.script.run.withSuccessHandler(createTable).processForm(formObject);
  document.getElementById("search-form").reset();
}

To:

function handleFormSubmit(formObject) {
  google.script.run.withSuccessHandler(e => {
    createTable(e);
    document.getElementById("search-form").reset();
  }).processForm({searchtext: formObject.value});
}

Note:

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading