星期六, 4月 12, 2025

用 Google Sheets 自動追蹤你想看的新聞:以台積電為例,修改 Apps Script 實戰教學

用 Google Sheets 自動追蹤你想看的新聞:以台積電為例,修改 Apps Script 實戰教學 發布時間: 2025年 4月 12日 地點: 台灣新北市 你是不是常常需要關注特定公司、主題或人物的最新新聞?每天手動搜尋是不是覺得有點煩人?其實,你可以利用 Google Sheets 和一點點程式魔法,讓試算表自動幫你收集整理相關新聞! 先前我們可能已經建立了一個 Google Apps Script,用來追蹤像是「川普 關稅」這樣的主題。但如果你想追蹤的目標改變了呢?例如,你現在更關心的是台灣的護國神山——「台積電」(TSMC)的動態。 別擔心!修改現有的 Apps Script 並不難。這篇文章將一步步帶你把原本的腳本修改成專門追蹤「台積電」新聞的利器。 
我們需要什麼工具? * Google Sheets: 我們的老朋友,資料的家。 * Google Apps Script (GAS): Google 提供的免費雲端腳本平台,可以用 JavaScript 語法操作 Google Workspace 的各種服務(包括 Sheets)。 * Google News RSS Feed: 我們將透過構造一個 Google News 的 RSS Feed 網址來獲取結構化的新聞資料,這比直接爬取網頁更穩定。 
修改腳本:讓它聚焦台積電 假設你已經有了一個先前用來追蹤其他主題的 Apps Script 程式碼。現在,我們要動手修改它,讓它開始為我們關注「台積電」。 
主要修改點: * 修改搜尋關鍵字 (SEARCH_TERMS): 這是最核心的改動。找到定義搜尋關鍵字的變數,把它改成 "台積電"。 // 原本可能是: // var SEARCH_TERMS = "Trump tariffs"; // 修改為: var SEARCH_TERMS = "台積電"; * 更新 RSS Feed 網址 (RSS_URL): 光改關鍵字還不夠,為了獲得最相關的中文新聞,我們需要調整 RSS 網址中的語言 (hl) 和地區 (gl) 參數。 // 原本可能是美國英文新聞的網址: // var RSS_URL = "https://news.google.com/rss/search?q=" + encodeURIComponent(SEARCH_TERMS) + "&hl=en-US&gl=US&ceid=US:en"; // 修改為台灣繁體中文新聞的網址: var RSS_URL = "https://news.google.com/rss/search?q=" + encodeURIComponent(SEARCH_TERMS) + "&hl=zh-TW&gl=TW&ceid=TW:zh-Hant"; * hl=zh-TW:指定語言為繁體中文。 * gl=TW:指定地區為台灣。 * ceid=TW:zh-Hant:對應的識別碼。 * (建議) 更改工作表名稱 (SHEET_NAME): 為了讓你的 Google Sheet 保持整潔,建議幫存放台積電新聞的工作表取個新名字。 // 原本可能是: // var SHEET_NAME = "新聞"; // 修改為: var SHEET_NAME = "台積電新聞"; * (建議) 更改函數名稱: 原本的函數名稱可能反映的是舊主題(例如 findTrumpTariffNews)。為了可讀性,最好改成與新主題相關的名稱。注意:改了函數名,後面的觸發條件也要跟著改! // 原本可能是: // function findTrumpTariffNews() { ... } // 修改為: function findTsmcNews() { ... } 別忘了,函數內部的錯誤記錄 Logger.log 或郵件通知訊息也可以順便更新一下,讓它們更符合現在的功能。 

____________________
更新後的完整程式碼範例, 這裡提供整合上述修改的完整 Apps Script 程式碼,你可以直接複製使用: 
// --- 設定 --- var SEARCH_TERMS = "台積電"; // *** 修改:設定新的搜尋關鍵字 *** var SHEET_NAME = "台積電新聞"; // *** 建議修改:設定新的工作表名稱 *** var MAX_RESULTS_TO_CHECK = 50; // 每次檢查 RSS Feed 中的前 N 筆資料 var LINK_COLUMN_INDEX = 3; // 連結在哪一欄 (A=1, B=2, C=3...),用來檢查重複 // *** 修改:更新 RSS Feed URL,使用新的搜尋關鍵字,並設定為台灣繁體中文新聞 *** var RSS_URL = "https://news.google.com/rss/search?q=" + encodeURIComponent(SEARCH_TERMS) + "&hl=zh-TW&gl=TW&ceid=TW:zh-Hant"; /** * *** 建議修改:主要函數名稱 *** * 主要函數:擷取、解析並將台積電新聞寫入試算表 */ function findTsmcNews() { // *** 修改:函數名稱 *** try { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(SHEET_NAME); // 使用更新後的工作表名稱 // 如果工作表不存在,則建立它並加入標頭 if (!sheet) { sheet = ss.insertSheet(SHEET_NAME); sheet.appendRow(["擷取時間", "標題", "連結", "發布日期"]); SpreadsheetApp.flush(); Logger.log("已建立工作表 '%s' 並加入標頭。", SHEET_NAME); } var existingLinks = getExistingLinks(sheet); Logger.log("目前工作表 '%s' 中有 %s 個連結可供比對。", SHEET_NAME, existingLinks.size); Logger.log("正在從 RSS Feed 擷取關於 '%s' 的新聞: %s", SEARCH_TERMS, RSS_URL); var response = UrlFetchApp.fetch(RSS_URL, { muteHttpExceptions: true }); var responseCode = response.getResponseCode(); var xmlContent = response.getContentText(); if (responseCode !== 200) { Logger.log("錯誤:無法擷取 RSS Feed。狀態碼: %s, 回應: %s", responseCode, xmlContent); return; } var document = XmlService.parse(xmlContent); var root = document.getRootElement(); var channel = root.getChild('channel'); var items = channel.getChildren('item'); Logger.log("在 RSS Feed 中找到 %s 個項目。", items.length); var newItemsAdded = 0; var itemsToCheck = Math.min(items.length, MAX_RESULTS_TO_CHECK); for (var i = 0; i < itemsToCheck; i++) { var item = items[i]; var title = item.getChild('title').getText(); var link = item.getChild('link').getText(); var pubDateText = item.getChild('pubDate') ? item.getChild('pubDate').getText() : "N/A"; var fetchTimestamp = new Date(); if (!existingLinks.has(link)) { sheet.appendRow([ Utilities.formatDate(fetchTimestamp, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss"), title, link, pubDateText ]); Logger.log("新增新聞: %s", title); newItemsAdded++; existingLinks.add(link); } } if (newItemsAdded > 0) { Logger.log("已新增 %s 則關於 '%s' 的新聞到 '%s' 工作表。", newItemsAdded, SEARCH_TERMS, SHEET_NAME); } else { Logger.log("沒有找到關於 '%s' 的新新聞項目。", SEARCH_TERMS); } } catch (error) { Logger.log("執行 findTsmcNews 時發生錯誤: %s", error); Logger.log("錯誤堆疊: %s", error.stack); } } /** * 輔助函數:從工作表中讀取現有連結,用於去重 */ function getExistingLinks(sheet) { var linkSet = new Set(); var lastRow = sheet.getLastRow(); if (lastRow > 1) { var range = sheet.getRange(2, LINK_COLUMN_INDEX, lastRow - 1, 1); var values = range.getValues(); for (var i = 0; i < values.length; i++) { if (values[i][0]) { linkSet.add(values[i][0].toString().trim()); } } } return linkSet; } /** * (可選) 函數:如果需要,可以用來手動設定標頭 */ function setupSheet() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName(SHEET_NAME); // 使用更新後的工作表名稱 if (!sheet) { sheet = ss.insertSheet(SHEET_NAME); } sheet.clearContents(); sheet.appendRow(["擷取時間", "標題", "連結", "發布日期"]); sheet.getRange("A1:D1").setFontWeight("bold"); SpreadsheetApp.flush(); Logger.log("工作表 '%s' 已設定標頭。", SHEET_NAME); } 
________________________
如何實施? 
* 打開編輯器: 前往你的 Google Sheet,點擊「擴充功能」->「Apps Script」。 * 取代程式碼: 將編輯器裡舊的程式碼全部刪除,貼上上面提供的新程式碼。 * 儲存: 點擊儲存圖示。 * 測試運行: 在編輯器頂部的函數下拉選單中,選擇你剛剛修改的函數名稱(例如 findTsmcNews),然後點擊旁邊的「▶ 執行」按鈕。檢查你的 Google Sheet 是否出現了新的工作表(如果設定了新名稱)和相關的台積電新聞。 * 更新觸發條件(關鍵步驟!): * 點擊左側選單的「觸發條件」(時鐘圖案)。 * 找到你之前設定的時間驅動觸發條件(例如每小時執行一次)。 * 點擊編輯(鉛筆圖示)。 * 務必確認「選擇要執行的功能」已經指向你修改後的 新函數名稱(例如 findTsmcNews)。 如果這裡還是舊的函數名稱,自動化就會失效或繼續跑舊主題! * 儲存觸發條件的變更。 大功告成!
 完成這些步驟後,你的 Google Sheet 就會開始自動為你收集最新的台積電新聞了!你可以隨時打開試算表查看,甚至在手機上也能輕鬆閱讀。 這個方法當然也可以應用於追蹤任何你感興趣的公開新聞主題。只要修改 SEARCH_TERMS 和可能的 RSS_URL 地區語言設定,你就能打造自己專屬的自動化新聞監控站! #TSMC @台積電