Gmail:用 Apps Script 玩轉 Gmail

 


多數人對 Gmail 的印象停在「搜尋、歸檔、寄信」,但同一套工具其實能變成你的流程引擎。關鍵就在 Gmail service:一個把人手操作翻成程式邏輯的入口。

本文會先用白話把三個工具拆開:GmailApp=快速自動化的萬用扳手、Advanced Gmail service=API 等級的細緻控制、MailApp=單純寄信的輕量路線。

然後用情境帶著走:財務發票、客服分流、招募郵件追蹤、專案異常通知——每個例子都配上查詢語法、標籤策略與寄信草稿。最後再把安全與治理補齊:最小權限、配額與速率限制、日誌與審計。

你會發現,管理郵件其實不是更用力,而是更有章法。希望本篇文章能夠幫助到需要的您。


目錄

{tocify} $title={目錄} 


Gmail service 是什麼?

在 Google Apps Script(GAS)裡,「Gmail service」通常指兩條路:

內建 Gmail 服務:

    GmailApp —— 走捷徑,語法簡單、上手快,能做 80% 常見事(發信、找信、標籤、讀取郵件、建立草稿…)。

進階 Gmail 服務:

    Gmail(Advanced Service,包 Gmail API)能力最完整,等於在 Apps Script 內直接用 Gmail API,可取到更細的欄位、更多端點,但要先在專案啟用,寫法偏 API 風格。

兩者都在 Apps Script 執行,差別在「抽象層級」:GmailApp 比較像幫你包好的工具箱;Advanced Service 則是原生 API 的全餐,功能細、權限敏感度也更高。

快速判斷:

    只想快速發信/撈信/貼標籤 → 用 GmailApp。

    需要精細控制(例如存取原始 MIME、history API、分頁遊標、完整回覆鏈細節)→ 用 Advanced Service(Gmail API)。


和我們平常用的 Gmail(網頁/手機 App)有什麼不同?

一般 Gmail(介面) 是人用的:

    你登入、搜尋、勾選、套用標籤、手動整理。

Gmail service(Apps Script) 是程式用的:

    它讓你的腳本以「你的身分」自動化那一切,比如每晚 2 點掃描收件匣,把發票自動轉寄+歸檔、或把特定寄件者的附件存到雲端硬碟。權限來自你對腳本的授權。

另外還有 MailApp:只負責「寄信」,不需要你的帳戶一定啟用 Gmail,但功能比 GmailApp 少;Google 曾明確說過兩者都能寄信,不同在是否依賴 Gmail 帳戶與功能廣度。


什麼時候用哪一個?

情境 建議工具 為什麼
寄出通知信、簡單寄送 HTML 內容 GmailApp.sendEmailMailApp.sendEmail GmailApp 好讀、帶附件/HTML 方便;若環境沒有 Gmail,就用 MailApp
大量讀取郵件細節、操作 history、拿原始 MIME Advanced Gmail service(Gmail API) API 欄位完整、可做更進階的同步與過濾。
批次標籤、封存、搜尋 threads GmailApp 常見工作流 80% 夠用,語法短。
需要確切掌握 API 使用額度、處理 rate limit Gmail API 有明確「配額單位」與超限錯誤碼可處理。


權限與配額:先把「紅線」畫清楚

權限(Scopes)

        Apps Script 由你授權所需範圍(scope)。像 Gmail 常見的 https://www.googleapis.com/auth/gmail.modify 或極寬鬆的 https://mail.google.com。做附加元件時,建議只申請「用得到的最小集合」,避免拿整箱權限。 


寄信與操作配額(Quotas)

        Apps Script 層面有「每天可寄信的收件者數」等限制(個人帳/Workspace 帳不同),另外也有讀寫 Gmail 的上限。

        Gmail API 本身也有「每專案/每使用者每分鐘的配額單位」限制(超限會拋 rateLimitExceeded 或 userRateLimitExceeded)。

        Google Workspace 的寄信限制(例如每天 2,000 封、外部收件人 3,000 位等)另有官方頁面,與你用不用 Apps Script 無關,屬於帳戶級防濫用規則。


GAS 的 Gmail service(指 GmailApp 內建服務)底下的核心 class

GmailApp:

        入口服務。你所有對 Gmail 的操作都由它發起:搜尋、貼標、封存、寄信、建立草稿、抓別名(alias)… 等。可以想像成「遙控器」。

GmailThread:

        郵件「對話串」。包含多封來回的信(messages),可以對整串加標籤、封存、設為已讀/未讀、移垃圾桶… 等。工作流常用它來做批次操作。

GmailMessage:

        單一郵件。能讀主旨、寄件人、日期、本文、擷取附件、回覆、轉寄… 精細到單封信的層級。

GmailLabel:

        使用者自訂標籤。可建立、刪除、掛/拆某標籤,並把標籤套在 thread 上(注意:標籤是貼在 thread,不是只貼某一封)。

GmailDraft:

        草稿。可以抓取、送出、刪除,或把草稿轉成 GmailMessage 物件繼續處理。適合大量寄信前先「人工複核」。

GmailAttachment:

        附件。其本質是個 Blob,但多了較快的 getSize() 等便利方法;通常從 GmailMessage.getAttachments() 取到。


關係圖:

GmailApp(遙控器)→ 搜尋到 GmailThread[] → 展開拿 GmailMessage[] → 每封抓 GmailAttachment[];過程中用 GmailLabel 管理分類,用 GmailDraft 安全寄出。


各類別重點&什麼時候用

GmailApp(入口與總管)

    重要性:

        所有流程的起點;同時也負責「寄信/建草稿/搜尋」這些高頻動作。

    常見功能:

        search(query, start, max):用 Gmail 查詢語法抓 thread 清單。

        sendEmail(...) / createDraft(...):寄出或先建草稿(支援 HTML、附件、cc/bcc、from alias)。

        getAliases():取得可用寄件別名(付費帳可從 alias 寄出)。

         什麼時候用:你要「找一批信」、「快速寄一封」、「先做草稿」的時候。


GmailThread(對話串)

    重要性:做「批次整理」的主戰場。

    常見功能:

        addLabel(label)、removeLabel(label)、moveToArchive()、moveToTrash()。

        markRead() / markUnread();getMessages() 展開取單封。

        什麼時候用:你只在意「這一整串」:例如所有發票串都加 invoices/2025 並封存。


GmailMessage(單封郵件)

    重要性:需要讀內容、抓附件、回覆/轉寄時一定會到這層。

    常見功能:

        getSubject()、getFrom()、getDate()、getPlainBody()/getBody()。

        getAttachments()(拿 GmailAttachment[])、reply()、forward()。

        什麼時候用:做精細判斷或抽資料(例如從本文抓訂單號、把附件存雲端)。


GmailLabel(標籤)

    重要性:你的分類系統;自動化的「資料夾」。

    常見功能:

        GmailApp.createLabel(name) 建新標籤;getUserLabelByName(name) 取得已存在的標籤;

        對 thread 執行 addLabel / removeLabel。

        什麼時候用:定期整理、建儀表板前打標、或做「流程階段」標記(ex. support/new → support/replied)。


GmailDraft(草稿)

    重要性:大量寄送的保險絲。

    常見功能:

        send() 直接送出;getMessage() 拿到該草稿對應的 GmailMessage;deleteDraft()。

        什麼時候用:群發前需要人工檢閱版型、收件者或附件;或用草稿當範本複製。


GmailAttachment(附件)

    重要性:報表、發票、收據、履歷的自動化關鍵點。

    常見功能:

        作為 Blob 使用(可 copyBlob()、丟給 DriveApp.createFile());getSize() 省配額、效率好。

        什麼時候用:把附件丟進指定雲端資料夾、後續 OCR/解析。


常見組合拳(把 class 串起來)

    搜尋 → 打標 → 封存:GmailApp.search() → thread.addLabel() → thread.moveToArchive()(Thread 層做批次最快)。

    展開處理附件:thread.getMessages() → message.getAttachments() → 存 Drive(Attachment 是 Blob)。

    安全寄送:createDraft() 先建草稿 → 人工確認 → draft.send()。


和 Advanced Gmail service 的分工

你看到的這些 class 都屬於 內建 Gmail service(GmailApp) 的物件模型。若你需要更細資料(原始 MIME、history 變更、pageToken 分頁…),就要啟用 Advanced Gmail service,在 Apps Script 內直接呼叫 Gmail API。


快速實作:從 0 到自動化

搜尋郵件並批次貼標籤+封存

function labelAndArchiveInvoices() {
  const LABEL = 'invoices/2025';
  const query = 'from:service@vendor.com subject:invoice newer_than:1y';
  const label = GmailApp.getUserLabelByName(LABEL) || GmailApp.createLabel(LABEL);

  const threads = GmailApp.search(query, 0, 100); // 最多先抓 100 條
  threads.forEach(t => {
    t.addLabel(label);
    t.moveToArchive();
  });
}


GmailApp.search(query, start, max) 支援 Gmail 查詢語法,對於常見自動整理已經很夠用。


自動把附件存到雲端硬碟

function saveAttachments() {
  const folder = DriveApp.getFolderById('your-folder-id');
  const threads = GmailApp.search('has:attachment filename:pdf newer_than:7d', 0, 50);
  threads.forEach(thread => {
    thread.getMessages().forEach(msg => {
      msg.getAttachments({includeInlineImages: false}).forEach(file => {
        folder.createFile(file.copyBlob()).setName(file.getName());
      });
    });
  });
}


讀取郵件 → 取 message → 取附件,是 Thread → Message → Attachment 的層級關係。


寄出 HTML 通知信(含抄送、密件副本)

function notify() {
  GmailApp.sendEmail(
    'to@example.com',
    '系統通知:資料已更新',
    '純文字備用內容',
    {
      htmlBody: '

更新完成,請至報表查看。

', cc: 'pm@example.com', bcc: 'audit@example.com', name: '自動化通知' } ); }


GmailApp.sendEmail 支援 HTML 內容與多種選項;若只想建立草稿,用 GmailApp.createDraft(...)。


建立草稿並插入簽名或範本

function createDraftFromTemplate() {
  const tmpl = HtmlService.createTemplateFromFile('tmpl_notification'); // 你的 HTML 檔
  tmpl.title = '本月對帳';
  const body = tmpl.evaluate().getContent();
  GmailApp.createDraft('client@example.com', '【每月對帳】9 月份', '', {htmlBody: body});
}


建立草稿再人工微調,是避免誤寄大量郵件的好習慣。


真的差在哪?GmailApp vs. Advanced Gmail service vs. MailApp(重點對照)

面向 GmailApp(內建) Advanced Gmail service(Gmail API) MailApp
易用性 ★★★★☆ ★★☆☆☆(API 風格) ★★★★☆(只寄信)
功能廣度 一般自動化 80% 夠用 最完整(history、原始 MIME、細節欄位) 只寄信
權限(Scopes) 依常見 Gmail 權限 需申請 API 專屬 scope,建議最小化 通常權限較窄
是否需要 Gmail 帳戶 需要 需要 不一定需要 Gmail(官方說明)
適用場景 搜尋/貼標/封存/快速寄信 需要精細控制與同步、整合外部系統 只有寄信、沒有 Gmail 的環境
代表性參考 Docs: Gmail service Docs: Advanced Gmail 官方說明:兩者差異



張貼留言 (0)
較新的 較舊