Search code examples
htmlgoogle-apps-scriptgeolocation

How to send geolocation along with inputs when submiting HTML form in Google Apps Script


I have a HTML form made with Google Apps Script that sends the data imputed into a Google Sheet. Here are the files in the project:

Code.gs

function doGet(request) {
  return HtmlService.createTemplateFromFile('Index').evaluate();
}

/* @Include JavaScript and CSS Files */
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}



/* @Process Form */
function processForm(formObject) {
  var url = "URL OF GOOGLE SHEET";
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("Data");

  ws.appendRow([formObject.local,
                formObject.direcao,
                formObject.carro,
                formObject.quilometragem,
                formObject.observacao,
                Utilities.formatDate(new Date(), "GMT-3", "dd/MM/yyyy HH:mm:ss")
               ]);
}

Index.html

<!DOCTYPE html>
<html>

 <script type="text/javascript">
 function showPosition() {
        navigator.geolocation.getCurrentPosition(showMap);
    }

function showMap(position) {
        // Get location data
       var latlong = position.coords.latitude + ", " + position.coords.longitude;
    }
 </script>

    <head>
        <base target="_top">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    <?!= include('JavaScript'); ?>
    </head>
    <body>
        <div class="container">
            <div class="row">
                <div class="col-6">
                    <form id="myForm" onsubmit="handleFormSubmit(this)">
                        <p class="h4 mb-4 text-left">Uso Frota</p>

                        <div class="form-group">
                            <label for="local">Local</label>
                            <input type="text" class="form-control" id="local" name="local">
                        </div> 

                        <div class="form-group">
                            <label for="direcao">Direcao</label>
                            <select class="form-control" id="direcao" name="direcao">
                                <option selected disabled hidden style='display: none' value=''></option>
                                <option value="Chegada">Chegada</option>
                                <option value="Saida">Saida</option>
                                <option value="Chegada/Saida">Chegada/Saida</option>
                            </select>
                        </div>

                        <div class="form-group">
                            <label for="carro">Carro</label>
                            <select class="form-control" id="carro" name="carro">
                                <option selected disabled hidden style='display: none' value=''></option>
                                <option value="Opt1">Opt1</option>
                                <option value="Opt2">Opt2</option>
                                <option value="Opt3">Opt3</option>
                            </select>
                        </div>    

                        <div class="form-group">
                            <label for="quilometragem">Quilometragem</label>
                            <input type="text" class="form-control" id="quilometragem" name="quilometragem">
                        </div>

                        <div class="form-group">
                            <label for="observacao">Observacao</label>
                            <input type="text" class="form-control" id="observacao" name="observacao">
                        </div>


                        <button type="submit" class="btn btn-primary btn-block">Enviar</button>
                    </form>

                    <div id="output"></div>
                </div>
            </div>      
        </div>
    </body>
</html>

JavaScript.html

<script>
  // Prevent forms from submitting.
  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);    


  function handleFormSubmit(formObject) {
    google.script.run.processForm(formObject);
    document.getElementById("myForm").reset();
  }
</script>

Everything works fine. However, I'm trying to add the user geolocation to be submitted alongside the inputs in the form. I don't want the user to do anything, it needs to be submitted as the user clicks the submit button. I have tried everything, including adding the showPosition() and showMap() functions that you can find in the Index.html file. However, I don't know what to do with it, as it gets the geolocation but I don't know how to make get it to be submitted with the form. Any help is appreciated.

Thanks in advance!


Solution

  • Here you go -

    1. Code.gs

    Just added the formObject.lat & formObject.long components to the processForm function.

    function doGet(request) {
      return HtmlService.createTemplateFromFile('Index').evaluate();
    }
    
    /* @Include JavaScript and CSS Files */
    function include(filename) {
      return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
    }
    
    /* @Process Form */
    function processForm(formObject) {
      var url = "URL OF GOOGLE SHEET";
      var ss = SpreadsheetApp.openByUrl(url);
      var ws = ss.getSheetByName("Data");
      ws.appendRow(
        [
          formObject.local,
          formObject.direcao,
          formObject.carro,
          formObject.quilometragem,
          formObject.observacao,
          Utilities.formatDate(new Date(), "GMT-3", "dd/MM/yyyy HH:mm:ss"),
          formObject.lat,
          formObject.long
        ]
      );
    }
    
    1. Index.html

    Did the following things here -

    • moved all script components to JavaScript.html
    • added 2 hidden input components to the form (lat & long)
    <!DOCTYPE html>
    <html>
    
    <head>
        <base target="_top">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
        <?!= include('JavaScript'); ?>
    </head>
    
    <body>
        <div class="container">
            <div class="row">
                <div class="col-6">
                    <form id="myForm" onsubmit="handleFormSubmit(this);">
                        <p class="h4 mb-4 text-left">Uso Frota</p>
    
                        <div class="form-group">
                            <label for="local">Local</label>
                            <input type="text" class="form-control" id="local" name="local">
                        </div>
    
                        <div class="form-group">
                            <label for="direcao">Direcao</label>
                            <select class="form-control" id="direcao" name="direcao">
                                <option selected disabled hidden style='display: none' value=''></option>
                                <option value="Chegada">Chegada</option>
                                <option value="Saida">Saida</option>
                                <option value="Chegada/Saida">Chegada/Saida</option>
                            </select>
                        </div>
    
                        <div class="form-group">
                            <label for="carro">Carro</label>
                            <select class="form-control" id="carro" name="carro">
                                <option selected disabled hidden style='display: none' value=''></option>
                                <option value="Opt1">Opt1</option>
                                <option value="Opt2">Opt2</option>
                                <option value="Opt3">Opt3</option>
                            </select>
                        </div>
    
                        <div class="form-group">
                            <label for="quilometragem">Quilometragem</label>
                            <input type="text" class="form-control" id="quilometragem" name="quilometragem">
                        </div>
    
                        <div class="form-group">
                            <label for="observacao">Observacao</label>
                            <input type="text" class="form-control" id="observacao" name="observacao">
                        </div>
    
                        <div class="form-group">
                            <input type="hidden" class="form-control" id="lat" name="lat">
                            <input type="hidden" class="form-control" id="long" name="long">
                        </div>
    
                        <button type="submit" class="btn btn-primary btn-block">Enviar</button>
                    </form>
    
                    <div id="output"></div>
                </div>
            </div>
        </div>
    </body>
    
    </html>
    
    1. JavaScript.html

    Modified the following things -

    • broke the showMap function to lat & long
    • added event listener to run showPosition on load
    • assigned values from showMap function to lat & long's corresponding html hidden form elements
    <script>
        function showPosition() {
            navigator.geolocation.getCurrentPosition(showMap);
        }
    
        function showMap(position) {
            // Get location data
            var lat = position.coords.latitude;
            var geo1 = document.getElementById("lat");
            geo1.value = lat;
            var long = position.coords.longitude;
            var geo2 = document.getElementById("long");
            geo2.value = long;
        }
    
        // Prevent forms from submitting.
        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);
        window.addEventListener('load', showPosition);
    
        function handleFormSubmit(formObject) {
            google.script.run.processForm(formObject);
            document.getElementById("myForm").reset();
        }
    </script>
    

    Tested this on my setup and it worked perfectly. Let me know in case you may require any further assistance too!