Apps Script用Sheet生成動態網頁(2): 動態生成網頁連結列表

在第一篇中我們完成了只要改sheet的內容就會動態改變網頁的內容。但是首頁的內容卻是寫死的。所以這篇就在依照上一篇的程式碼做修改,讓首頁的列表自動變更。

原本首頁我們寫在doGet函數中,現在我們改成直接從sheet內讀取資料來列表

首頁的內容變成

output = HtmlService.createTemplate(`<!DOCTYPE html>
<html>
<head><base target="_top"></head>
<body>
<h1>用Sheet內容生成網頁</h1>
<? let BASE_URL = getServerUrl(); ?>
<? let name_list = getNameListFromSheet(); ?>
<ul>
<?
for (let i = 0 ; i < name_list.length ; ++i ) {
if (null != name_list[i][0]) {
let name = name_list[i][0];
let url = BASE_URL + '?getHtml=' + name;
?>
<li><a href="<?= url ?>">前往<?= name ?></a></li>
<?
}
}
?>
</ul>
</body>
</html>`).evaluate();

本次的重點就是我們使用getNameListFromSheet()函數,從sheet內讀取已有的網頁名稱

function getNameListFromSheet() {
const validator = row => row && row[0] != null && row[0].length > 0;
try {
let sheet = SpreadsheetApp.openByUrl(SHEET_URL).getSheets()[0];
return sheet.getRange(1, 1 + COLUMN_IDX_OF_NAME, 1 + sheet.getLastRow(), 1).getValues()
.filter(validator);
} catch (error) {
Logger.log('getNameListFromSheet error:' + error.stack || error);
}
return [[]];
}

這個函數使用filter函數,藉由validator函數來過濾不是null或沒有命名的網頁,然後再首頁中透過AppsScript提供的<? ?>前處理將過濾的資料設定成列表項目,並生成對應的網頁連結。

留言

棕熊の窩寫道…
不好意思,我跟著您所列的步驟進行操作,在測試部署作業時卻得到「指令碼已完成,但未傳回任何值。」請問是哪裡操作錯誤呢?謝謝。
Mirochiu寫道…
沒有傳回任何值的意思就是doGet函數沒有運作, 不知道您是否有貼上上一篇的程式碼? 這兩篇是要搭配的才能正常運作喔!