說明三方分工
能指出 Sheet、GAS Web App 與前端各自負責哪一段。
CHAPTER 21 · 180 MINUTES
試算表像倉庫,GAS doGet 是出餐口;標準練習用 mock 保持可驗證,只有教師 live URL 才代表外部服務。
LEARNING GOALS
能指出 Sheet、GAS Web App 與前端各自負責哪一段。
把空值與原始 rows 正規化成 id、name、price。
分清 MOCK、LIVE 與 LIVE-FALLBACK,不以卡片出現冒充連線成功。
PROBLEM & ANALOGY
第 20 章會接資料;本章把 Sheet 當備料表、doGet 當出餐流程、ContentService 當 JSON 外帶盒、部署後的 /exec URL 當對外窗口。
本章要解決:外部授權或網路失敗時,課堂仍要有 mock 可練;但畫面必須說清楚資料究竟從哪裡來。
合回共同作品:正規化後的產品資料會交給第 22 章列表與分頁。
SCOPE
辨識 doGet、ContentService、部署 URL、row、normalize 與 fallback。
執行身分、存取權限與部署版本會影響誰能呼叫。
OAuth token、正式會員權限、複雜 Sheet 查詢與公開敏感資料。
CORE IDEAS
/exec 是部署後入口;編輯內容更新不代表部署版本已更新。DEBUGGING
課堂刻意錯誤:貼錯部署 URL,或讓 GAS 回傳 {data:[...]}、前端卻直接期待陣列。
/exec,確認不是 /dev,而且回應是 JSON。先查:直接開服務 URL,確認部署、權限與回應格式。
先查:檢查 rows 是否為陣列,再比對 normalize 前後欄位。
先查:確認 fallback 分支更新模式標籤,不能冒充 live。
PRACTICE CONTRACT
檔案:script.js
位置:requestRows()
結果:頁面能取得固定欄位的回應
檔案:script.js
位置:normalizeRows()、createRowCard()、renderRows()
結果:空值與 Live 文字都以安全文字節點顯示
檔案:script.js
位置:loadRows()
結果:畫面區分 mock、空資料、合法 GAS /exec 與其他 JSON,live 失敗時可改用備援
EVIDENCE
目前是 ______ 模式;資料從 ______ 經過 ______ 後顯示;失敗時畫面寫 ______。
MOCK 成功不等於 GAS 成功;live 證據必須包含實際 URL、回應與前端模式。
截圖需同時包含資料筆數與 MOCK/LIVE/FALLBACK 標籤;若宣稱 live,另附瀏覽器直接開 /exec 的 JSON 與 Network 證據。
下一章:把同一批產品依頁碼切成每頁三筆。