经过前面两天稍微了解了 HTML Service 後,今天我们要来开始实作我们的 To Do List 了!
今天我们分成三个部分进行:
建立假资料。
完成 GAS 程序设定。
完成 HTML。
就让我们开始吧!
首先我们开启我们尘封已久的 To Do List DB 试算表。
真的是许久不见了,空白了那麽久就让我们来宠信你吧(金变态)。
开玩笑的!
我们首先先定义一下我们的资料栏位,我分为几个部分 - 登录时间、Key、事件 event、是否已经完成 isDone:
接下来我们来新增一些假资料:
一样,金变态。
这样就好了,没错,就是这麽简单!
欧对了,你会发现 isDone 栏位我是使用 Check Box ,因为这样在 Google Apps Script 中比较好处理。
接下来来到第二部分:完成 GAS 程序。
今天的部分因为我只是想要呈现资料,因此我就写了两个函式来处理:
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
function showToDoListData() {
const datas = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getDataRange().getValues();
return datas.slice(1);
}
跟 Day 16 一样,第一个 doGet 负责处理 HTTP 的 GET 请求。
而第二个 showToDoListData 则是把资料吐给前端。
这样就完成第二部分啦!
接下来是第三部分,其实才是最麻烦的地方…
因为画面要呈现,所以势必要看看如何呈现。
但是因为这系列文章的重点不是在前端网页,所以我决定用最丑的方式书写就好…
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function showData(datas) {
const tbody = document.querySelector('#items');
datasFormat = []
datas.forEach(data => {
datasFormat.push([data[2], data[3]])
});
datasFormat.forEach((data, index) => {
const tr = document.createElement('tr');
const count = document.createElement('td');
count.innerText = index;
tr.appendChild(count)
data.forEach(item => {
const td = document.createElement('td');
td.innerText = item;
tr.appendChild(td)
});
tbody.appendChild(tr);
});
}
google.script.run.withSuccessHandler(showData)
.showToDoListData();
</script>
</head>
<body>
<div id="app">
<table>
<thead>
<tr>
<th>编号</th>
<th>事情</th>
<th>是否完成</th>
</tr>
</thead>
<tbody id="items"></tbody>
</table>
</div>
</body>
</html>
完成了三步骤,我们来重新部署一下。
部署过程中一样会要权限允许,就稍微按一下吧!
过程我就不 PO 了!
然後我们来看一下结果:
耶?东西怎麽都没有跑出来?
看一下 console :
哇哩咧!?怎麽会是传 null ?
这边我修修改改修修改改,差点是以为我早上起床姿势不对(?)才导致的 Bug 时,我又瞥到了可爱的 Docs :
简单来说,不能直接传 Array 啦!我们只能传 Number , Boolean , String 或是 null 。
所以在 .gs 的部分必须要来处理一下:
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
function showToDoListData() {
const datas = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getDataRange().getValues();
return JSON.stringify(datas.slice(1));
}
这边我把它利用 JSON.stringify 转为字串传出。
而 .html 的部分则是另外把他转回 Array 型态:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
function showData(datas) {
const tbody = document.querySelector('#items');
datasFormat = []
JSON.parse(datas).forEach(data => {
datasFormat.push([data[2], data[3]])
});
datasFormat.forEach((data, index) => {
const tr = document.createElement('tr');
const count = document.createElement('td');
count.innerText = index;
tr.appendChild(count)
data.forEach(item => {
const td = document.createElement('td');
td.innerText = item;
tr.appendChild(td)
});
tbody.appendChild(tr);
});
}
google.script.run.withSuccessHandler(showData)
.showToDoListData();
</script>
</head>
<body>
<div id="app">
<table>
<thead>
<tr>
<th>编号</th>
<th>事情</th>
<th>是否完成</th>
</tr>
</thead>
<tbody id="items"></tbody>
</table>
</div>
</body>
</html>
然後我们重新部署後来看一下结果吧!
OK~版型虽然难看,但是完成了!!
今天就到这里罗!
也是平安的结束了一天呢!
就到这里罗!
明天见!
Tailwind CSS 台湾 (脸书粉丝专页)
兔兔教 × Tailwind CSS Taiwan (脸书社群)
我:今天周六,但是也莫名其妙的忙到了现在…到底我在忙什麽啊…?
>>: [Day17] 团队管理:Check-in & Check-out
昨天我们提到 AWS CloudWatch Alarms,今天我们就来介绍 AWS QuickSig...
大家好,在开始之前先祝大家中秋节快乐~~ 监控 (Monitor) 最常见的监控方法为仪表板 (Da...
就以基本面来说,类别跟结构都会有一些共同的东西: 属性(property):用於储存值 方法(met...
企业的单一充分且必要条件是什麽? 是资金、投资人吗?是技术、专利吗? 还是团队、热情、理念、梦想呢...
前两天都是展现Data而已,今天来试做看看互动&换资料的动态! 折线图也是满常见的样式, 这次以非洲...