1

I'm trying to built an Orders system based on Google Spreadsheet. I got 1 Spreadsheet ("Order") with 2 sheets ("Orders" and "Products"). First is totally blank (it'll be the sheets where my dialog will put data. Second is a simple database with a list of articles:

  • Column A [ID]
  • Column B [BRAND]
  • Column C [PRODUCT]
  • Column D [PIECES]
  • Column E [PRICE]
  • Column F [CATEGORY]
  • Column G [UM]
  • Column H [VAT]
  • Column I [SUBCATEGORY]

One brand can have more than one product, in one or more category... I got

  • 1 Code.gs

and 4 HTML Dialogs

  • Scelta Categoria.html
  • Scelta Marchio.html
  • Scelta Prodotto.html
  • Ordini.html

Here I don't put Scelta Prodotto.html or Order.html code because first of all I need to pass data between the other dialogs. I don't wanna a web app if it's possible, but a simple spreadsheet with my custom dialogs working. I'm not searching for a spreadsheet shared with my costumers but more spreadsheet (every = at the other) one for every my costumer (is a little business, with only 30 costumers, and not all are able to use internet or pc to send me their orders (most of them used call me by phone and dictate me the order). For them who are more modern as I'm, I start develop those (as Google call in his Script Guide) Scripts Bound to Google Sheets.

code.gs

            function onOpen() {
                  SpreadsheetApp.getUi()
                  .createMenu('Ordine')
                  .addItem('Apri Maschera', 'ApriSceltaCategoria')
                  .addToUi();
                  //doGet();
                  ApriSceltaCategoria();  
            }
            // Visualizza l'interfaccia grafica.
            // Chiamata alla funzione "setRngProdotto()" per assicurare che tutti i nuovi valori sono inclusi nella dropdown list quando l'interfaccia è visualizzata.
            function ApriSceltaCategoria() {
              var ss;
              var html;
              setRngCat();
              ss = SpreadsheetApp.getActiveSpreadsheet();
              html = HtmlService.createHtmlOutputFromFile('Scelta Categoria').setSandboxMode(HtmlService.SandboxMode.IFRAME);
              ss.show(html);
            }
            function ApriSceltaMarchio(CategoriaScelta) {
              var ss;
              var html;
              setRngMarchi();
              setRngCompleto();
              ss = SpreadsheetApp.getActiveSpreadsheet();
              html = HtmlService.createHtmlOutputFromFile('Scelta Marchio').setSandboxMode(HtmlService.SandboxMode.IFRAME);
              ss.show(html);
            }
            function ApriSceltaProdotto(ProdottoScelto) {
              var ss;
              var html;
              setRngProdotti();
              setRngCompleto();
              ss = SpreadsheetApp.getActiveSpreadsheet();
              html = HtmlService.createHtmlOutputFromFile('Scelta Prodotto').setSandboxMode(HtmlService.SandboxMode.IFRAME);
              ss.show(html);
            }
            // Chiamata dalla Client-side JavaScript nella pagina.
            // Usa l'argomento del nome del range per estrarre i valori. I valori sono quindi ordinati e restituiti come un array di arrays.
            function getValuesForRngName(rngName) {
              var rngValues = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(rngName).getValues();
              return rngValues.sort();
            }
            //Expand the range defined by the name as rows are added
            function setRngCat() {
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var sh = ss.getSheetByName('Prodotti');
              var firstCellAddr = 'F2';
              var dataRngRowCount = sh.getDataRange().getLastRow();
              var listRngAddr = (firstCellAddr + ':F' + dataRngRowCount);
              var listRng = sh.getRange(listRngAddr);
              ss.setNamedRange('rngListaCategorie', listRng);
            }
            //Expand the range defined by the name as rows are added
            function setRngMarchi() {
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var sh = ss.getSheetByName('Prodotti');
              var firstCellAddr = 'B2';
              var dataRngRowCount = sh.getDataRange().getLastRow();
              var listRngAddr = (firstCellAddr + ':B' + dataRngRowCount);
              var listRng = sh.getRange(listRngAddr);
              ss.setNamedRange('rngListaMarchi', listRng);
            }
            //Expand the range defined by the name as rows are added
            function setRngProdotto() {
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var sh = ss.getSheetByName('Prodotti');
              var firstCellAddr = 'C2';
              var dataRngRowCount = sh.getDataRange().getLastRow();
              var listRngAddr = (firstCellAddr + ':C' + dataRngRowCount);
              var listRng = sh.getRange(listRngAddr);
              ss.setNamedRange('rngListaProdotti', listRng);
            }
            //Expand the range defined by the name as rows are added
            function setRngCompleto() {
              var ss = SpreadsheetApp.getActiveSpreadsheet();
              var sh = ss.getSheetByName('Prodotti');
              var firstCellAddr = 'A2';
              var dataRngRowCount = sh.getDataRange().getLastRow();
              var listRngAddr = (firstCellAddr + ':I' + dataRngRowCount);
              var listRng = sh.getRange(listRngAddr);
              ss.setNamedRange('rngListaCompleta', listRng);
            }
            function OrdinaDati() {
              setRngCat();
              var rangeToSort = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('rngListaCategorie').getValues();
              var selectionArray = rangeToSort.getValues(); 
              rangeToSort.setValues(selectionArray.sort(ordinaLi));
              setRngMarchi();
              var rangeToSort = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('rngListaMarchi').getValues();
              var selectionArray = rangeToSort.getValues(); 
              rangeToSort.setValues(selectionArray.sort(ordinaLi));
              setRngProdotto();
              var rangeToSort = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('rngListaProdotti').getValues();
              var selectionArray = rangeToSort.getValues(); 
              rangeToSort.setValues(selectionArray.sort(ordinaLi));
              setRngCompleto();
              var rangeToSort = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('rngListaCompleta').getValues();
              var selectionArray = rangeToSort.getValues(); 
              rangeToSort.setValues(selectionArray.sort(ordinaLi));
            }
            function ordinaLi(a,b) {
              // Sorts on the first column in the selection ONLY, ascending order.
               a=a[0];
               b=b[0];
               return a==b?0:(a<b?-1:1);
            }
            /**
             * Get the URL for the Google Apps Script running as a WebApp.
             */
            function getScriptUrl() {
             var url = ScriptApp.getService().getUrl();
             return url;
            }

            /**
             * Get "home page", or a requested page.
             * Expects a 'page' parameter in querystring.
             *
             * @param {event} e Event passed to doGet, with querystring
             * @returns {String/html} Html to be served
             */
            function doGet(e) {
              //Logger.log( Utilities.jsonStringify(e) );
              Logger.log(e.parameter.page);
              var pgToLoad = e.parameter.page;

              if (!e.parameter.page) {
                Logger.log('!e.parameter.page')
                // When no specific page requested, return "home page"
                return HtmlService.createTemplateFromFile('Scelta Categoria').evaluate()
                   .setSandboxMode(HtmlService.SandboxMode.IFRAME);
              }
              Logger.log('there is something for the page');
              // else, use page parameter to pick an html file from the script
              return HtmlService.createTemplateFromFile('Scelta Categoria').evaluate()
                .setSandboxMode(HtmlService.SandboxMode.IFRAME);
            }

Choose Category.html

        <!DOCTYPE html>
        <html style= "background-color:#B7CEEC;">
          <head>
            <base target="_top">
            <p id="p_cat">Categoria scelta: - </p>
          </head>
          <body>
        <title>TITOLO</title>
          <div>
            <form>
              <hr>
              <p style= "text-align: center;">Seleziona una <b style= "color:red;">CATEGORIA</b></p>
              <hr>
              <table id="Tabella">

              </table>
              <div style="text-align: center;">
                <input type="button" style="font-size: 14px;" id="btnAvanti" value="Avanti -->"
                  onclick= "google.script.run.withSuccessHandler(google.script.host.close).ApriSceltaMarchio()" />
              </div>
            </form>
          </div>
            <hr>
            <div style="float:right;">
              <input type="button" value="Chiudi"
                onclick="google.script.host.close()" />
            </div>
            <script type="text/javascript">
            function estraicategorie (values) {
              document.getElementById("btnAvanti").disabled = true;
              var categorie = eliminaduplicati(values);
              for (i = 0;i < categorie.length; i +=1) {
                  var tr = document.createElement('tr');   
                  var td1 = document.createElement('td');
                  var td2 = document.createElement('td');
                  var elemlabel = document.createElement('label');
                  strlabel = "" + categorie [i] + ""
                  elemlabel.innerHTML = strlabel.bold();
                  var eleminput = document.createElement('input');
                  eleminput.setAttribute('type', 'radio');
                  eleminput.setAttribute('name', 'categorie');
                  eleminput.setAttribute('value', categorie [i]);
                  td1.appendChild(elemlabel);
                  td2.appendChild(eleminput);
                  tr.appendChild(td1);
                  tr.appendChild(td2);
                  document.getElementById('Tabella').appendChild(tr);
              }
              var ch = document.getElementsByName('categorie');
              for (var i = ch.length; i--;) {
                ch[i].onchange = function() {
                  document.getElementById("btnAvanti").disabled = false;
                  document.getElementById("p_cat").innerHTML = "Categoria scelta: " + this.value;
                 }
               }    
            }
            function eliminaduplicati(a) {
              var temp = {};
              for (var i = 0; i < a.length; i++)
                temp[a[i]] = true;
                var r = [];
                for (var k in temp)
                  r.push(k);
                  return r;
            }
            function populate() {
              google.script.run.withSuccessHandler(estraicategorie).getValuesForRngName('rngListaCategorie');
            }
            </script>
            <script  type="text/javascript">
              // Using the "load" event to execute the function "populate"
              window.addEventListener('load', populate);
            </script>
          </body>
        </html>

Scelta marchio.html

            <!DOCTYPE html>
            <html style= "background-color:#B7CEEC;">
              <head>
                <base target="_top">
              <p id="p_cat"></p><p id="p_mar"></p>
              </head>
              <body>
            <title>TITOLO</title>
              <div>
                <form>
                  <hr>
                  <p style= "text-align: center;">Seleziona un <b style= "color:red;">MARCHIO</b></p>
                  <hr>
                  <table id="Tabella">

                  </table>
                  <div style="text-align: center;">
                    <input style="font-size: 14px;" type="submit" id="btnIndietro" value="<-- Torna>" onclick= "google.script.run.withSuccessHandler(google.script.host.close).ApriSceltaCategoria()" />   
                    <input style="font-size: 14px;" type="submit" id="btnAvanti" value="Avanti -->" onclick= "google.script.run.withSuccessHandler(google.script.host.close).ApriSceltaProdotto()" />   
                  </div>
                </form>
              </div>
                <hr>
                <div style="float:right;">
                  <input type="button" value="Chiudi" onclick="google.script.host.close()" />
                </div>
                <script type="text/javascript">
                function estraimarchi (values) {
                  document.getElementById("btnAvanti").disabled = true;
                  var categoria =              // HOW CAN I ACHIEVE THIS ??? 
                  var elencofiltratoXcat = [];
                  for (var i = 0; i < values.length; i +=1) {
                    if (values [i][5] === categoria) {
                      elencofiltratoXcat.push(values [i]);
                    }
                  }
                  var elencofiltratomarchi = [];
                  for (i = 0; i < elencofiltratoXcat.length; i +=1) {
                      elencofiltratomarchi.push(elencofiltratoXcat[i][1]);
                  }
                  var marchi = [];
                  marchi = eliminaduplicati(elencofiltratomarchi);
                  marchi.sort();
                  for (i = 0;i < marchi.length; i +=1) {
                      var tr = document.createElement('tr');   
                      var td1 = document.createElement('td');
                      var td2 = document.createElement('td');
                      var elemlabel = document.createElement('label');
                      strlabel = "" + marchi [i] + "";
                      elemlabel.innerHTML = strlabel.bold();
                      var eleminput = document.createElement('input');
                      eleminput.setAttribute('type', 'radio');
                      eleminput.setAttribute('name', 'marchi');
                      eleminput.setAttribute('value', marchi [i]);
                      td1.appendChild(elemlabel);
                      td2.appendChild(eleminput);
                      tr.appendChild(td1);
                      tr.appendChild(td2);
                      document.getElementById('Tabella').appendChild(tr);
                  }
                  var ch = document.getElementsByName('marchi');
                  for (var i = ch.length; i--;) {
                    ch[i].onchange = function() {
                      document.getElementById("btnAvanti").disabled = false;
                      document.getElementById("p_cat").innerHTML = "Categoria: " + categoria;
                      document.getElementById("p_mar").innerHTML = "Marchio: " + this.value;
                     }
                   }    
                }
                function populate(){
                  google.script.run.withSuccessHandler(estraimarchi).getValuesForRngName('rngListaCompleta');
                }
                function eliminaduplicati(a) {
                  var temp = {};
                  for (var i = 0; i < a.length; i++)
                    temp[a[i]] = true;
                    var r = [];
                    for (var k in temp)
                      r.push(k);
                      return r;
                }    
                </script>
                <script>
                  // Using the "load" event to execute the function "populate"
                  window.addEventListener('load', populate);
                </script>
              </body>
            </html>

As I commented in the code, the problem is when I try to pass values between dialogs. I try to use in Scelta Categoria.html

          document.getElementById("btnAvanti").disabled = false;
          document.getElementById("p_cat").innerHTML = "Categoria scelta: " + this.value;
          var userProperties = PropertiesService.getUserProperties();
          var userCat = userProperties.setProperty('SceltaCategoria', '' + this.value + '');

but nothing to do. Sure I can open another sheet and put user choice in A1 for example, then hide the sheet, but I reputate more quick if I can use variables. Any suggestion, try to remain in this context and not in web app ? Thanx in advance and sorry for my bad english.

Emanuele Tinari
  • 120
  • 1
  • 2
  • 10
  • You can use "sessionStorage" to store and then retrieve values in the browser. [Link to Stack Overflow post](http://stackoverflow.com/a/41265164/2946873) also see [HTML5 Local Storage](https://www.w3schools.com/html/html5_webstorage.asp) – Alan Wells Feb 22 '17 at 23:25
  • Thank a lot @SandyGood. Your answer is the right solution form me. I don't understand why somebody down vote my question... maybe for someone is not clear... but if SandyGood answer in a way that I solve my problem, no one can say: your question isn't clear (SandyGood docét)!!! – Emanuele Tinari Feb 23 '17 at 17:31
  • And if you transform your comment in an answer, I'm ready to vote for you: simple and clear. – Emanuele Tinari Feb 23 '17 at 17:37
  • Not sure why you got a down vote. Because I shared a link to another answer, I won't add an answer here. Thank you for the feedback. – Alan Wells Feb 23 '17 at 17:54
  • If you really have a lot of data you can also use files. I was working on a function to create a jstree type of directory for my Google Account and because it takes so much resources to run I decided to store it. Unfortunately, it was about 30K and it would not fit into PropertiesService so I stored in a file instead. And amazingly enough it runs fairly fast. – Cooper Mar 07 '17 at 05:48

0 Answers0