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

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

GAS×Gemini 每日未讀信自動摘要信

GAS×Gemini 每日未讀信自動摘要信 — 賴家榮 AI 教學

Overview這一課你會做出什麼

你會做出一個每日信件助理:每天固定時間,Apps Script 自動撈出 Gmail 裡的未讀信,把每封信交給 Gemini 濃縮成重點,再整理成一封「今日信件摘要」寄回你的信箱,讓你一眼掌握當天信件重點。

Key Takeaways

  • 用 GmailApp 依條件撈出未讀信件,只取需要處理的
  • 把每封信的寄件者、主旨與內容交給 Gemini 濃縮重點
  • 自動把所有摘要組成一封排版清楚的每日摘要信
  • 用 GmailApp 把摘要信寄回自己的信箱
  • 金鑰放 PropertiesService 安全保管,不寫死在程式裡
  • 設定每日時間觸發器,早上打開信箱就有摘要

這套流程很適合每天信件量大、又不想一封封點開的人。你可以設定每天早上八點自動執行,起床後信箱就躺著一封整理好的摘要,讓你快速決定哪些信要優先回覆,哪些可以晚點再看。

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

很多人的 Gmail 每天湧入幾十封信:電子報、通知、客戶來信、合作邀約全部混在一起。早上光是把未讀信一封封點開、判斷重不重要,就要花掉半小時,而且注意力被切得零碎,很難進入工作狀態。更糟的是,重要的信有時就淹沒在一堆通知裡被漏掉。

有了 GAS 加上 Gemini,這件事可以自動處理。每天固定時間,程式自動撈出未讀信,把每封的重點交給 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撰寫主流程函式

動作貼上 dailyMailSummary 主函式,它會搜尋未讀信、逐封摘要、組成摘要信並寄出。

常見地雷GmailApp.search 一次可能撈很多信,先用 max 限制數量,避免超過執行時間上限。

5第一次授權

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

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

6先手動執行一次確認結果

動作按「執行」後,打開自己的信箱看是否收到「今日信件摘要」,內容是否正確濃縮各封未讀信。

常見地雷若摘要信沒進來,先到「執行項目」看錯誤紀錄,通常是金鑰或搜尋條件問題。

7建立每日時間觸發器

動作左側鬧鐘「觸發條件」,新增觸發,函式選 dailyMailSummary,來源「時間驅動」,選「日計時器」與時段。

常見地雷時間驅動的時段是區間(例如上午八到九點),不是精準到分,能接受即可。

以下兩段程式碼是核心。第一段 askGemini 為共用 AI 呼叫函式,請原樣照抄;第二段 dailyMailSummary 負責撈未讀信、逐封摘要並寄出整理信。程式刻意用 max 限制處理封數,避免一次撈太多超過 Apps Script 的執行時間上限。

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 dailyMailSummary() {
  // 1. 搜尋未讀信,最多處理 15 封避免超時
  const threads = GmailApp.search('is:unread', 0, 15);
  if (threads.length === 0) return; // 沒有未讀信就不寄摘要

  let body = '你今天有 ' + threads.length + ' 封未讀信,重點摘要如下:\n\n';

  threads.forEach(function(thread, i) {
    const msg = thread.getMessages()[0]; // 取每個對話的第一封
    const from = msg.getFrom();
    const subject = msg.getSubject();
    const plain = msg.getPlainBody().slice(0, 1500); // 只取前段,控制長度

    // 2. 請 Gemini 用一到兩句話濃縮這封信
    const prompt = '請用繁體中文一到兩句話,濃縮這封信的重點與是否需要回覆:\n寄件者:' +
      from + '\n主旨:' + subject + '\n內容:' + plain;
    const summary = askGemini(prompt);

    // 3. 累積到摘要內文
    body += (i + 1) + '. 【' + subject + '】\n寄件者:' + from + '\n摘要:' + summary + '\n\n';
  });

  // 4. 把整理好的摘要寄回自己的信箱
  const me = Session.getActiveUser().getEmail();
  const dateStr = Utilities.formatDate(new Date(), 'Asia/Taipei', 'yyyy/MM/dd');
  GmailApp.sendEmail(me, '今日信件摘要 ' + dateStr, body);
}

Flow一張圖看懂流程

每日信件摘要流程
1每日時間觸發器在設定時段啟動 dailyMailSummary
2用 GmailApp 搜尋未讀信並限制封數
3逐封取出寄件者、主旨與內文前段
4把每封交給 Gemini 濃縮成一到兩句重點
5把所有摘要累積成一封摘要信內文
6用 GmailApp 把摘要信寄回自己的信箱

用文字描述就是:每天到了設定的時段,時間觸發器啟動程式,程式先用 GmailApp 搜尋未讀信並限制最多處理十五封;接著逐封取出寄件者、主旨與內文前段,交給 Gemini 濃縮成一到兩句重點;然後把每封的摘要依序累積成一封整理信,最後寄回你自己的信箱,你打開就能一次看完當天所有未讀信的重點。

Tips常見錯誤與優化

FAQ常見問題 Q&A

常見問題 FAQ

這個程式會不會把我的未讀信變成已讀?

不會。程式只用 getMessages 讀取信件內容來產生摘要,並沒有呼叫任何標記已讀的方法。你的未讀信在摘要寄出後仍維持未讀狀態,你可以照原本習慣去信箱逐封處理。摘要信的作用是先幫你快速掌握重點與優先順序,實際的讀取與回覆動作還是由你自己在信箱裡完成。

如果某天信很多,會不會處理到一半就超時中斷?

有可能,這也是程式用 max 限制封數的原因。Apps Script 單次執行有時間上限,每封信都要呼叫一次 Gemini,封數太多就可能超時。把上限設在十五封左右通常安全。若你信量真的很大,可以改成分批處理,或先用更嚴格的搜尋條件(例如只看某個重要標籤)縮小範圍,確保每次都能順利跑完。

摘要信寄不出來,信箱裡什麼都沒收到,怎麼查?

先到 Apps Script 左側「執行項目」看有沒有錯誤紀錄。常見原因有三:金鑰沒設好、第一次授權沒完成、或搜尋條件下當時剛好沒有未讀信(程式設計成沒未讀就不寄)。你可以先手動標幾封信為未讀,再手動執行一次函式測試,確認流程能正常產出摘要信後,再交給觸發器定時跑。

每日觸發器可以精準設定在早上八點整嗎?

時間驅動觸發器是以區間為單位,例如「上午八點到九點之間」,不是精準到分秒。對每日摘要這種用途完全足夠,你不會在意是八點五分還是八點二十分收到。如果你需要更精準的時間,可以改用每分鐘觸發搭配時間判斷,但通常沒有必要,維持日計時器選擇一個你能接受的時段就好。

我不想摘要電子報和系統通知,只想看真正重要的信,怎麼做?

把搜尋條件改細即可。GmailApp.search 支援 Gmail 的搜尋語法,例如 is:unread -category:promotions 可排除促銷分頁,或用 is:unread -label:電子報 排除你貼過某標籤的信。你也可以只鎖定某些寄件者,例如加上 from 條件。透過調整搜尋字串,就能讓摘要只涵蓋你真正在意的信件,內容更精準。

Gemini 摘要的內容可靠嗎?會不會把重點抓錯?

多數情況相當準確,尤其信件內容清楚時。它偶爾會漏掉細節或誤判緊急程度,所以摘要定位是「快速預覽」而非「完全取代閱讀」。你看完摘要決定優先順序後,重要的信還是建議點回原信確認細節再回覆。你也可以在提示詞裡明確要求它標註「是否需要盡快回覆」,讓摘要更聚焦在你關心的判斷上。

這樣一直呼叫 Gemini API,會不會超過免費額度?

以個人每天十幾封信來算,通常不會。Gemini 免費方案有每分鐘與每日呼叫上限,而這個流程每天只跑一次、每封信呼叫一次。除非你把封數上限開得很高、信又非常多,否則很難碰到限制。若擔心,可把 max 調小,或改成兩三天摘要一次,都能有效控制呼叫量在免費範圍內。

可以把摘要寄到別的信箱,而不是自己這個嗎?

可以。程式碼裡收件者是用 Session.getActiveUser().getEmail() 自動抓執行帳號的信箱,你只要把它換成你想寄達的固定信箱字串即可,例如助理的信箱或你的另一個帳號。這在你想把摘要轉給團隊夥伴,或集中到某個專用信箱管理時很方便,其餘流程完全不用改動。

摘要信可以做得更好看、分類排版嗎?

可以。目前是純文字版本,若想更精緻,可以把 sendEmail 改成帶 htmlBody 選項,用 HTML 標籤做標題、清單與顏色。你甚至能請 Gemini 順便判斷每封信的類別,再依類別分區塊排版。不過純文字版本已經很實用,建議先讓基本流程穩定運作,再視需要慢慢美化外觀,避免一開始就把事情複雜化。

我完全零基礎,這課會不會太難?

不會。你不需要自己寫演算法,兩段核心程式碼複製貼上就好,其餘都是照步驟在畫面上點選:開專案、設金鑰、貼程式、授權、設觸發器。整個過程沒有需要你憑空發明的邏輯。建議先手動執行一次、確認收到摘要信,理解流程後再依自己的需求微調搜尋條件與提示詞,一步步就能完成。

CTA下一步

當每天早上信箱就自動躺著一封重點摘要,你等於幫自己請了一位不眠不休的信件秘書。把這招學會後,你可以再進一步讓程式自動分類、貼標籤,甚至草擬回信,把整個收信流程都交給自動化。

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

預約授課・免費諮詢

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

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

Your turn

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

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

預約授課・免費諮詢