# 📊 Google Apps Script 專案說明:中油油價通知推播系統 > 這份筆記幫助任何人——即使是不會寫程式的使用者,也能理解這份程式在做什麼、為什麼這樣寫。 --- ## 🚀 系統功能概覽 這個 GAS 專案的目的是: - 每週自動從中油網站抓取下週油價與新聞稿 - 組裝成漂亮的 LINE Flex Message 卡片 - 發送給事先定義的 LINE 使用者群組 - 並將整個過程紀錄到 Google 試算表中備查 --- ## 🔧 基本設定區 ```javascript const LOG_SHEET_ID = '...'; // Google Sheet 的 ID const LOG_SHEET_NAME = '每周油價log'; const LINE_CHANNEL_ACCESS_TOKEN = '...'; // LINE Bot 金鑰(請勿外洩) const RECIPIENTS = ['LINE使用者ID1', 'LINE使用者ID2']; ``` > 建議將這些參數移至 Google Apps Script 的專案屬性(PropertiesService)中集中管理。 --- ## 🧠 系統主程式 `main()` 解說 - **主要邏輯**: 1. 計算今天與明天日期 2. 自動嘗試抓取明日油價(最多重試三次) 3. 自動嘗試抓取今日新聞稿(最多重試三次) 4. 如果油價或新聞任一失敗則中止 5. 組裝成 Flex Message 並發送至 LINE 群組 6. 所有流程記錄寫入 Google 試算表 ```javascript function main() { try { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); ... } catch (error) { log('錯誤', '執行失敗', error.stack); } finally { flushLogs(); } } ``` --- ## 🔁 重試機制 `fetchWithRetries()` 這是一個萬用小幫手,任何你要去網路抓資料的地方都能用上它: ```javascript function fetchWithRetries(fetchFunction, resourceName, maxRetries, delay) ``` - `fetchFunction`:真正去抓資料的函式 - `resourceName`:這次要抓的資源名稱(油價/新聞) - `maxRetries`:最多可以失敗幾次 - `delay`:每次失敗後要等多久(單位是毫秒) --- ## ⛽ 油價資料取得 `fetchPrice(date)` 這支函式會從中油油價歷史頁面抓資料,並解析當週與上週價格做出差異比較。 --- ## 📰 新聞標題取得 `fetchNews(date)` 這支函式會從中油的開放資料 XML 抓取新聞稿清單,挑出與今日相符的標題。 --- ## 💌 推播訊息 `pushMulticastMessage()` 這支會用 LINE Bot 的 Multicast API 一次性發送 Flex Message 給所有使用者。 --- ## ✨ Flex 卡片設計 `buildFlexMessage(data)` 這支函式會根據油價與新聞組裝出一個漂亮的 Flex Message。 - 顯示各種油品價格 - 顯示漲跌符號與顏色 - 顯示新聞稿標題 --- ## 📝 日誌紀錄:`log()` 與 `flushLogs()` 透過 `log()` 記錄每一步的狀態,透過 `flushLogs()` 最後統一寫入 Google Sheet。 --- ## ⏰ 自動排程 `createTimeDrivenTriggers()` 建立一個定時觸發器,讓主程式自動在每週日 12:15 執行一次。 --- ## 🧪 測試用 `test()` 提供測試訊息與畫面用的測試函式(不含實際資料)。 --- ## 📆 民國轉西元 `twToAD()` 把中油的民國格式日期轉成 JavaScript 的 Date 物件。 --- > 📌 如果你是第一次使用這份腳本,請務必依序確認: > - LINE Bot 是否有對應權限 > - Google Sheet 權限與格式是否正確 > - 定時觸發器是否正確註冊 > - 所有參數是否已設定於專案屬性 --- 🧾 編寫日期:2025-06-15|最後更新:ChatGPT 自動產出 🧑💻 作者:你自己(或 ChatGPT)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.