首頁/AI 講義/數位工具・自動化

數位工具・自動化 · Workspace+GAS+Gemini約 11 分鐘Automation

GAS×Gemini 新信自動分類貼標籤歸檔

GAS×Gemini 新信自動分類貼標籤歸檔 — 賴家榮 AI 教學

Overview這一課你會做出什麼

你會做出一套自動分類系統:程式定時撈出 Gmail 新進未讀信,把每封交給 Gemini 判斷類別,再用 GmailApp 自動貼上對應標籤歸檔,讓收件匣按主題分門別類,一目了然。

Key Takeaways

  • 用 GmailApp 撈出尚未分類的新進信件
  • 把寄件者、主旨與內容交給 Gemini 判斷類別
  • 限定 AI 只能從固定類別清單挑選,程式端再過濾
  • 自動建立或取用對應標籤並貼到信件上
  • 金鑰放 PropertiesService 安全保管,不寫死在程式裡
  • 設定時間觸發器,每小時自動整理收件匣

這套流程很適合信件雜、又想維持收件匣整齊的人。你可以設定每小時執行一次,新信一進來就被自動貼上「客戶」「帳單」「電子報」等標籤歸位,日後要找特定主題的信,點標籤就能一次看齊。

Why先看情境:這解決什麼問題

Gmail 雖然有內建篩選器,但它只能靠寄件者、關鍵字這類固定規則分類。真實世界的信件千變萬化:同一個客戶可能今天談報價、明天問技術、後天要開發票,光靠關鍵字很難精準歸類,你還是得常常手動整理,把信一封封拖進正確的標籤。

有了 GAS 加上 Gemini,分類可以交給真正「讀懂內容」的 AI。程式定時撈出新信,把內容交給 Gemini 判斷它屬於哪一類,再自動貼上對應標籤。因為是根據語意判斷,不受限於死板的關鍵字規則,分類更貼近實際內容。你的收件匣會自動維持整齊,要找某主題的信時,點該標籤就能一次看完,省下大量手動歸檔的時間。

Prepare動手前準備

Checklist

  • 一個可正常使用的 Google 帳號(Gmail 就是要分類的信箱)
  • 一組 Gemini API 金鑰:到 ai.google.dev 登入後建立並複製備用
  • 想好要用哪幾個分類標籤,例如客戶、帳單、電子報、其他
  • 信箱裡有一些未讀新信可供測試
  • 決定多久自動整理一次,例如每小時

Steps一步一步實作

1建立獨立的 Apps Script 專案

動作打開 script.google.com 點「新增專案」,這類定時工作用獨立專案最單純,不必綁定表單或試算表。

常見地雷別從表單或試算表進入,這課要的是能被時間觸發器定時執行的獨立專案。

2設定 Gemini 金鑰

動作左側齒輪「專案設定」,到「指令碼屬性」新增:名稱 GEMINI_API_KEY,值貼上金鑰,按儲存。

常見地雷金鑰前後別留空白,儲存後再回編輯區,否則程式讀不到金鑰。

3貼上 askGemini 共用函式

動作刪掉預設程式碼,貼上本文的 askGemini 函式,負責呼叫 Gemini 並回傳文字。

常見地雷模型網址與 key 參數保持原樣,改動容易造成呼叫失敗。

4撰寫主流程函式

動作貼上 autoLabelMail 主函式,它會搜尋未貼標的新信、請 AI 分類、建立或取用標籤並貼上。

常見地雷搜尋條件要排除已處理的信,否則每次執行都會重複判斷同一批信浪費配額。

5第一次授權

動作上方函式選 autoLabelMail 按「執行」,跳出授權時選帳號、進階、允許存取 Gmail 與網路。

常見地雷出現未驗證警告屬正常,這是你自己的專案,往下點允許即可。

6先手動執行確認分類

動作按「執行」後,回 Gmail 看新信是否被貼上正確標籤,左側標籤清單也應自動出現新標籤。

常見地雷若標籤沒出現,先看「執行項目」錯誤紀錄,通常是金鑰或搜尋條件問題。

7建立時間觸發器

動作左側鬧鐘「觸發條件」,新增觸發,函式選 autoLabelMail,來源「時間驅動」,選「分鐘計時器」或「小時計時器」。

常見地雷間隔別設太密(例如每分鐘),信量小時反而浪費配額,每小時一次通常就夠。

以下兩段程式碼是核心。第一段 askGemini 為共用 AI 呼叫函式,請原樣照抄;第二段 autoLabelMail 負責撈新信、請 AI 分類並貼標籤。程式用一個「已分類」的母標籤來標記處理過的信,搜尋時排除它,避免重複判斷同一封信浪費 API 配額。

function askGemini(prompt) {
  const key = PropertiesService.getScriptProperties().getProperty('GEMINI_API_KEY');
  const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' + key;
  const payload = { contents: [{ parts: [{ text: prompt }] }] };
  const res = UrlFetchApp.fetch(url, { method:'post', contentType:'application/json', payload: JSON.stringify(payload), muteHttpExceptions:true });
  return JSON.parse(res.getContentText()).candidates[0].content.parts[0].text.trim();
}
function autoLabelMail() {
  // 允許的分類清單,AI 只能從這裡挑
  const categories = ['客戶', '帳單', '電子報', '其他'];
  const doneLabel = getOrCreateLabel('已分類'); // 標記處理過的信

  // 1. 只撈尚未分類的新信,最多 15 封避免超時
  const threads = GmailApp.search('is:unread -label:已分類', 0, 15);

  threads.forEach(function(thread) {
    const msg = thread.getMessages()[0];
    const from = msg.getFrom();
    const subject = msg.getSubject();
    const plain = msg.getPlainBody().slice(0, 1200);

    // 2. 請 Gemini 從固定清單挑一個類別
    const prompt = '請閱讀這封信,只回覆下列其中一個詞,不要多餘說明:' +
      categories.join('、') + '。\n寄件者:' + from + '\n主旨:' + subject + '\n內容:' + plain;
    let cat = askGemini(prompt);
    if (categories.indexOf(cat) === -1) cat = '其他'; // 白名單過濾

    // 3. 建立或取用該類別標籤並貼上,同時貼「已分類」
    const label = getOrCreateLabel('AI/' + cat);
    thread.addLabel(label);
    thread.addLabel(doneLabel);
  });
}

// 依名稱取得標籤,沒有就建立
function getOrCreateLabel(name) {
  return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}

Flow一張圖看懂流程

新信自動分類流程
1時間觸發器每小時啟動 autoLabelMail
2搜尋未讀且尚未貼「已分類」的新信
3逐封取出寄件者、主旨與內文前段
4請 Gemini 從固定類別清單挑一個
5程式用白名單過濾 AI 回覆
6建立或取用對應標籤並貼上信件
7同時貼上「已分類」避免下次重複處理

用文字描述就是:時間觸發器每小時啟動程式,程式搜尋還沒被貼上「已分類」標籤的未讀新信;接著逐封把寄件者、主旨與內文前段交給 Gemini,請它從固定清單裡挑一個類別;程式用白名單確認回覆合法後,建立或取用對應標籤貼到信上,並同時貼上「已分類」標籤,下次搜尋就會自動跳過這封,不會重複判斷。

Tips常見錯誤與優化

FAQ常見問題 Q&A

常見問題 FAQ

這程式會不會不小心把同一封信重複貼很多次標籤?

不會。程式每處理完一封信,就額外貼上一個「已分類」標籤,而搜尋條件用 -label:已分類 排除這些信。下次執行時,貼過的信不會再被撈出來,自然不會重複判斷或重複貼標籤。這個「處理完就打勾」的設計,是自動化定時任務中很關鍵的做法,能確保每封信只被分類一次,也節省 API 配額。

Gemini 分類錯了怎麼辦,我還能手動改嗎?

當然可以。程式只是自動幫你先貼上標籤,並沒有鎖死。你在 Gmail 裡看到分類不對,隨時可以手動移除錯的標籤、換上正確的,跟平常操作標籤一模一樣。若你發現某類常被判錯,可以在提示詞裡替該類別加上更清楚的定義或舉例,引導 AI 下次判斷更準確,逐步把分類調到符合你的習慣。

為什麼要限定 AI 只能從固定清單挑類別?

因為若不限定,AI 可能自由發揮回一個新詞,導致標籤越長越多、越來越亂。限定清單並在程式端用白名單過濾,能確保標籤永遠只有你規劃的那幾個,收件匣結構穩定可預期。這也讓日後維護更簡單,你清楚知道會有哪些標籤,不會某天冒出一堆意義重複或怪異的分類把畫面塞爆。

標籤名稱前面的 AI/ 是什麼意思?

那是 Gmail 的巢狀標籤寫法。用斜線分隔,AI 會變成母標籤,客戶、帳單等變成它底下的子標籤,在左側清單可以收合成一組,畫面更整齊,也一眼看出這些是自動分類產生的。你不喜歡也可以拿掉,直接用「客戶」「帳單」當標籤名即可,功能完全一樣,純粹是視覺與組織上的偏好。

信件很多時會不會超過執行時間限制?

有可能,所以程式用 max 限制每次最多處理十五封。Apps Script 單次執行有時間上限,每封都要呼叫一次 AI,太多就可能超時。搭配每小時觸發一次,通常足以逐步消化新信。若你某段時間信量特別大,可以暫時把觸發間隔縮短,或提高封數上限但要留意別逼近時間上限,取一個穩定跑得完的數字最重要。

它只會處理未讀信嗎?已讀的舊信能不能也一起分類?

預設搜尋條件是 is:unread,所以只處理未讀。若你想連已讀舊信一起整理,把搜尋字串裡的 is:unread 拿掉,只留 -label:已分類 即可,程式就會把所有還沒分類的信都納入。不過舊信一次很多,建議搭配較小的封數上限分批跑,避免一次撈太多超時,也讓 API 呼叫量比較好控制。

這會影響 Gmail 原本的篩選器或分頁嗎?

不會衝突。這套流程只是額外幫信件加上你自訂的標籤,Gmail 原本的篩選器、主要/社交/促銷分頁都照常運作,兩者可以並存。你甚至可以讓程式只處理某個分頁的信,例如在搜尋條件加上 category:primary,讓自動分類專注在主要信件上,其餘交給 Gmail 內建機制,各司其職互不干擾。

Gemini 的免費額度分類這麼多信夠用嗎?

多數個人使用綽綽有餘。因為有「已分類」標記,每封信只會被判斷一次,不會重複消耗配額;再加上每次執行有封數上限。Gemini 免費方案的每分鐘與每日呼叫上限,對一般信量來說很難碰到。若你信量真的很大,可把觸發間隔拉長、封數上限調小,讓呼叫更平均分散,就能穩穩待在免費範圍內。

我想加更多分類,例如把客戶再分成新客與舊客,可以嗎?

可以,只要擴充程式裡的類別清單,並在提示詞裡說明每個類別的判斷標準即可。分類越細,越建議給 AI 清楚的定義或例子,例如註明「新客指第一次來信詢問的人」。定義越明確,AI 判斷越穩定。改完記得先手動執行測試幾封,確認新分類運作正常,再交給觸發器定時執行,避免細分後判斷失準。

零基礎的我,照著做會不會卡關?

不太會。兩段核心程式碼複製貼上即可,其餘都是照步驟在畫面上點選:開專案、設金鑰、貼程式、授權、設觸發器,沒有需要你自己發明的邏輯。建議第一次先手動執行、回 Gmail 確認標籤有正確貼上,理解流程後再依需求調整類別清單與搜尋條件。一步一步來,即使沒有程式背景也能順利完成這套自動分類。

CTA下一步

當新信一進來就被自動貼好標籤歸位,你的收件匣會從此維持整齊,找信也更快。把這招學會後,可以再讓程式針對特定類別自動草擬回信,把「分類」與「回覆」串成一條完整的自動化流水線。

想讓團隊用 AI+自動化把重複工作交給流程?賴家榮提供 Workspace/GAS/Gemini 企業內訓與大學課程。

預約授課・免費諮詢

本文為賴家榮 AI 教學中心原創教學內容;想讓團隊學會用 AI,歡迎看AI 課程或預約授課 →

代表圖片來源:圖片來源:Pexels

Your turn

把 AI,變成團隊真的用得上的能力。

不論你在哪個產業,賴家榮都能帶團隊把 AI 學到真的用得上。

預約授課・免費諮詢