你是否曾因系統通知信的遺漏而感到焦慮?
為了確保重要資訊不被錯過,我設計了一個自動化監測腳本,能精準記錄郵件的接收時間與內容。儘管系統郵件的寄送時間不固定,無法單純依賴固定時間檢核,但這套解決方案能即時捕捉每封信件,讓我不再擔心漏接通知。
我製作了一個google sheet的線上表單,並且鍵入每天固定的值A~C欄位,D & E欄位是保留給程式跑出來的結果(紅色部分),主要訴求是每天按下觸發後會自動跑出紅色的部分(感覺自己又靠AI多做了一點事?!)
圖一:最終示意圖
因為公司使用gmail系統,所以我就想到可以使用google app script (類似javascript)的腳本程式語言,可以幫我快速串聯所有google 服務!
我真是機智的小天(?),但本人程式麻瓜.....該怎麼活用Google Apps Script:這個串聯 Google 服務的神隊友?這時候AI的強大就顯現出來了!還好我中文很好,我寫了下面的prompt.....
我的Prompt(我給 AI 的指令範例)
我向 AI 清楚說明我的需求:
我想請你幫我寫google app script 我按下按鈕後就可以去跑這個結果, (https://docs.google.com/spreadsheets/d (這裡是完整的網址)) 在這張檢核表當張中
- Email 主旨: 主旨都一樣
- sender: 寄件人都相同,系統發出的
- receiver: 有一個沒有收件人 (因為太多我不附上了)
- 寄送時間: 主要想要讀取的內容
- 信件內容: 主要想要讀取的內容
請幫我寫google app script....
如何操作
下面這段 Google Apps Script 貼到 App Script Editor
(擴充功能 Extensions → Apps Script)後就能用。

圖二:App Script在這裡~
設定觸發條件:打造個人化自動化按鈕
這個自動化的小工具需要觸發,可以是時間點或者執行某個動作,我個人習慣使用按鈕,而設置按鈕有兩種方:
- 自訂選單按鈕:每次開啟試算表都會在功能表左邊多出 「📧 檢核工具」→「↻ 更新 Gmail 資訊」,(如同圖二 右邊有個檢核工具)
- 圖形/圖片按鈕:也可以在試算表插入「圖形/圖片」→ 右鍵 → 指派指令碼 → 填
updateEmailInfo
,按按鈕就會跑。
我在這個範例中選擇第一種(看起來很高大上?)
AI基於我上述的需求會產出一步步的解決方案,如果聽不懂,我會說請step by step告訴我、或者我會說請用國中生/阿嬤聽得懂的語言指引我,或者就單純一直跟他說我不懂讓他重述~
AI會先跟我確認他的認知是否正確:
假設
- 工作表名稱 工作表1(如工作表名稱就要調整cod當中的 const SHEET_NAME)
- 第 1 列是標題,A∼E 欄依序為: Email 主旨 | sender | receiver | 寄送時間 | 信件內容
- A 欄已填入要檢索的 email 主旨。
程式碼
/**
* 開啟檔案時自動建立自訂選單
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('📧 檢核工具')
.addItem('↻ 更新 Gmail 資訊', 'updateEmailInfo')
.addToUi();
}
/**
* 依 A 欄「Email 主旨」搜尋 Gmail,
* 把 sender / receiver / 寄送時間 / 信件內容 寫回 B~E 欄
*/
function updateEmailInfo() {
const SHEET_NAME = '工作表1'; // ⇦ 工作表名稱
const TZ = Session.getScriptTimeZone();
const MAX_BODY = 1000; // 信件內容最多存幾字
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const rows = sh.getLastRow() - 1; // 不含表頭
if (rows <= 0) {
SpreadsheetApp.getUi().alert('沒有任何主旨可供檢索。');
return;
}
const aValues = sh.getRange(2, 1, rows, 1).getValues(); // 只抓 A 欄
const output = [];
aValues.forEach(([subject]) => {
if (!subject) { // A 欄空白
output.push(['', '', '', '']);
return;
}
// 找最新的一封含該主旨的信
const threads = GmailApp.search(`subject:"${subject}"`, 0, 1); // 最多取 1 thread
if (threads.length === 0) { // 找不到
output.push(['(未找到)', '', '', '']);
return;
}
const msg = threads[0].getMessages().pop(); // 取該 thread 最後一封
const body = msg.getPlainBody().replace(/\s+/g, ' ').substring(0, MAX_BODY);
output.push([
msg.getFrom(), // sender
msg.getTo(), // receiver
Utilities.formatDate(msg.getDate(), TZ, 'yyyy/MM/dd HH:mm:ss'), // 寄送時間
body // 信件內容(前 1000 字)
]);
});
// 回寫 B~E 欄
sh.getRange(2, 2, rows, 4).setValues(output);
優化信件內容:讓機器產出更貼近人性
初次運行後,我發現程式抓取的信件內容包含了許多系統資訊,冗長且不便閱讀。身為一個使用者,我只想看到乾淨、重點明確的內文。因此,我再次與 AI 溝通,進行優化:
- 目的: 按下按鈕後,從 Gmail 抓取最新一封符合主旨的信,並自動寫入寄件人、收件人、寄送時間以及精簡後的信件內容。
- 優化項目: 信件內容將會自動去除以下不必要的資訊:
--
後的頁腳資訊(如取消訂閱連結)From: / Sent: / To: / Cc: / Subject:
等轉寄歷史訊息[cid:imagexxx]
這類圖片參照[Company Logo]
等圖示文字<http...>
這類 HTML 連結- 多餘的空白字元與簽名區塊(例如
Best Regards,
開頭的內容)
經過優化後的程式碼如下:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('📧 檢核工具')
.addItem('↻ 更新 Gmail 資訊', 'updateEmailInfo')
.addToUi();
}
function updateEmailInfo() {
const SHEET_NAME = '工作表1'; // ⇦ 修改為你的工作表名稱
const TZ = Session.getScriptTimeZone();
const MAX_BODY = 1000;
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
const rows = sh.getLastRow() - 1;
if (rows <= 0) {
SpreadsheetApp.getUi().alert('沒有任何主旨可供檢索。');
return;
}
const aValues = sh.getRange(2, 1, rows, 1).getValues();
const output = [];
aValues.forEach(([subject]) => {
if (!subject) {
output.push(['', '', '', '']);
return;
}
const threads = GmailApp.search(`subject:"${subject}"`, 0, 1);
if (threads.length === 0) {
output.push(['(未找到)', '', '', '']);
return;
}
const msg = threads[0].getMessages().pop();
const rawBody = msg.getPlainBody();
let cleaned = rawBody.split('\n--')[0]; // 砍掉 "--" 後面
cleaned = cleaned
.replace(/From:.*/gi, '')
.replace(/Sent:.*/gi, '')
.replace(/To:.*/gi, '')
.replace(/Cc:.*/gi, '')
.replace(/Subject:.*/gi, '')
.replace(/Best Regards,.*$/i, '') // 簽名區塊
.replace(/\[cid:.*?\]/g, '')
.replace(/\[Company Logo\]/gi, '')
.replace(/<http.*?>/gi, '')
.replace(/\s+/g, ' ')
.trim();
const body = cleaned.substring(0, MAX_BODY);
output.push([
msg.getFrom(),
msg.getTo(),
Utilities.formatDate(msg.getDate(), TZ, 'yyyy/MM/dd HH:mm:ss'),
body
]);
});
sh.getRange(2, 2, rows, 4).setValues(output);
}
修改好後按下儲存按鈕 (下圖)後,回到google sheet 重新整理,觸發的按鈕出現啦!

圖三:儲存按鈕
如何使用這個腳本:程式麻瓜也能輕鬆上手!
- 首次執行與授權: 第一次執行時,會跳出授權視窗。請按照指示,授權腳本存取您的 Gmail 和 Google 試算表。這是確保腳本能正常運作的關鍵一步。
- 日常使用: 之後,您只需點擊功能表中的「📧 檢核工具」→「↻ 更新 Gmail 資訊」,或按下您指派的按鈕,腳本就會自動更新 B 至 E 欄的資訊。
重要的注意事項
為了讓這個腳本順暢運行,請留意以下幾點:
- 確保 A 欄有主旨: 請確認您的 Google 試算表 A 欄已填入正確的 Email 主旨(例如:「對帳OO結果通知」)。這是腳本搜尋信件的依據。
- 工作表名稱正確: 請在「工作表1」分頁操作,或者如果您使用了不同的工作表名稱,務必修改程式碼中
const SHEET_NAME
的值。 - 完成 Gmail 授權: 第一次執行
updateEmailInfo()
函數後,請務必完成 Gmail 權限的授權步驟。

圖一
太好了!
現在你可以每天早上悠閒的喝咖啡、優雅地按下一個鍵,讓腳本替你開心工作啦!
作者後記
這個解決方案源於實際工作需求,並簡化呈現,希望能透過這篇文章,讓更多人感受到AI與程式自動化所帶來的無限魅力與便利,即使是程式麻瓜也能輕鬆上手!
未來期待與大家分享更多有趣的內容,讓AI與程式能幫助你的工作更上一層樓 :)