はじめに
「毎日届く定型メールの処理に時間を取られている」
「添付ファイルを手動でドライブに保存している」
「同じような返信を毎回書いている」
こうしたメール業務は、GAS(Google Apps Script)で自動化できます。この記事では、GmailApp を使った実用的な自動化パターンを4つ紹介します。
すべてコピペで動くコード付きです。
前提
- Googleアカウントがあること
- Apps Scriptの基本操作(スクリプト作成・トリガー設定)ができること
トリガーの設定方法が分からない場合は、GASのトリガー完全ガイドを先に読むとスムーズです。
基本:メールを検索する
Gmail自動化の起点は「対象メールを検索して取得する」ことです。
/**
* 条件に合うメールを検索する
*/
function searchMails() {
// Gmailの検索窓と同じ構文が使える
const threads = GmailApp.search('from:info@example.com is:unread', 0, 50);
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
console.log('件名: ' + message.getSubject());
console.log('差出人: ' + message.getFrom());
console.log('本文: ' + message.getPlainBody().substring(0, 100));
});
});
}
よく使う検索演算子
| 演算子 | 意味 |
|---|---|
from:xxx@example.com |
特定の差出人から |
subject:請求書 |
件名に「請求書」を含む |
is:unread |
未読のみ |
has:attachment |
添付ファイルあり |
newer_than:1d |
過去1日以内 |
label:重要 |
特定ラベルが付いている |
-label:処理済み |
特定ラベルが付いていない(除外) |
複数条件はスペースでつなぐとAND検索になります。
① 条件に応じてラベルを自動で振り分ける
Gmailの標準フィルタでも可能ですが、GASなら本文の内容による複雑な判定ができます。
/**
* 未読メールを内容に応じてラベル分けする
* ※ 時間主導型トリガー(30分おきなど)で実行
*/
function autoLabel() {
const threads = GmailApp.search('is:unread -label:処理済み', 0, 50);
// ラベルを取得(なければ作成)
const labelUrgent = getOrCreateLabel('要対応');
const labelInvoice = getOrCreateLabel('請求関連');
const labelDone = getOrCreateLabel('処理済み');
threads.forEach(thread => {
const message = thread.getMessages()[0];
const subject = message.getSubject();
const body = message.getPlainBody();
// 件名・本文のキーワードで判定
if (subject.includes('至急') || body.includes('緊急')) {
thread.addLabel(labelUrgent);
} else if (subject.includes('請求') || subject.includes('見積')) {
thread.addLabel(labelInvoice);
}
thread.addLabel(labelDone); // 処理済みマーク
});
}
/** ラベルを取得(存在しなければ作成) */
function getOrCreateLabel(name) {
return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}
ポイント:
-label:処理済みで除外し、処理後に「処理済み」ラベルを付けることで、同じメールを二重処理しない仕組みにしています。
② 添付ファイルを自動でGoogleドライブに保存する
請求書や納品書などを毎回手動で保存している場合、これで完全自動化できます。
/**
* 添付ファイル付きメールをドライブに自動保存する
* ※ 時間主導型トリガーで実行
*/
function saveAttachments() {
const FOLDER_ID = 'ここにドライブのフォルダID'; // ★ 保存先フォルダ
const folder = DriveApp.getFolderById(FOLDER_ID);
const threads = GmailApp.search('has:attachment -label:保存済み newer_than:7d', 0, 30);
const labelSaved = getOrCreateLabel('保存済み');
threads.forEach(thread => {
thread.getMessages().forEach(message => {
const attachments = message.getAttachments();
attachments.forEach(attachment => {
// PDFのみ保存する例
if (attachment.getContentType() !== 'application/pdf') return;
// ファイル名に受信日を付けて保存
const date = Utilities.formatDate(message.getDate(), 'Asia/Tokyo', 'yyyyMMdd');
const fileName = `${date}_${attachment.getName()}`;
folder.createFile(attachment.copyBlob()).setName(fileName);
console.log('保存: ' + fileName);
});
});
thread.addLabel(labelSaved);
});
}
フォルダIDの調べ方:Googleドライブでフォルダを開いたときのURL
https://drive.google.com/drive/folders/【この部分がフォルダID】
③ 定型メールに自動返信する
問い合わせに対する一次返信を自動化する例です。
/**
* 特定の条件のメールに自動返信する
* ※ 時間主導型トリガーで実行
*/
function autoReply() {
const threads = GmailApp.search('to:info@example.com is:unread -label:返信済み', 0, 20);
const labelReplied = getOrCreateLabel('返信済み');
threads.forEach(thread => {
const message = thread.getMessages()[0];
const senderName = extractName(message.getFrom());
const replyBody = `
${senderName} 様
お問い合わせいただきありがとうございます。
内容を確認のうえ、1〜3営業日以内に担当者よりご連絡いたします。
今しばらくお待ちくださいますようお願いいたします。
──────────────
株式会社サンプル
info@example.com
──────────────
`.trim();
thread.reply(replyBody);
thread.addLabel(labelReplied);
});
}
/** "山田太郎 <yamada@x.com>" から名前だけ取り出す */
function extractName(from) {
const match = from.match(/^(.+?)\s*</);
return match ? match[1].replace(/"/g, '') : from;
}
注意: 自動返信は誤爆すると相手に迷惑がかかります。検索条件を十分に絞り込み、必ずテスト用アドレスで動作確認してから本番運用してください。
④ メール内容をスプレッドシートに記録する
受注メールや問い合わせを一覧化して管理したい場合に使えます。
/**
* 対象メールの情報をスプレッドシートに記録する
* ※ 時間主導型トリガーで実行
*/
function logMailsToSheet() {
const SHEET_ID = 'ここにスプレッドシートのID'; // ★
const sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('メールログ');
const threads = GmailApp.search('subject:お問い合わせ -label:記録済み', 0, 50);
const labelLogged = getOrCreateLabel('記録済み');
threads.forEach(thread => {
const message = thread.getMessages()[0];
sheet.appendRow([
message.getDate(), // 受信日時
message.getFrom(), // 差出人
message.getSubject(), // 件名
message.getPlainBody().substring(0, 500), // 本文(500文字まで)
thread.getPermalink(), // メールへのリンク
]);
thread.addLabel(labelLogged);
});
}
getPermalink() でメールへの直リンクを記録しておくと、スプレッドシートから該当メールにすぐ飛べて便利です。
実行制限に注意
GASのGmail操作には1日あたりの上限があります(無料アカウントの目安)。
| 操作 | 1日の上限 |
|---|---|
| メール送信 | 100通 |
| メール読み取り | 20,000通 |
| スクリプト実行時間 | 90分 |
大量処理をする場合は、GmailApp.search() の第3引数(取得件数)を絞り、複数回のトリガー実行に分割する設計にします。
まとめ
GASを使ったGmail自動化の基本パターンは以下の4つです。
- ラベル自動振り分け:内容による複雑な条件分岐ができる
- 添付ファイル自動保存:ドライブへの保存を完全自動化
- 自動返信:一次対応のスピードを上げる
- スプレッドシート記録:メール内容を一覧管理・集計可能に
共通のコツは、「処理済みラベル」を付けて二重処理を防ぐことです。この設計にしておけば、トリガーで定期実行しても安全に運用できます。
メール業務の自動化のご相談
「自社のメール処理フローを自動化したい」「他システムとも連携させたい」などのご相談を受け付けています。