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、日曆、表單。
下一步:網路、介面與外部資料。