Google Sheets is a great tool to store spreadsheets online, you can access them anytime, anywhere, and are always ready to share with others.
If you only want to share a portion of the spreadsheet, creating a new sheet and using the importRange
function may have met your requirements. However, if you want to provide a more intuitive interface for the user to perform operations such as sort, search, highlight, paging … then you can write a web app using Google’s Apps Script .
This article consists of 2 parts. Part 1 we will display all the data each time we load the web app. Part 2 we will create the Search function and display only the correct data that the user requests. Note, this post is for beginners.
1. Display data table
To create tables, we can use pure JavaScript, but we use the Data Tables jQuery plug-in to make creating tables easier and has many functions available.
I looked for the jQuery plug-in table on Google and saw this plug-in appear first, so I used it. If you know which plug-in is better then let me know.
Let’s go over the results before starting to code.
Code Apps Script
As instructed by Google , we need the doGet()
or doPost()
that returns the HTML Service object to create an interface for the web app. We separate the CSS, JavaScript file with the HTML file according to Google’s best practices guide using the include()
function.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">// file Code.gs</span> <span class="token keyword">function</span> <span class="token function">doGet</span> <span class="token punctuation">(</span> <span class="token parameter">e</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> HtmlService <span class="token punctuation">.</span> <span class="token function">createTemplateFromFile</span> <span class="token punctuation">(</span> <span class="token string">'Index.html'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">evaluate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">include</span> <span class="token punctuation">(</span> <span class="token parameter">filename</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> HtmlService <span class="token punctuation">.</span> <span class="token function">createHtmlOutputFromFile</span> <span class="token punctuation">(</span> filename <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">getContent</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Index.html
In the HTML file, we will create a <table>
tag with id="table"
to render the table after fetching data from a Google Sheets file . Please note, Data Tables jQuery is a plug-in of jQuery so do not forget to insert the CDN jQuery link into the HTML file before inserting the plug-in link.
Now that I know how to insert the JavaScript file link, the code must be run in the correct order. Back then, I was self-taught, so no one taught me about it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <span class="token doctype"><!DOCTYPE html></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> html</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> head</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> base</span> <span class="token attr-name">target</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> _top <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> link</span> <span class="token attr-name">rel</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> stylesheet <span class="token punctuation">"</span></span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text/css <span class="token punctuation">"</span></span> <span class="token attr-name">href</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> https://cdn.datatables.net/1.10.24/css/jquery.dataTables.css <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token prolog"><?!= include('Stylesheet') ?></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> head</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> body</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> heading <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Invoice <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> grey <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Invoice data from the spreadsheet, use <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> a</span> <span class="token attr-name">href</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> https://datatables.net/ <span class="token punctuation">"</span></span> <span class="token attr-name">target</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> _blank <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Data Table jQuery <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> a</span> <span class="token punctuation">></span></span> plug-in to render table. <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> table</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> table <span class="token punctuation">"</span></span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> display <span class="token punctuation">"</span></span> <span class="token attr-name">width</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> 75% <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> table</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> https://code.jquery.com/jquery-3.6.0.min.js <span class="token punctuation">"</span></span> <span class="token attr-name">integrity</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4= <span class="token punctuation">"</span></span> <span class="token attr-name">crossorigin</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> anonymous <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text/javascript <span class="token punctuation">"</span></span> <span class="token attr-name">charset</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> utf8 <span class="token punctuation">"</span></span> <span class="token attr-name">src</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> https://cdn.datatables.net/1.10.24/js/jquery.dataTables.js <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token prolog"><?!= include('JavaScript') ?></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> body</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> html</span> <span class="token punctuation">></span></span> |
JavaScript code
We use jQuery’s ready function to execute a callback function when the DOM is ready. We will use the google.script.run class to run the Apps Script function while on the client-side.
To initialize DataTable instance, we need to pass columns
, data
and some other options you can refer to at https://datatables.net/ .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token comment">// File JavaScript.html</span> <span class="token operator"><</span> script <span class="token operator">></span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">ready</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> google <span class="token punctuation">.</span> script <span class="token punctuation">.</span> run <span class="token punctuation">.</span> <span class="token function">withSuccessHandler</span> <span class="token punctuation">(</span> showDataTable <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">getAllData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">showDataTable</span> <span class="token punctuation">(</span> <span class="token parameter">dataTable</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> header <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> dataTable <span class="token punctuation">.</span> header <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token parameter">item</span> <span class="token operator">=></span> <span class="token punctuation">{</span> header <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> title <span class="token operator">:</span> item <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">'#table'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">DataTable</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> data <span class="token operator">:</span> dataTable <span class="token punctuation">.</span> data <span class="token punctuation">,</span> columns <span class="token operator">:</span> header <span class="token punctuation">,</span> searching <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> info <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Code server- side
On server-side ( Code.gs file) we will write getAllData()
function to return data to create table.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token comment">// File Code.gs</span> <span class="token keyword">var</span> ss <span class="token operator">=</span> SpreadsheetApp <span class="token punctuation">.</span> <span class="token function">getActiveSpreadsheet</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> sheet <span class="token operator">=</span> ss <span class="token punctuation">.</span> <span class="token function">getSheetByName</span> <span class="token punctuation">(</span> <span class="token string">'Invoice'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">doGet</span> <span class="token punctuation">(</span> <span class="token parameter">e</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">include</span> <span class="token punctuation">(</span> <span class="token parameter">filename</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getAllData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> range <span class="token operator">=</span> sheet <span class="token punctuation">.</span> <span class="token function">getRange</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> sheet <span class="token punctuation">.</span> <span class="token function">getLastRow</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">,</span> sheet <span class="token punctuation">.</span> <span class="token function">getLastColumn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> values <span class="token operator">=</span> range <span class="token punctuation">.</span> <span class="token function">getValues</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> header <span class="token operator">:</span> <span class="token function">getHeaderArr</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> data <span class="token operator">:</span> values <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getHeaderArr</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> headerRowPosition <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> range <span class="token operator">=</span> sheet <span class="token punctuation">.</span> <span class="token function">getRange</span> <span class="token punctuation">(</span> headerRowPosition <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> sheet <span class="token punctuation">.</span> <span class="token function">getLastColumn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> range <span class="token punctuation">.</span> <span class="token function">getValues</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Add loader
Each load can take a few seconds so we will add the loader to alert the user that the data is being loaded.
1 2 3 4 5 6 | <span class="token comment"><!-- File Index.html --></span> ... <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> loading <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> ... |
We will create an area with id loading
to insert the loader. The CSS code is referenced from the website https://www.w3schools.com/ .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token comment"><!-- File Stylesheet.htm l--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> style</span> <span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> <span class="token selector">#loading</span> <span class="token punctuation">{</span> <span class="token property">margin</span> <span class="token punctuation">:</span> auto <span class="token punctuation">;</span> <span class="token property">border</span> <span class="token punctuation">:</span> 16px solid #f3f3f3 <span class="token punctuation">;</span> <span class="token property">border-radius</span> <span class="token punctuation">:</span> 50% <span class="token punctuation">;</span> <span class="token property">border-top</span> <span class="token punctuation">:</span> 16px solid #3498db <span class="token punctuation">;</span> <span class="token property">width</span> <span class="token punctuation">:</span> 120px <span class="token punctuation">;</span> <span class="token property">height</span> <span class="token punctuation">:</span> 120px <span class="token punctuation">;</span> <span class="token property">-webkit-animation</span> <span class="token punctuation">:</span> spin 2s linear infinite <span class="token punctuation">;</span> <span class="token comment">/* Safari */</span> <span class="token property">animation</span> <span class="token punctuation">:</span> spin 2s linear infinite <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/* Safari */</span> <span class="token atrule"><span class="token rule">@-webkit-keyframes</span> spin</span> <span class="token punctuation">{</span> <span class="token selector">0%</span> <span class="token punctuation">{</span> <span class="token property">-webkit-transform</span> <span class="token punctuation">:</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> 0deg <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">100%</span> <span class="token punctuation">{</span> <span class="token property">-webkit-transform</span> <span class="token punctuation">:</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> 360deg <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token atrule"><span class="token rule">@keyframes</span> spin</span> <span class="token punctuation">{</span> <span class="token selector">0%</span> <span class="token punctuation">{</span> <span class="token property">transform</span> <span class="token punctuation">:</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> 0deg <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">100%</span> <span class="token punctuation">{</span> <span class="token property">transform</span> <span class="token punctuation">:</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> 360deg <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> style</span> <span class="token punctuation">></span></span> |
We will hide this loader once the data has loaded.
1 2 3 4 5 | <span class="token keyword">function</span> <span class="token function">showDataTable</span> <span class="token punctuation">(</span> <span class="token parameter">dataTable</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">'#loading'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">hide</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token operator">...</span> <span class="token punctuation">}</span> |
Result
So we have obtained data from Google Sheets and created a table on the web app using the Data Table jQuery plug-in.
2. Search function
Data Tables The jQuery plug-in also has a search build-in function. However, to search, you need to fetch all the data like part 1 above. In many cases, we do not want to make all the data public, we just want the user to search for their correct information. Such as:
- Look up order status by waybill code.
- Look up invoices by invoice code.
- Look up transaction history by account number (or phone number).
- Look up personnel information by employee code.
We will rewrite the web and display information only according to the data the user searches for.
Search.html
This HTML file is similar to the above, just add <input>
tag for users to enter the content to look for.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token comment"><!-- File Search.html --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> body</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> heading <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> Search your invoice. <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token punctuation">></span></span> Input your phone number to search your invoice. Don't include country code, space and other special character. <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> search-box <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> input</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> searchText <span class="token punctuation">"</span></span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> searchBtn <span class="token punctuation">"</span></span> <span class="token attr-name">onclick</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> handleSearch() <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Search <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> response <span class="token punctuation">"</span></span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> status-box <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> table</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> result <span class="token punctuation">"</span></span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> display <span class="token punctuation">"</span></span> <span class="token attr-name">width</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> 75% <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> table</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> body</span> <span class="token punctuation">></span></span> |
JavaScript.html
When the user presses the Search button after inputting data, the client-side will use the google.script.run class to execute the searchByPhone(input)
function in the Apps Script code file. After returning, add the data to the Data Tables instance we created.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <span class="token operator"><</span> script <span class="token operator">></span> <span class="token keyword">function</span> <span class="token function">handleSearch</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// remove data in the previous search</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> $ <span class="token punctuation">.</span> fn <span class="token punctuation">.</span> DataTable <span class="token punctuation">.</span> <span class="token function">isDataTable</span> <span class="token punctuation">(</span> <span class="token string">'#result'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">'#result'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">DataTable</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">clear</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">draw</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">'#searchBtn'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">attr</span> <span class="token punctuation">(</span> <span class="token string">'disabled'</span> <span class="token punctuation">,</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// get value</span> <span class="token keyword">let</span> input <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> <span class="token string">'searchText'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> value <span class="token punctuation">;</span> <span class="token comment">// validation</span> <span class="token comment">// request server-side</span> google <span class="token punctuation">.</span> script <span class="token punctuation">.</span> run <span class="token punctuation">.</span> <span class="token function">withSuccessHandler</span> <span class="token punctuation">(</span> onSuccess <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">withFailureHandler</span> <span class="token punctuation">(</span> onFailure <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">searchByPhone</span> <span class="token punctuation">(</span> input <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// render response see function onSuccess()</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">onSuccess</span> <span class="token punctuation">(</span> <span class="token parameter">result</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> $ <span class="token punctuation">.</span> fn <span class="token punctuation">.</span> DataTable <span class="token punctuation">.</span> <span class="token function">isDataTable</span> <span class="token punctuation">(</span> <span class="token string">'#result'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">appendDataTable</span> <span class="token punctuation">(</span> <span class="token string">'#result'</span> <span class="token punctuation">,</span> result <span class="token punctuation">.</span> data <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">renderTable</span> <span class="token punctuation">(</span> <span class="token string">'#result'</span> <span class="token punctuation">,</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">$</span> <span class="token punctuation">(</span> <span class="token string">'#searchBtn'</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">removeAttr</span> <span class="token punctuation">(</span> <span class="token string">'disabled'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">appendDataTable</span> <span class="token punctuation">(</span> <span class="token parameter">elementSelector <span class="token punctuation">,</span> rowData</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">$</span> <span class="token punctuation">(</span> elementSelector <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">DataTable</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> rows <span class="token punctuation">.</span> <span class="token function">add</span> <span class="token punctuation">(</span> rowData <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">draw</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">renderTable</span> <span class="token punctuation">(</span> <span class="token parameter">elementSelector <span class="token punctuation">,</span> option</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> table <span class="token operator">=</span> <span class="token function">$</span> <span class="token punctuation">(</span> elementSelector <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> field <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> option <span class="token punctuation">.</span> header <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token parameter">name</span> <span class="token operator">=></span> <span class="token punctuation">{</span> field <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> title <span class="token operator">:</span> name <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> table <span class="token punctuation">.</span> <span class="token function">DataTable</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> data <span class="token operator">:</span> option <span class="token punctuation">.</span> data <span class="token punctuation">,</span> columns <span class="token operator">:</span> field <span class="token punctuation">,</span> paging <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> ordering <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> info <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> searching <span class="token operator">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">onFailure</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> window <span class="token punctuation">.</span> <span class="token function">alert</span> <span class="token punctuation">(</span> <span class="token string">'Đã xảy ra lỗi khi truy cập file.'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> |
Route
Our web app now has 2 pages so rewrite the function doGet(e)
to add the parameter p.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">function</span> <span class="token function">doGet</span> <span class="token punctuation">(</span> <span class="token parameter">e</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> page <span class="token operator">=</span> e <span class="token punctuation">.</span> parameter <span class="token punctuation">.</span> p <span class="token operator">||</span> <span class="token string">'Index'</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> HtmlService <span class="token punctuation">.</span> <span class="token function">createTemplateFromFile</span> <span class="token punctuation">(</span> page <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">evaluate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">searchByPhone</span> <span class="token punctuation">(</span> <span class="token parameter">input</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> range <span class="token operator">=</span> sheet <span class="token punctuation">.</span> <span class="token function">getDataRange</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> data <span class="token operator">=</span> range <span class="token punctuation">.</span> <span class="token function">getValues</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> header <span class="token operator">=</span> data <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> phoneCol <span class="token operator">=</span> header <span class="token punctuation">.</span> <span class="token function">indexOf</span> <span class="token punctuation">(</span> <span class="token string">'Phone'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> result <span class="token operator">=</span> data <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">row</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> row <span class="token punctuation">[</span> phoneCol <span class="token punctuation">]</span> <span class="token operator">===</span> input <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> header <span class="token operator">:</span> <span class="token function">getHeaderArr</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> data <span class="token operator">:</span> result <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Thus, we have built a basic search function to display data on the Apps Script web app from Google Sheets. To complete this search function, you can perform a validate search text and add a loader to signal the load data status to the user (like part 1), as well as handle errors in some situations such as not searching. See the data, the user modifies the parameter p so the file cannot be found.