讓新聞每天自己寄到你的信箱|一年沒動的小工具,這次讓 AI 自己去修
去年五月我做了一個每日新聞小助手,一年沒動過。這次直播讓現在的 AI 去看它能不能優化,沒想到它自己開了瀏覽器、讀我舊的程式、抓出我漏看一整年的 bug、重做了一個乾淨的 V2。這集講整套怎麼想、怎麼拆,以及一年前跟一年後的 AI 差在哪。
這集的兩篇文字整理
直播裡示範的細節,拆成兩篇文章,這頁完整整理版直接收錄全文:一篇講怎麼做,照著操作就能做出來;一篇講怎麼想,把整段發想與取捨講清楚。最後再附一份可以直接複製拿去用的完整程式碼。往下讀就好。
不用寫程式:做一個每天自動把新聞寄到你信箱的小助手
你每天要看好幾個網站追產業消息嗎?我把這件事變成一封信:每天早上八點,它自己去我常看的那些來源繞一圈,整理成一份清單,寄到我信箱。
我不用再一個一個網站點過去。
這個小工具我去年五月做的,一年沒動過,天天準時寄。
上禮拜四直播把它拿出來,還讓現在的 AI 幫我升級了一版。今天把「怎麼做」整個拆給你。
先講清楚:你不是要學寫程式。你的角色是「把要什麼講清楚」,程式碼交給 AI。
這也是我做超過 30 個作品的方式:0 工程背景,但知道怎麼把話講到 AI 聽得懂。
你要準備三樣:一個 Google 帳號、一個會寫程式的 AI(Claude、ChatGPT 都行,我用 Claude),還有幾個「機器讀得到」的新聞來源。第三樣最容易被跳過,但它決定這件事能不能成。
第一步:先確認你的來源「機器讀不讀得到」(這步最重要,很多人跳過)
先別急著寫程式。先想:你固定會看哪幾個來源?食品、餐飲、行銷,某個人的專欄,把它們列出來。
然後檢查一件事:這些來源能不能被程式自動抓?不是每個網站都可以。判斷方法:看它有沒有 RSS。
RSS 就是網站主動說「歡迎你來訂閱、來抓」。很多新聞頁面下面會有一個藍色或黑色小框寫著 RSS,有它就代表可以。
不確定的話,開一個叫 rss.app 的網站,把來源網址貼進去按產生。跳得出東西,就代表這個來源抓得到;跳不出來,就抓不到。
抓不到的常見狀況:需要登入帳密才能看的付費商刊、IG 和 FB 那種、還有明白寫「禁止機器人讀取」的網站。這些就乖乖人工看,不要硬塞。
另外一種可以收的是電子報:你訂閱了會固定收到信的那種,一樣能埋進程式讓它幫你統整,你就不用一封一封看。

先把來源篩過一輪,能自動抓的留下、不能的畫掉。來源對了,後面才順。
第二步:跟 AI 講清楚,讓它把程式寫給你
打開一個新的 Claude 或 ChatGPT 對話,把你要什麼整段講清楚。你可以照這個講(把來源和格式換成你自己的):
我要在 Google Apps Script 裡寫一個腳本。我有幾個有 RSS 的新聞來源(貼上你的來源網址)。我要它每天早上八點固定跑一次,去這些來源抓最新的文章,整理成一份清單,每筆包含:日期、來源、標題、一段摘要、原文連結。整理好之後,透過 Gmail 把這份清單寄到我的信箱。資料先寫進一張 Google Sheet 留底,再寄出。請把完整程式碼寫出來,要我自己填的地方(Sheet ID、收件信箱)用註解標出來。
它會生出一份完整的程式碼。你不用懂每一行,看不懂就問它「這行在做什麼」,它會回答。

第三步:把程式埋進 Google Sheet 裡
開一張新的 Google Sheet,上面選單「擴充功能 → Apps Script」,把 AI 給你的程式碼整段貼進去。
我為什麼用 GAS?因為它就住在 Google Sheet 裡,還能直接接 Gmail 幫你寄信,而且免費、又穩。
我這支一年沒維護、天天照跑,從沒壞過。相比之下,有些人用花俏的 AI Agent 或 n8n,節點一多、哪個環節壞了就得回去修。要每天穩穩跑的事,我選最不會壞的地基。
第一次執行會跳「這個應用程式未經驗證」。別怕,這不是詐騙警告,是 Google 告訴你「這支是你自己寫的、沒送審」。點「進階 → 前往(不安全)→ 允許」。自己寫給自己用,這步沒風險。

第四步:設定時間,讓它自己跑
回到 Apps Script 編輯器,左側時鐘圖案「觸發條件 → 新增 → 選你的函式 → 時間驅動 → 天數計時器 → 選早上 8 到 9 點 → 儲存」。
存好,你就什麼都不用做了。明天早上那個時間,它會自己去抓、自己整理、自己寄信給你。

第五步(進階):加一條「AI 的線」,讓它幫你判讀
到這裡,你已經有一個會自動抓、自動寄的清單了。想再進一步,就加一條 AI 的線,也就是 OpenAI 的 API 金鑰。
把它想像成一條線的概念:你的小助手接上這條線,就能把 AI 牽進來一起工作。原本它只是把文章抓回來,加了這條線之後,AI 會幫你做內容篩選、寫摘要、判斷分類,甚至給你一段「今日可發文的觀察」。
去 OpenAI 後台申請一組 API 金鑰(那是網頁版之外、另外計費的額度),把金鑰埋進程式裡 AI 幫你標好的位置。之後抓回來的資料,會先經過 AI 判讀,再給你最後結果。
我升級後實測:同一天、一模一樣的來源,舊版只抓到 7 篇,加了 AI 判讀的新版抓到 11 篇,還自動幫我分好「AI 通用/食品新品/政策法規」這些類別。我以前默默漏看了不少。

一個小配方:一定要它附上資料來源
我做這種事有個固定配方:一定要 AI 附上資料來源。因為 AI 會有幻覺,附上原文連結,我點進去就能自己核對,它就不能唬我。
同一個配方也用在別的地方:請 AI 幫你在 Excel 算東西,我會要它「把可以計算的公式放上去」,而不是只給一個算好的數字。有公式,我人工就能驗。凡是 AI 幫你產出結論,都留一條「你能自己查證」的路。
2026 年的驚喜:AI 可以自己動手做
這次直播我做了一件事:把去年寫的舊程式,丟給現在的 Claude(桌機版、開了瀏覽器小工具),只跟它說「這是我一年前做的每日新聞小助手,你去看我的瀏覽器,看有沒有優化空間」。
結果它自己開了瀏覽器、讀我舊的程式碼、挑出問題,然後自己開了一張新的 Google Sheet、自己把程式寫進去、自己接上 AI 的 API,做出一個乾淨的 V2。我從頭到尾只跟它對話一兩句。
我要做的只有兩件:按「執行」讓它跑、還有在它需要授權部署的時候,親自去按。這帶到最後一件事。
唯一的紅線:帳密和授權,一定自己來
我設了一個機制:AI 可以幫我操作瀏覽器,但不能自己輸入帳號密碼、不能自己部署授權。需要輸入帳密的那一步,一律由我本人親自做。
讓 AI 長出手腳很好用,但正因為它會為了達成目標想盡辦法,你更要留一道自己守的門。能自由地用 AI,前提是你知道哪裡不能放手。
這支工具的骨架,換個題目一樣能用:店長每週對帳、合約到期提醒、庫存快見底補貨,本質都是「有一件事要人記得去看,不如讓它自己送到你面前」。想清楚你的來源、講清楚你要什麼,剩下的交給 AI。
有卡關的地方,留言或私訊我的 Threads(@mkt_girleat),我幫你看。
我一年沒動的小工具,這次讓 AI 自己去修,它抓出我漏看了一整年的新聞
去年五月,我做了一個每日新聞小助手。每天早上八點,它會自己去我常看的幾個網站繞一圈,把最新的文章整理成一封信寄給我。
做完之後,我一年沒動過它。
不是懶。是它夠用,我對它非常滿足。
它埋在 Google Sheet 裡、免費、又穩,從寫完就順順地一直跑,我從來沒維護過。這禮拜之前,我甚至沒想過要去碰它。
為了直播,我讓 AI 去看它
這次要直播,我就想:好,我們來看看現在的 AI 到底可以多厲害。
我把一年前寫的舊程式丟給 Claude,只講一句:「這是我一年多前做的每日新聞小助手,你去看有沒有優化的空間。」很直白,沒有別的。
沒想到它做的第一件事,是自己開了瀏覽器(我沒有貼任何東西給它),然後自己去讀我那時候寫的程式碼。讀完,它挑出了兩個問題。
第一個:我的關鍵字,從頭到尾沒有對到過。
我一年來所有的文章,其實都被丟進「非關鍵字」那一欄。我早就知道,只是覺得反正都看得到、沒差。它幫我把這件事挑出來、順手修好了。而我從沒跟它提過這個毛病,是它自己抓出來的。
第二個更嚴重:我以為它從那十個來源抓,其實它只抓到一部分。
也就是說,我一開始要它達成的目的,一年來只做到一半。而我從來沒發現:因為我再也不去那些網站了,只有它抓回來、我想看的時候才看,我根本不知道它漏了什麼。
同一天、同樣的來源,舊版只抓到 7 篇,修好後的新版抓到 11 篇。我默默漏看了一整年。
這件事我覺得很值得講:不是 AI 有多神,而是它幫我看見了我自己看不見的盲點。
一年前的 AI,和一年後的 AI
我用的還是 AI,用的還是 GAS,來源一個都沒變。變的是 AI 跟我之間的分工。
一年前:我用一問一答,慢慢跟它摸索,告訴它我要什麼、表格要長怎樣。它照我說的把程式寫出來,然後我自己手動把程式碼貼上去、自己執行。
它能幫我寫,但我還是得來回溝通,一次一次打磨到我要的版本,花了不少時間。
一年後:我只跟它說「幫我升級」。
它自己讀我舊的程式、自己找出 bug、自己開一張新的 Google Sheet、自己把程式寫進去、自己接上 AI 判讀,做出一個乾淨的新版本。我做的只剩兩件事:按執行、還有做我不放手的那道授權。
這就是所謂的「AI 長出了手腳」。一年前它做不到操作你的瀏覽器,現在它可以。以前是「我說、它寫、我貼」,現在是「它讀、它改、它動手」。

拆開來看,其實只有四個角色
如果你手上沒有「追新聞」這件事,這篇對你有沒有用?有。因為這套邏輯拆開,只有四個角色,換到任何行業都成立。
帳本:一個放資料的固定地方。我用 Google Sheet,抓回來的東西先寫進去留底,再寄出。資料有個唯一的家,不會散掉。
採集工:每天去各個來源繞一圈,把最新的東西搬回帳本。前提是那個來源「機器讀得到」:這就是為什麼第一步要先確認 RSS,讀不到的來源,採集工也搬不動。
判官:這是升級後多的角色。抓回來的東西先經過 AI 判讀,幫你篩選、摘要、分類,甚至給一段「今天值得發文的觀察」。它把「一堆原料」變成「你看得下去的結論」。
鬧鐘:時間到了,它自己把整理好的一封信送到你面前。你不用記得去翻帳本,它會自己出聲。
追新聞只是我拿到的題目。同一套骨架換個題目一樣能用:店長每週對帳、合約或會員到期提醒、庫存快見底補貨、診所回診通知,本質上都是「有一件事要人記得去核對,不如讓它自己整理好送過來」。
換題目前,我會先問自己三個問題
這些來源,機器讀得到嗎?有 RSS、有電子報的可以;要登入帳密的付費內容、IG/FB、禁止機器人的網站不行。讀不到的來源,這套方法幫不了你,那部分就乖乖人工看。
值不值得每天自動送到我面前?需要「有人記得去看」的事,才值得做成會自己出聲的系統。看一次就結束的事,不用大費周章。
我要不要把最新的 AI 全用上?我的答案常常是:不用。我這支一年沒維護還天天跑,靠的是選了最穩的地基(免費、穩定的 GAS),而不是最炫的 Agent 或 n8n。工具要遷就「能穩穩跑」,不是遷就「最新」。
最後,一道我不放手的門
我讓 AI 長出手腳,但設了一條紅線:它可以操作瀏覽器,但不能自己輸入帳號密碼、不能自己部署授權。這些一律我本人親自做。
這跟這集開頭聊的 AI 大事是同一件事:AI 會為了達成目標想盡各種辦法,這不是壞,是它很努力。正因為這樣,你更要知道怎麼管理它、哪裡要留一道自己守的門。
就像開車可能會出車禍,但你不會因此再也不開車,你會學會怎麼開得安全。
能放心地讓 AI 幫你做事的前提,是你清楚哪裡可以放手、哪裡不行。
每日新聞小助手:完整程式碼(複製就能用)
下面是升級版的完整程式碼。你只要改最上面 CONFIG 三個地方(你的信箱、你的 RSS 來源、OpenAI 金鑰),貼進 Google Sheet 的「擴充功能 → Apps Script」,先跑一次 setup()(會跳授權,照著允許),它就會每天早上八點自己抓、判讀、寄信給你。沒有 OpenAI 金鑰也能跑,只是少了 AI 判讀那段。
/**
* 每日新聞小助手(升級版)|Mii Lab EP.02
* 每天早上自動:抓你設定的 RSS 來源最新文章 → 寫進 Google Sheet 留底
* → 交給 AI 判讀(每則重點、分類、今日可發文觀察)→ 寄一封整理好的信到你信箱。
* 不用會寫程式:只改最上面 CONFIG 三個地方,貼進 Google Sheet 的
* 「擴充功能 → Apps Script」,先跑一次 setup()(會跳授權,照著允許)。
*/
const CONFIG = {
收件人: '你的信箱@gmail.com', // ← 改成你的 email
來源: [ // ← 換成你的 RSS 網址(用 rss.app 產生的就是這種)
'https://www.foodnext.net/rss/index',
'https://technews.tw/feed/'
],
OPENAI_API_KEY: '', // ← 貼上 OpenAI 金鑰 sk-...;留空就跳過 AI 判讀
我關心的主題: '餐飲、食品趨勢、行銷、AI 應用', // ← AI 判讀時站在這個角度幫你篩
每來源抓幾則: 5
};
const 分頁名 = '每日新聞';
/** 跑一次:建分頁 + 掛「每天早上 8 點」觸發器 */
function setup() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
if (!ss.getSheetByName(分頁名)) {
const sh = ss.insertSheet(分頁名);
sh.appendRow(['抓取時間', '來源', '標題', '摘要', '連結']);
sh.setFrozenRows(1);
}
ScriptApp.getProjectTriggers().forEach(function (t) {
if (t.getHandlerFunction() === '每日跑') ScriptApp.deleteTrigger(t);
});
ScriptApp.newTrigger('每日跑').timeBased().everyDays(1).atHour(8).create();
每日跑(); // 順便馬上跑一次給你看結果
}
/** 每天自動執行的主流程 */
function 每日跑() {
const items = 抓所有來源();
if (!items.length) { Logger.log('這次沒抓到東西,檢查來源網址是否有 RSS'); return; }
寫進表(items);
const 觀察 = CONFIG.OPENAI_API_KEY ? 用AI判讀(items) : '';
寄信(items, 觀察);
}
/** 逐個來源抓最新文章(支援 RSS 2.0 與 Atom) */
function 抓所有來源() {
const out = [];
CONFIG.來源.forEach(function (url) {
try {
const xml = UrlFetchApp.fetch(url, { muteHttpExceptions: true, followRedirects: true }).getContentText();
const root = XmlService.parse(xml).getRootElement();
const channel = root.getChild('channel');
let nodes, 站名;
if (channel) { // RSS 2.0
nodes = channel.getChildren('item');
站名 = channel.getChild('title') ? channel.getChild('title').getText() : url;
} else { // Atom
const ns = root.getNamespace();
nodes = root.getChildren('entry', ns);
站名 = root.getChild('title', ns) ? root.getChild('title', ns).getText() : url;
}
nodes.slice(0, CONFIG.每來源抓幾則).forEach(function (it) {
const ns = it.getNamespace();
const get = function (name) {
const c = it.getChild(name) || it.getChild(name, ns);
return c ? c.getText() : '';
};
let 連結 = get('link');
if (!連結) { const l = it.getChild('link', ns); 連結 = l && l.getAttribute('href') ? l.getAttribute('href').getValue() : ''; }
const 摘要 = (get('description') || get('summary') || get('content')).replace(/<[^>]+>/g, '').trim().slice(0, 180);
const 標題 = get('title');
if (標題) out.push({ 來源: 站名, 標題: 標題, 摘要: 摘要, 連結: 連結 });
});
} catch (e) { Logger.log('來源讀取失敗:' + url + ' → ' + e); }
});
return out;
}
/** 寫進 Google Sheet 留底 */
function 寫進表(items) {
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(分頁名);
const now = new Date();
const rows = items.map(function (it) { return [now, it.來源, it.標題, it.摘要, it.連結]; });
sh.getRange(sh.getLastRow() + 1, 1, rows.length, 5).setValues(rows);
}
/** 交給 AI 判讀:每則重點、分類、今日可發文觀察(一定要根據實際內容,避免幻覺) */
function 用AI判讀(items) {
const 清單 = items.map(function (it, i) { return (i + 1) + '. [' + it.來源 + '] ' + it.標題 + '|' + it.摘要; }).join('\n');
const prompt = '你是我的產業觀察助理,我關心:' + CONFIG.我關心的主題 + '。\n' +
'以下是今天抓到的新聞。請只根據這些內容(不要編造)做三件事:\n' +
'1) 幫我從關心的角度挑出重點;2) 分成幾個類別;3) 最後給一段 100 字內的「今日可發文觀察」。\n\n' + 清單;
const res = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', {
method: 'post', contentType: 'application/json',
headers: { Authorization: 'Bearer ' + CONFIG.OPENAI_API_KEY },
payload: JSON.stringify({ model: 'gpt-4o-mini', temperature: 0.4, messages: [{ role: 'user', content: prompt }] }),
muteHttpExceptions: true
});
try { return JSON.parse(res.getContentText()).choices[0].message.content; }
catch (e) { Logger.log('AI 判讀失敗:' + res.getContentText()); return ''; }
}
/** 組信 + 寄出(一定附原文連結,方便你自己核對=防 AI 幻覺) */
function 寄信(items, 觀察) {
const 日期 = Utilities.formatDate(new Date(), 'Asia/Taipei', 'yyyy/MM/dd');
let html = '<div style="font-family:system-ui,\'PingFang TC\',sans-serif;line-height:1.7;max-width:640px;color:#2c2c28;">';
html += '<h2 style="color:#1F4D3D;">今日新聞整理 · ' + 日期 + '</h2>';
if (觀察) html += '<div style="background:#F2EBDD;border-radius:8px;padding:16px 18px;white-space:pre-wrap;">' + 觀察 + '</div>';
html += '<ul style="padding-left:18px;margin-top:16px;">';
items.forEach(function (it) {
html += '<li style="margin:10px 0;"><a href="' + it.連結 + '" style="color:#1F4D3D;font-weight:600;">' + it.標題 + '</a>' +
'<span style="color:#9a958c;"> · ' + it.來源 + '</span><br><span style="font-size:14px;color:#625D55;">' + it.摘要 + '</span></li>';
});
html += '</ul></div>';
GmailApp.sendEmail(CONFIG.收件人, '今日新聞整理 · ' + 日期, '請用支援 HTML 的信箱檢視這封信。', { htmlBody: html, name: '每日新聞小助手' });
}
來源記得先用第一步的方法確認有 RSS。這是給一個人用的起點版,跑順了再讓 AI 幫你加功能(多來源、關鍵字比對、改寄到 LINE 都行)。有卡關,把錯誤訊息整段貼給 AI,它比你我都快找到問題。
留言
看完有想法嗎?留言跟我說說,填個暱稱就能留,會直接顯示在下面。
載入留言中…