{"id":2916,"date":"2020-04-10T17:32:08","date_gmt":"2020-04-10T15:32:08","guid":{"rendered":"https:\/\/www.thediar.com\/?p=2916"},"modified":"2022-03-10T15:48:37","modified_gmt":"2022-03-10T14:48:37","slug":"serverless-web-apps-google-scripts","status":"publish","type":"post","link":"https:\/\/www.thediar.com\/en\/blog\/serverless-web-apps-google-scripts\/","title":{"rendered":"Google App Script Tutorial: Example of html form and Google Spreadsheet database"},"content":{"rendered":"<p>Traditionally, web applications have been implemented in client-server infrastructures. The paradigm has been to have our own servers that receive requests from our users&#8217; browsers. With the increasing use of javascript frameworks, more and more websites are being implemented as simply static websites that require nothing more than serving HTML code, CSS styles and images.<\/p>\n<p>GitHub pages allows web hosting of static websites totally free for public repositories that we own. One of the main drawbacks is not being able to permanently save data in a database or having some interactivity with the server. Ex: send emails.<\/p>\n<p>With this article we are going to see an example of how a static websites could save information in a Google Spreadsheet.<\/p>\n<h3>1. Create a Google Spreadsheet and its associated Google Apps Scripts<\/h3>\n<p><span class=\"tlid-translation translation\" lang=\"en\"><span title=\"\">Create a blank Google Spreadsheet from <a href=\"https:\/\/sheets.new\">sheets.new<\/a>.<\/span> <span title=\"\">Give it a descriptive name, for example the name of your website and the type of form you want to implement.<\/span> <span title=\"\">Eg: mydomain.com &#8211; Contact form<\/span><\/span><\/p>\n<p><span title=\"\">From the Tools menu option, select Script Editor.<\/span> <span class=\"\" title=\"\">I recommend that you put the same name to the Google Apps Scripts as to the previous Google Spreadsheet to be able to locate them quickly.<\/span><\/p>\n<h3>2. Copy the code and customize fields<\/h3>\n<p><span class=\"tlid-translation translation\" lang=\"en\"><span class=\"\" title=\"\">Then you can copy below code and copy it to your Google Apps Script.<\/span><\/span><\/p>\n<style>.gist table { margin-bottom: 0; }<\/style>\n<div style=\"tab-size: 8\" id=\"gist102301248\" class=\"gist\">\n<div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n<div class=\"gist-data\">\n<div class=\"js-gist-file-update-container js-task-list-container\">\n<div id=\"file-google-apps-script-contact-form-js\" class=\"file my-2\">\n<div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-javascript  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"google-apps-script-contact-form.js content, created by jrosell on 02:40PM on April 10, 2020.\"\n    ><\/p>\n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n<p>  <template class=\"js-file-alert-template\"><\/p>\n<div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n    <span><br \/>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.<br \/>\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a><br \/>\n    <\/span><\/p>\n<div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters<br \/>\n<\/a>\n<\/div>\n<\/div>\n<p><\/template><br \/>\n<template class=\"js-line-alert-template\"><br \/>\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\"><br \/>\n    <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n<\/span><\/template><\/p>\n<table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"google-apps-script-contact-form.js\">\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC1\" class=\"blob-code blob-code-inner js-file-line\">var SHEET_NAME = &quot;Sheet1&quot;;    \/\/  Enter sheet name where data is to be written<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC2\" class=\"blob-code blob-code-inner js-file-line\">var inputFields = [&quot;nombre&quot;, &quot;email&quot;, &quot;comentarios&quot;];<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC3\" class=\"blob-code blob-code-inner js-file-line\">var SCRIPT_PROP = PropertiesService.getScriptProperties();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC4\" class=\"blob-code blob-code-inner js-file-line\">function doRequest(e) {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC5\" class=\"blob-code blob-code-inner js-file-line\">  var lock = LockService.getPublicLock();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC6\" class=\"blob-code blob-code-inner js-file-line\">  lock.waitLock(30000);  \/\/ wait 30 seconds before conceding defeat.<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC7\" class=\"blob-code blob-code-inner js-file-line\">  try {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC8\" class=\"blob-code blob-code-inner js-file-line\">    var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty(&quot;key&quot;));<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC9\" class=\"blob-code blob-code-inner js-file-line\">    var sheet = doc.getSheetByName(SHEET_NAME);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC10\" class=\"blob-code blob-code-inner js-file-line\">    var lastColumn = sheet.getLastColumn();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC11\" class=\"blob-code blob-code-inner js-file-line\">    if(lastColumn==0){<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC12\" class=\"blob-code blob-code-inner js-file-line\">      sheet.getRange(1, 1, 1,inputFields.length).setValues([inputFields]);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC13\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC14\" class=\"blob-code blob-code-inner js-file-line\">    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; \/\/getRange(row, column, numRows, numColumns)    <\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC15\" class=\"blob-code blob-code-inner js-file-line\">    var nextRow = sheet.getLastRow()+1;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC16\" class=\"blob-code blob-code-inner js-file-line\">    var row = []; <\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC17\" class=\"blob-code blob-code-inner js-file-line\">    for (i in headers){<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC18\" class=\"blob-code blob-code-inner js-file-line\">        if (headers[i] == &quot;Timestamp&quot;){ \/\/ special case if you include a &#39;Timestamp&#39; column<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC19\" class=\"blob-code blob-code-inner js-file-line\">          row.push(new Date());<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC20\" class=\"blob-code blob-code-inner js-file-line\">        } else {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC21\" class=\"blob-code blob-code-inner js-file-line\">          if(headers[i]){<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC22\" class=\"blob-code blob-code-inner js-file-line\">            row.push(e.parameter[headers[i]]);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC23\" class=\"blob-code blob-code-inner js-file-line\">          }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC24\" class=\"blob-code blob-code-inner js-file-line\">        }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC25\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC26\" class=\"blob-code blob-code-inner js-file-line\">    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC27\" class=\"blob-code blob-code-inner js-file-line\">    return HtmlService.createHtmlOutput(JSON.stringify({&quot;result&quot;:&quot;success&quot;, &quot;data&quot;: e}));<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC28\" class=\"blob-code blob-code-inner js-file-line\">  } catch(e){<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC29\" class=\"blob-code blob-code-inner js-file-line\">    return ContentService<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC30\" class=\"blob-code blob-code-inner js-file-line\">    .createTextOutput(JSON.stringify({&quot;result&quot;:&quot;error&quot;, &quot;error&quot;: e}))<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC31\" class=\"blob-code blob-code-inner js-file-line\">    .setMimeType(ContentService.MimeType.JSON);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC32\" class=\"blob-code blob-code-inner js-file-line\">  } finally {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC33\" class=\"blob-code blob-code-inner js-file-line\">    lock.releaseLock();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC34\" class=\"blob-code blob-code-inner js-file-line\">  }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC35\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC36\" class=\"blob-code blob-code-inner js-file-line\">function doPost(e){return doRequest(e);}<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC37\" class=\"blob-code blob-code-inner js-file-line\">function doGet(e){return doRequest(e);}<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC38\" class=\"blob-code blob-code-inner js-file-line\">function setup() {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC39\" class=\"blob-code blob-code-inner js-file-line\">  var doc = SpreadsheetApp.getActiveSpreadsheet();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC40\" class=\"blob-code blob-code-inner js-file-line\">  SCRIPT_PROP.setProperty(&quot;key&quot;, doc.getId());<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L41\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"41\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC41\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L42\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"42\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC42\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L43\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"43\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC43\" class=\"blob-code blob-code-inner js-file-line\">function testSheetsWrite() {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L44\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"44\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC44\" class=\"blob-code blob-code-inner js-file-line\">   var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty(&quot;key&quot;));<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L45\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"45\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC45\" class=\"blob-code blob-code-inner js-file-line\">    var sheet = doc.getSheetByName(SHEET_NAME);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L46\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"46\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC46\" class=\"blob-code blob-code-inner js-file-line\">    var lastColumn = sheet.getLastColumn();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L47\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"47\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC47\" class=\"blob-code blob-code-inner js-file-line\">    if(lastColumn==0){<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L48\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"48\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC48\" class=\"blob-code blob-code-inner js-file-line\">      sheet.getRange(1, 1, 1,inputFields.length).setValues([inputFields]);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L49\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"49\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC49\" class=\"blob-code blob-code-inner js-file-line\">    }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-google-apps-script-contact-form-js-L50\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"50\"><\/td>\n<td id=\"file-google-apps-script-contact-form-js-LC50\" class=\"blob-code blob-code-inner js-file-line\">}<\/td>\n<\/tr>\n<\/table>\n<\/div><\/div>\n<\/p><\/div>\n<\/div><\/div>\n<div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/jrosell\/be5766949856f3e54c1d42992342e30d\/raw\/47ac4784e89b4a16b007c4549315d6a49cd5a51a\/google-apps-script-contact-form.js\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a><br \/>\n        <a href=\"https:\/\/gist.github.com\/jrosell\/be5766949856f3e54c1d42992342e30d#file-google-apps-script-contact-form-js\" class=\"Link--inTextBlock\"><br \/>\n          google-apps-script-contact-form.js<br \/>\n        <\/a><br \/>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n<\/p><\/div>\n<\/div>\n<p><span class=\"pl-c1\"><span class=\"pl-s1\">Make sure to customize the SHEET_NAME and inputFields variables by the tab name you want to use in your Google Spreadsheet and the form fields you want to receive. In this case we are using the Sheet1 tab and the name, email and comments fields (in spanish).<br \/>\n<\/span><\/span><\/p>\n<h3>3. Setup the Google Apps Scripts<\/h3>\n<p>Run the setup function. This way we add the Key property on the Google Apps Scripts with the ID of the Google Spreadsheet we use. If you wish, you could add it manually.<\/p>\n<h3>4. Publish the web application<\/h3>\n<p><span class=\"tlid-translation translation\" lang=\"en\"><span title=\"\">From the Publish menu, select the Deploy as web app option.<\/span> <span title=\"\">Be sure to select the option &#8220;Anyone, even anonymous&#8221; in &#8220;Who has access to the app:&#8221; and post.<\/span><\/span><\/p>\n<p><span class=\"\" title=\"\">Don&#8217;t worry if you see the &#8220;This app isn&#8217;t verified&#8221; alert.<\/span> <span class=\"\" title=\"\">You have to go to the advanced options and select the &#8220;unsafe&#8221; option.<\/span><\/p>\n<p><span class=\"\" title=\"\">Write down the URL since it is in this URL where you will have to send the data of your form.<\/span><\/p>\n<h3>5. Test the form<\/h3>\n<p><span class=\"tlid-translation translation\" lang=\"en\"><span title=\"\">On your website you can already use the form.<\/span> <span class=\"\" title=\"\">Copy and paste this HTML to your website and modify the URL that was saved on line 22<\/span><\/span><\/p>\n<style>.gist table { margin-bottom: 0; }<\/style>\n<div style=\"tab-size: 8\" id=\"gist102301863\" class=\"gist\">\n<div class=\"gist-file\" translate=\"no\" data-color-mode=\"light\" data-light-theme=\"light\">\n<div class=\"gist-data\">\n<div class=\"js-gist-file-update-container js-task-list-container\">\n<div id=\"file-contact-form-html\" class=\"file my-2\">\n<div itemprop=\"text\"\n      class=\"Box-body p-0 blob-wrapper data type-html  \"\n      style=\"overflow: auto\" tabindex=\"0\" role=\"region\"\n      aria-label=\"contact-form.html content, created by jrosell on 03:24PM on April 10, 2020.\"\n    ><\/p>\n<div class=\"js-check-hidden-unicode js-blob-code-container blob-code-content\">\n<p>  <template class=\"js-file-alert-template\"><\/p>\n<div data-view-component=\"true\" class=\"flash flash-warn flash-full d-flex flex-items-center\">\n  <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n    <span><br \/>\n      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.<br \/>\n      <a class=\"Link--inTextBlock\" href=\"https:\/\/github.co\/hiddenchars\" target=\"_blank\">Learn more about bidirectional Unicode characters<\/a><br \/>\n    <\/span><\/p>\n<div data-view-component=\"true\" class=\"flash-action\">        <a href=\"{{ revealButtonHref }}\" data-view-component=\"true\" class=\"btn-sm btn\">    Show hidden characters<br \/>\n<\/a>\n<\/div>\n<\/div>\n<p><\/template><br \/>\n<template class=\"js-line-alert-template\"><br \/>\n  <span aria-label=\"This line has hidden Unicode characters\" data-view-component=\"true\" class=\"line-alert tooltipped tooltipped-e\"><br \/>\n    <svg aria-hidden=\"true\" height=\"16\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" data-view-component=\"true\" class=\"octicon octicon-alert\">\n    <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"><\/path>\n<\/svg><br \/>\n<\/span><\/template><\/p>\n<table data-hpc class=\"highlight tab-size js-file-line-container\" data-tab-size=\"4\" data-paste-markdown-skip data-tagsearch-path=\"contact-form.html\">\n<tr>\n<td id=\"file-contact-form-html-L1\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"1\"><\/td>\n<td id=\"file-contact-form-html-LC1\" class=\"blob-code blob-code-inner js-file-line\">\n<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L2\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"2\"><\/td>\n<td id=\"file-contact-form-html-LC2\" class=\"blob-code blob-code-inner js-file-line\">&lt;!DOCTYPE html&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L3\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"3\"><\/td>\n<td id=\"file-contact-form-html-LC3\" class=\"blob-code blob-code-inner js-file-line\">&lt;html&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L4\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"4\"><\/td>\n<td id=\"file-contact-form-html-LC4\" class=\"blob-code blob-code-inner js-file-line\">    &lt;head&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L5\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"5\"><\/td>\n<td id=\"file-contact-form-html-LC5\" class=\"blob-code blob-code-inner js-file-line\">        &lt;meta charset=&quot;UTF-8&quot;&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L6\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"6\"><\/td>\n<td id=\"file-contact-form-html-LC6\" class=\"blob-code blob-code-inner js-file-line\">        &lt;title&gt;Formulario de contacto&lt;\/title&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L7\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"7\"><\/td>\n<td id=\"file-contact-form-html-LC7\" class=\"blob-code blob-code-inner js-file-line\">        &lt;script src=&quot;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery\/3.4.1\/jquery.min.js&quot;&gt;&lt;\/script&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L8\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"8\"><\/td>\n<td id=\"file-contact-form-html-LC8\" class=\"blob-code blob-code-inner js-file-line\">        &lt;script src=&quot;https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery-serialize-object\/2.5.0\/jquery.serialize-object.min.js&quot;&gt;&lt;\/script&gt;    <\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L9\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"9\"><\/td>\n<td id=\"file-contact-form-html-LC9\" class=\"blob-code blob-code-inner js-file-line\">    &lt;\/head&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L10\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"10\"><\/td>\n<td id=\"file-contact-form-html-LC10\" class=\"blob-code blob-code-inner js-file-line\">    &lt;body&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L11\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"11\"><\/td>\n<td id=\"file-contact-form-html-LC11\" class=\"blob-code blob-code-inner js-file-line\">        &lt;form id=&quot;contact-form&quot;&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L12\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"12\"><\/td>\n<td id=\"file-contact-form-html-LC12\" class=\"blob-code blob-code-inner js-file-line\">            &lt;h2&gt;Formulario de contacto&lt;\/h2&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L13\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"13\"><\/td>\n<td id=\"file-contact-form-html-LC13\" class=\"blob-code blob-code-inner js-file-line\">            &lt;p&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L14\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"14\"><\/td>\n<td id=\"file-contact-form-html-LC14\" class=\"blob-code blob-code-inner js-file-line\">                &lt;label&gt;Nombre&lt;br&gt;&lt;input type=&quot;text&quot;  name=&quot;nombre&quot;&gt;&lt;\/label&gt;&lt;br&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L15\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"15\"><\/td>\n<td id=\"file-contact-form-html-LC15\" class=\"blob-code blob-code-inner js-file-line\">                &lt;label&gt;Email&lt;br&gt;&lt;input type=&quot;email&quot; name=&quot;email&quot;&gt;&lt;\/label&gt;&lt;br&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L16\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"16\"><\/td>\n<td id=\"file-contact-form-html-LC16\" class=\"blob-code blob-code-inner js-file-line\">                &lt;label&gt;Comentarios&lt;br&gt;&lt;\/label&gt;&lt;textarea name=&quot;comentarios&quot; cols=40 rows=5&gt;&lt;\/textarea&gt;&lt;\/label&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L17\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"17\"><\/td>\n<td id=\"file-contact-form-html-LC17\" class=\"blob-code blob-code-inner js-file-line\">            &lt;\/p&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L18\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"18\"><\/td>\n<td id=\"file-contact-form-html-LC18\" class=\"blob-code blob-code-inner js-file-line\">            &lt;input id=&quot;submit-contact-form&quot; type=&quot;submit&quot; value=&quot;Submit&quot;&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L19\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"19\"><\/td>\n<td id=\"file-contact-form-html-LC19\" class=\"blob-code blob-code-inner js-file-line\">        &lt;\/form&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L20\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"20\"><\/td>\n<td id=\"file-contact-form-html-LC20\" class=\"blob-code blob-code-inner js-file-line\">        &lt;script&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L21\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"21\"><\/td>\n<td id=\"file-contact-form-html-LC21\" class=\"blob-code blob-code-inner js-file-line\">        (function() {       <\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L22\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"22\"><\/td>\n<td id=\"file-contact-form-html-LC22\" class=\"blob-code blob-code-inner js-file-line\">            var $form = $(&#39;form#contact-form&#39;), url = &#39;https:\/\/script.google.com\/macros\/s\/key\/exec&#39;;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L23\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"23\"><\/td>\n<td id=\"file-contact-form-html-LC23\" class=\"blob-code blob-code-inner js-file-line\">            $(&#39;#submit-contact-form&#39;).on(&#39;click&#39;, function(e) {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L24\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"24\"><\/td>\n<td id=\"file-contact-form-html-LC24\" class=\"blob-code blob-code-inner js-file-line\">                e.preventDefault();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L25\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"25\"><\/td>\n<td id=\"file-contact-form-html-LC25\" class=\"blob-code blob-code-inner js-file-line\">                var jqxhr = $.ajax({<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L26\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"26\"><\/td>\n<td id=\"file-contact-form-html-LC26\" class=\"blob-code blob-code-inner js-file-line\">                    url: url,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L27\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"27\"><\/td>\n<td id=\"file-contact-form-html-LC27\" class=\"blob-code blob-code-inner js-file-line\">                    method: &quot;GET&quot;,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L28\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"28\"><\/td>\n<td id=\"file-contact-form-html-LC28\" class=\"blob-code blob-code-inner js-file-line\">                    dataType: &quot;json&quot;,<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L29\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"29\"><\/td>\n<td id=\"file-contact-form-html-LC29\" class=\"blob-code blob-code-inner js-file-line\">                    data: $form.serializeObject(),<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L30\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"30\"><\/td>\n<td id=\"file-contact-form-html-LC30\" class=\"blob-code blob-code-inner js-file-line\">                    success: function(data) {<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L31\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"31\"><\/td>\n<td id=\"file-contact-form-html-LC31\" class=\"blob-code blob-code-inner js-file-line\">                        console.log(data);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L32\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"32\"><\/td>\n<td id=\"file-contact-form-html-LC32\" class=\"blob-code blob-code-inner js-file-line\">                        $(&#39;form#contact-form&#39;).hide();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L33\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"33\"><\/td>\n<td id=\"file-contact-form-html-LC33\" class=\"blob-code blob-code-inner js-file-line\">                        $(&#39;body&#39;).append(&quot;&lt;p style=&#39;color:green&#39;&gt;Gracias por tu inter\u00e9s. Contactaremos contigo en breve.&lt;\/p&gt;&quot;);<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L34\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"34\"><\/td>\n<td id=\"file-contact-form-html-LC34\" class=\"blob-code blob-code-inner js-file-line\">                    }<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L35\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"35\"><\/td>\n<td id=\"file-contact-form-html-LC35\" class=\"blob-code blob-code-inner js-file-line\">                });<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L36\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"36\"><\/td>\n<td id=\"file-contact-form-html-LC36\" class=\"blob-code blob-code-inner js-file-line\">            });<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L37\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"37\"><\/td>\n<td id=\"file-contact-form-html-LC37\" class=\"blob-code blob-code-inner js-file-line\">        })();<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L38\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"38\"><\/td>\n<td id=\"file-contact-form-html-LC38\" class=\"blob-code blob-code-inner js-file-line\">        &lt;\/script&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L39\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"39\"><\/td>\n<td id=\"file-contact-form-html-LC39\" class=\"blob-code blob-code-inner js-file-line\">    &lt;\/body&gt;<\/td>\n<\/tr>\n<tr>\n<td id=\"file-contact-form-html-L40\" class=\"blob-num js-line-number js-blob-rnum\" data-line-number=\"40\"><\/td>\n<td id=\"file-contact-form-html-LC40\" class=\"blob-code blob-code-inner js-file-line\">&lt;\/html&gt;<\/td>\n<\/tr>\n<\/table>\n<\/div><\/div>\n<\/p><\/div>\n<\/div><\/div>\n<div class=\"gist-meta\">\n        <a href=\"https:\/\/gist.github.com\/jrosell\/5c8873e8d6f4098ddcc05a5488da05c3\/raw\/d82e40f4adaa87e0fd0f977e3a09f01e356c138a\/contact-form.html\" style=\"float:right\" class=\"Link--inTextBlock\">view raw<\/a><br \/>\n        <a href=\"https:\/\/gist.github.com\/jrosell\/5c8873e8d6f4098ddcc05a5488da05c3#file-contact-form-html\" class=\"Link--inTextBlock\"><br \/>\n          contact-form.html<br \/>\n        <\/a><br \/>\n        hosted with &#10084; by <a class=\"Link--inTextBlock\" href=\"https:\/\/github.com\">GitHub<\/a>\n      <\/div>\n<\/p><\/div>\n<\/div>\n<p><span class=\"tlid-translation translation\" lang=\"en\"><span class=\"\" title=\"\">Try it and customize what you want.<\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Traditionally, web applications have been implemented in client-server infrastructures. The paradigm has been to have our own servers that receive requests from our users&#8217; browsers. With the increasing use of javascript frameworks, more and more websites are being implemented as [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3312,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2916","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","clearfix"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.thediar.com\/wp-content\/uploads\/serverless-google-apps-14.png?fit=662%2C298&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p8d1gX-L2","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/posts\/2916","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/comments?post=2916"}],"version-history":[{"count":4,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/posts\/2916\/revisions"}],"predecessor-version":[{"id":6229,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/posts\/2916\/revisions\/6229"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/media\/3312"}],"wp:attachment":[{"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/media?parent=2916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/categories?post=2916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.thediar.com\/en\/wp-json\/wp\/v2\/tags?post=2916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}