🕸️ GAS 爬蟲實戰:定時抓取匯率與股市資料
很多人以為 Google Apps Script (GAS) 只能用來「操作」試算表裡面的格子。
但其實,GAS 內建了一個超級強大的武器:UrlFetchApp。
這代表你的 Google Sheet 可以「連上網路」,去抓取全世界的資料!再加上 GAS 免費的時間觸發器 (Time-driven Triggers),你就可以零成本打造一個「每天定時執行」的全自動爬蟲機器人。
本章我們將實戰寫一支爬蟲,每天早上 9 點準時去台灣銀行抓取最新的美金匯率,並寫入你的試算表。
1. 認識終極武器 UrlFetchApp
在一般的 JavaScript 裡,我們打 API 用的是 fetch() 或是 axios。
但是在 GAS 的環境裡,沒有 fetch 可以用,Google 為我們準備了專屬的 UrlFetchApp.fetch()。
基本語法:
// 抓取網頁的 HTML 原始碼 (爬蟲)
var response = UrlFetchApp.fetch("https://example.com");
var html = response.getContentText();
// 呼叫 API 取得 JSON
var apiResponse = UrlFetchApp.fetch("https://api.exchangerate-api.com/v4/latest/USD");
var data = JSON.parse(apiResponse.getContentText());
2. 實戰:抓取台灣銀行美金匯率 API
網路上有很多免費的匯率 API,這裡我們示範串接一個公開的匯率 API 來取得「1 塊美金等於多少台幣」。
步驟 1:建立試算表並開啟 GAS 編輯器
- 打開一個全新的 Google Sheet,命名為「我的財務大盤」。
- 在 A1 輸入「日期」,B1 輸入「美金匯率」。
- 點擊上方選單的 擴充功能 -> Apps Script。
步驟 2:撰寫爬蟲腳本
將以下程式碼貼到你的 Code.gs 中:
// 這是我們的主程式,負責抓資料並寫入表格
function fetchDailyExchangeRate() {
// 1. 指定要抓取的 API 網址 (這是一個免費公開的匯率 API)
var apiUrl = "https://api.exchangerate-api.com/v4/latest/USD";
try {
// 2. 發起請求抓取資料
var response = UrlFetchApp.fetch(apiUrl);
var jsonString = response.getContentText();
// 3. 將文字轉成 JavaScript 的物件
var data = JSON.parse(jsonString);
// 4. 從資料中抽取出「美金對台幣 (TWD)」的匯率
var usdToTwd = data.rates.TWD;
// 如果找不到資料,防呆報錯
if (!usdToTwd) {
Logger.log("找不到 TWD 匯率資料!");
return;
}
Logger.log("今日美金匯率:" + usdToTwd);
// 5. 準備要寫入表格的資料:[今天日期, 匯率]
var today = new Date();
// 格式化日期為 YYYY/MM/DD
var dateString = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy/MM/dd");
// 6. 把資料寫入試算表的最底層
appendToSheet(dateString, usdToTwd);
} catch (error) {
Logger.log("爬蟲發生錯誤:" + error.toString());
}
}
// 寫入試算表的輔助函數
function appendToSheet(date, rate) {
// 取得當前綁定的試算表與工作表 1
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
// 在表格最後一行新增資料 (傳入陣列 [A欄, B欄])
sheet.appendRow([date, rate]);
Logger.log("✅ 成功寫入資料表!");
}
步驟 3:手動測試
點擊上方的「執行」按鈕 (記得函數要選擇 fetchDailyExchangeRate)。
第一次執行時,Google 會跳出「需要授權」的警告視窗,這是因為你的腳本要求了「連上外部網路」的權限。
請點擊「審查權限 -> 選擇你的帳號 -> 進階 -> 前往 (不安全)」,允許授權。
授權完成後,切換回你的 Google Sheet,你會發現第二行神奇地出現了今天的日期與美金匯率!
3. 進階爬蟲技巧:加上 Headers 或偽裝 User-Agent
有時候你去抓某些財經網站,對方會阻擋機器人。這時候你必須偽裝成一般瀏覽器,或是加上特定的 API Key 才能抓到資料。
UrlFetchApp 的第二個參數可以讓你傳遞複雜的設定 (Options):
function fetchWithHeaders() {
var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=BTC";
var options = {
"method": "get",
// 如果對方只允許指定的瀏覽器,你可以加上 User-Agent
// 如果對方是付費 API,你可以加上 API Key
"headers": {
"X-CMC_PRO_API_KEY": "YOUR_API_KEY_HERE",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
},
// 防止抓錯時整個程式崩潰 (預設抓到 404/500 會直接 Throw Error)
"muteHttpExceptions": true
};
var response = UrlFetchApp.fetch(url, options);
Logger.log(response.getContentText());
}
💡 實戰地雷: 如果你抓的是台灣的網站(例如 PTT 或證交所),請記得把編碼轉回 UTF-8 或是 Big5,否則你抓回來的 HTML 會變成一堆亂碼!
4. 終極自動化:設定時間觸發器 (Time-driven Triggers)
程式碼寫好了,但總不能每天早上自己起床按「執行」吧? 我們要設定一個鬧鐘,叫 Google 的伺服器每天早上準時幫我們跑這段程式碼。
- 在 GAS 編輯器的左側選單,點擊那顆像「鬧鐘」的圖示 (觸發器 Triggers)。
- 點擊右下角的藍色按鈕 新增觸發器 (Add Trigger)。
- 設定如下:
- 選擇要執行的功能:
fetchDailyExchangeRate - 選擇執行部署作業:
Head - 選取事件來源:
時間驅動 (Time-driven) - 選取時間型觸發程序類型:
日計時器 (Day timer) - 選取時間:
上午 9 點到 10 點
- 選擇要執行的功能:
- 點擊儲存。
大功告成!🎉
從現在開始,每天早上 9 點多,Google 的超級電腦就會在背後默默地啟動你的爬蟲程式,去 API 抓取最新的美金匯率,然後整整齊齊地填入你的試算表裡!
這就是自動化工程師的浪漫,只要寫一次程式碼,機器就會為你工作一輩子。 在下一章,我們將結合這個爬蟲,讓它在抓到資料後,主動發送 LINE 訊息到你的手機上!