跳轉至

建立 2026-09-21 更新 2026-09-21

Gmail、Drive 與日曆

這四個服務碰的是你的個人資料(信件、檔案、行程),所以都需要授權,都不能在 onEdit 這類簡易觸發裡使用。要自動跑,一律用可安裝觸發,尤其是時間驅動。總表與星等說明見 內建服務

GmailApp

常用度:★★★★☆ 常搭配的觸發:時間驅動(輪詢)、選單。Apps Script 沒有「收到新信」事件

讀取、搜尋、整理信件:搜尋語法和 Gmail 搜尋框一樣,回傳的是對話串(thread),每個對話串裡有多封訊息(message)。也能寄信、建立草稿、貼標籤。只需要寄信的話,改用 MailApp 權限更小。

範例:每小時把帶「報價」主旨的未讀信整理進試算表,並標記為已處理

function collectQuotes() {
  const label = GmailApp.getUserLabelByName("已處理") || GmailApp.createLabel("已處理");
  const threads = GmailApp.search("subject:報價 is:unread -label:已處理", 0, 20);

  const rows = threads.map((t) => {
    const m = t.getMessages()[0];
    return [m.getDate(), m.getFrom(), m.getSubject()];
  });
  if (rows.length) {
    const sheet = SpreadsheetApp.getActive().getSheetByName("報價信");
    sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, 3).setValues(rows);
  }
  threads.forEach((t) => {
    t.addLabel(label);
    t.markRead();
  });
}

搜尋條件裡的 -label:已處理 是關鍵:處理完就貼標籤,下一輪搜尋就不會重複撈到同一封。

MailApp

常用度:★★★★☆ 常搭配的觸發:時間驅動、表單提交、選單

只負責寄信,不能讀信,因此授權範圍比 GmailApp 小,使用者比較放心。收件人數每日有配額(一般帳號 100、Workspace 1,500),可用 MailApp.getRemainingDailyQuota() 查剩餘。

範例:把這份試算表存成 PDF,用 HTML 信件寄給主管

function sendReport() {
  const pdf = DriveApp.getFileById(SpreadsheetApp.getActive().getId())
    .getAs(MimeType.PDF);
  const today = Utilities.formatDate(new Date(), "Asia/Taipei", "MM/dd");

  MailApp.sendEmail({
    to: "boss@example.com",
    subject: "每週報表 " + today,
    htmlBody: "<p>您好,附件是本週報表。</p>",
    attachments: [pdf],
  });
}

掛上每週一早上 8 點的時間驅動觸發,就是全自動週報。單封信的收件人上限與附件大小見 效能與執行限制

DriveApp

常用度:★★★★☆ 常搭配的觸發:時間驅動(輪詢)、表單提交、選單。沒有「檔案異動」事件

管理雲端硬碟:找檔案、建資料夾、複製、搬移、改分享權限。它的特色是迭代器(iterator)getFiles() 不會回傳陣列,而是要用 hasNext()next() 一個一個取。

範例:把某個資料夾裡的檔案清單寫進試算表

function listFiles() {
  const files = DriveApp.getFolderById("資料夾ID").getFiles();
  const rows = [];
  while (files.hasNext()) {
    const f = files.next();
    rows.push([f.getName(), f.getMimeType(), f.getLastUpdated(), f.getUrl()]);
  }

  const sheet = SpreadsheetApp.getActive().getSheetByName("檔案清單");
  sheet.clearContents();
  sheet.getRange(1, 1, 1, 4).setValues([["名稱", "類型", "最後更新", "連結"]]);
  if (rows.length) sheet.getRange(2, 1, rows.length, 4).setValues(rows);
}

資料夾 ID 是資料夾網址 /folders/ 後面那一串。範本複製產生文件的用法見 試算表、文件、簡報與表單

CalendarApp

常用度:★★★☆☆ 常搭配的觸發:日曆事件更新(可安裝)、時間驅動、表單提交

讀寫 Google 日曆:查某段時間的事件、建立事件、邀請與提醒。時間參數必須是 Date 物件,所以從試算表讀時間要用 getValues(),不能用 getDisplayValues()(後者是字串)。

範例:每週一早上,把未來 7 天的行程寄給自己

function mailWeekAgenda() {
  const now = new Date();
  const end = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
  const events = CalendarApp.getDefaultCalendar().getEvents(now, end);

  const lines = events.map(
    (ev) =>
      Utilities.formatDate(ev.getStartTime(), "Asia/Taipei", "MM/dd HH:mm") +
      "  " + ev.getTitle()
  );
  MailApp.sendEmail(
    Session.getEffectiveUser().getEmail(),
    "本週行程",
    lines.join("\n") || "本週沒有行程"
  );
}

觸發用 ScriptApp.newTrigger("mailWeekAgenda").timeBased().everyWeeks(1).onWeekDay(ScriptApp.WeekDay.MONDAY).atHour(8).create(),寫法見 觸發條件。建立事件的範例見 Gmail、Drive、日曆、表單

下一步:網路、介面與外部資料