GAS×Gmail連携|メール自動化の完全ガイド
毎日同じメールを手打ちしていると、地味に時間を食う。大量のメールから特定の情報だけ抜き出したい場面や、添付ファイルを1件ずつ保存する作業も、回数が増えるほどしんどくなる。
GAS(Google Apps Script)を使えば、Gmailの操作を丸ごと自動化できる。メール送信、取得、ラベル付け、添付ファイルの保存まで、すべてプログラムで制御可能だ。
目次
GAS×Gmail連携でできること
自動化できる操作一覧
| 操作 |
できること |
活用例 |
| メール送信 |
自動送信、一括送信 |
定型連絡、リマインダー |
| メール取得 |
条件検索、内容抽出 |
レポート作成、データ収集 |
| ラベル管理 |
自動振り分け、整理 |
受信トレイ整理 |
| 添付ファイル |
自動保存、処理 |
請求書管理、データ収集 |
| 下書き作成 |
テンプレート作成 |
承認後に送信 |
導入効果の例
| 作業 |
手動 |
自動化後 |
| 日次報告メール |
10分/日 |
0分(自動) |
| 請求書の添付ファイル保存 |
5分/件 |
自動 |
| 問い合わせメールの集計 |
30分/日 |
自動 |
GmailAppの基本メソッド一覧
メール送信系
| メソッド |
説明 |
主な引数 |
sendEmail() |
メール送信 |
to, subject, body, options |
createDraft() |
下書き作成 |
to, subject, body |
メール取得系
| メソッド |
説明 |
戻り値 |
search() |
検索条件でスレッド取得 |
GmailThread[] |
getInboxThreads() |
受信トレイのスレッド |
GmailThread[] |
getThreadById() |
ID指定でスレッド取得 |
GmailThread |
スレッド・メッセージ操作
| メソッド |
説明 |
getMessages() |
スレッド内のメッセージ取得 |
getSubject() |
件名取得 |
getFrom() |
送信者取得 |
getBody() |
本文取得(HTML) |
getPlainBody() |
本文取得(テキスト) |
getDate() |
受信日時取得 |
getAttachments() |
添付ファイル取得 |
ラベル操作
| メソッド |
説明 |
getUserLabelByName() |
ラベル取得 |
createLabel() |
ラベル作成 |
addLabel() |
スレッドにラベル追加 |
removeLabel() |
ラベル削除 |
実践例1: 条件に合うメールをスプレッドシートに記録
ユースケース
- 問い合わせメールを自動集計
- 特定の送信者からのメールを記録
- 日次のメール受信レポート作成
コード
/**
* 条件に合うメールをスプレッドシートに記録
*/
function logEmailsToSheet() {
// 検索条件(過去24時間の未読メール)
const searchQuery = 'is:unread newer_than:1d';
// スプレッドシート設定
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// メールを検索
const threads = GmailApp.search(searchQuery, 0, 50);
threads.forEach(thread => {
const messages = thread.getMessages();
const latestMessage = messages[messages.length - 1];
// データを取得
const date = Utilities.formatDate(
latestMessage.getDate(),
'Asia/Tokyo',
'yyyy-MM-dd HH:mm'
);
const from = latestMessage.getFrom();
const subject = latestMessage.getSubject();
const body = latestMessage.getPlainBody().substring(0, 200); // 先頭200文字
// スプレッドシートに追記
sheet.appendRow([date, from, subject, body]);
// 既読にする(オプション)
thread.markRead();
});
console.log(`${threads.length}件のメールを記録しました`);
}
検索クエリの例
| 目的 |
クエリ |
| 未読メール |
is:unread |
| 特定の送信者 |
from:example@gmail.com |
| 件名に含む |
subject:請求書 |
| 過去7日間 |
newer_than:7d |
| 添付ファイル付き |
has:attachment |
| 複合条件 |
from:boss@company.com is:unread |
実践例2: 定型メールの自動送信
ユースケース
- 毎日の日報リマインダー
- 月初の請求書送付
- 定期的なステータス報告
コード(基本版)
/**
* シンプルなメール送信
*/
function sendSimpleEmail() {
const to = 'recipient@example.com';
const subject = '【日報リマインダー】本日の日報を提出してください';
const body = `
お疲れ様です。
本日の日報提出をお願いいたします。
提出期限: 18:00
━━━━━━━━━━━━━━━━━
日報フォーム: https://example.com/form
━━━━━━━━━━━━━━━━━
`;
GmailApp.sendEmail(to, subject, body);
console.log('メールを送信しました');
}
コード(HTML形式 + CC/BCC)
/**
* HTML形式でメール送信(CC/BCC付き)
*/
function sendHtmlEmail() {
const to = 'main@example.com';
const subject = '【週次レポート】今週の進捗報告';
const htmlBody = `
<h2>週次進捗レポート</h2>
<p>今週の進捗をご報告いたします。</p>
<table border="1" style="border-collapse: collapse;">
<tr>
<th>タスク</th>
<th>進捗</th>
</tr>
<tr>
<td>機能開発A</td>
<td>完了</td>
</tr>
<tr>
<td>テスト</td>
<td>80%</td>
</tr>
</table>
<p>以上、よろしくお願いいたします。</p>
`;
const options = {
cc: 'manager@example.com',
bcc: 'archive@example.com',
htmlBody: htmlBody,
name: '自動送信システム'
};
GmailApp.sendEmail(to, subject, '', options);
}
コード(スプレッドシートから一括送信)
/**
* スプレッドシートの宛先リストに一括送信
*
* シート構成:
* A列: メールアドレス
* B列: 名前
* C列: 送信ステータス
*/
function sendBulkEmails() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const data = sheet.getDataRange().getValues();
const subject = '【ご案内】新サービスのお知らせ';
for (let i = 1; i < data.length; i++) { // 1行目はヘッダー
const email = data[i][0];
const name = data[i][1];
const status = data[i][2];
// 既に送信済みならスキップ
if (status === '送信済') continue;
const body = `
${name} 様
いつもお世話になっております。
新サービスのご案内をさせていただきます。
【詳細はこちら】
https://example.com/service
ご不明点がございましたらお気軽にお問い合わせください。
`;
try {
GmailApp.sendEmail(email, subject, body);
sheet.getRange(i + 1, 3).setValue('送信済');
} catch (e) {
sheet.getRange(i + 1, 3).setValue('エラー: ' + e.message);
}
// レート制限対策
Utilities.sleep(1000);
}
}
実践例3: メールの自動振り分け・ラベル付け
ユースケース
- 送信者別に自動分類
- 重要度別に振り分け
- プロジェクト別に整理
コード
/**
* メールを自動でラベル付けして振り分け
*/
function autoLabelEmails() {
// ラベル設定
const rules = [
{ query: 'from:boss@company.com', labelName: '上司' },
{ query: 'from:client@customer.com', labelName: '顧客' },
{ query: 'subject:請求書', labelName: '請求書' },
{ query: 'subject:緊急', labelName: '緊急対応' }
];
rules.forEach(rule => {
// ラベルを取得(なければ作成)
let label = GmailApp.getUserLabelByName(rule.labelName);
if (!label) {
label = GmailApp.createLabel(rule.labelName);
}
// 未読かつ条件に合うメールを検索
const threads = GmailApp.search(`${rule.query} is:unread`, 0, 20);
threads.forEach(thread => {
thread.addLabel(label);
console.log(`ラベル「${rule.labelName}」を追加: ${thread.getFirstMessageSubject()}`);
});
});
}
トリガー設定で完全自動化
/**
* 初回セットアップ: 10分ごとに自動実行
*/
function setupAutoLabelTrigger() {
// 既存のトリガーを削除
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(trigger => {
if (trigger.getHandlerFunction() === 'autoLabelEmails') {
ScriptApp.deleteTrigger(trigger);
}
});
// 新しいトリガーを作成
ScriptApp.newTrigger('autoLabelEmails')
.timeBased()
.everyMinutes(10)
.create();
console.log('トリガーを設定しました');
}
実践例4: 添付ファイルをGoogleドライブに自動保存
ユースケース
- 請求書PDFを自動保存
- レポートの添付ファイルを収集
- データファイルの自動バックアップ
コード
/**
* 添付ファイルをGoogleドライブに自動保存
*/
function saveAttachmentsToDrive() {
// 検索条件(添付ファイル付きの未処理メール)
const searchQuery = 'has:attachment label:未処理';
// 保存先フォルダ
const folderId = 'YOUR_FOLDER_ID'; // ドライブのフォルダIDを指定
const folder = DriveApp.getFolderById(folderId);
// ラベル
const unprocessedLabel = GmailApp.getUserLabelByName('未処理');
const processedLabel = GmailApp.getUserLabelByName('処理済') ||
GmailApp.createLabel('処理済');
const threads = GmailApp.search(searchQuery, 0, 10);
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
const attachments = message.getAttachments();
attachments.forEach(attachment => {
const fileName = attachment.getName();
const contentType = attachment.getContentType();
// PDFのみ保存する場合
if (contentType === 'application/pdf') {
// ファイル名に日付を追加(重複防止)
const date = Utilities.formatDate(
message.getDate(),
'Asia/Tokyo',
'yyyyMMdd'
);
const newFileName = `${date}_${fileName}`;
// ドライブに保存
folder.createFile(attachment.copyBlob().setName(newFileName));
console.log(`保存しました: ${newFileName}`);
}
});
});
// ラベルを更新
if (unprocessedLabel) thread.removeLabel(unprocessedLabel);
thread.addLabel(processedLabel);
});
}
フォルダIDの取得方法
- Googleドライブで対象フォルダを開く
- URLの末尾部分がフォルダID
– https://drive.google.com/drive/folders/【ここがID】
ChatGPT連携: メール文面の自動生成
ユースケース
- 問い合わせへの返信文生成
- 顧客情報に応じたパーソナライズメール
- 英語メールの自動翻訳・返信
コード
/**
* ChatGPTでメール返信文を生成
*/
function generateEmailReply(originalEmail) {
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
const prompt = `
以下のメールに対する丁寧な返信文を作成してください。
【受信メール】
${originalEmail}
【返信の条件】
- ビジネスメールとして適切な敬語
- 簡潔に要点を押さえる
- 必要に応じて確認事項を含める
`;
const payload = {
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: prompt }],
max_tokens: 500
};
const options = {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + apiKey },
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(
'https://api.openai.com/v1/chat/completions',
options
);
const data = JSON.parse(response.getContentText());
return data.choices[0].message.content;
}
/**
* 未読メールに対して返信下書きを自動作成
*/
function createReplyDrafts() {
const threads = GmailApp.search('is:unread label:要返信', 0, 5);
threads.forEach(thread => {
const messages = thread.getMessages();
const latestMessage = messages[messages.length - 1];
const originalEmail = `
件名: ${latestMessage.getSubject()}
送信者: ${latestMessage.getFrom()}
本文:
${latestMessage.getPlainBody()}
`;
// ChatGPTで返信文を生成
const replyBody = generateEmailReply(originalEmail);
// 下書きを作成
latestMessage.createDraftReply(replyBody);
console.log(`下書きを作成: ${latestMessage.getSubject()}`);
});
}
セキュリティ注意事項
1. 権限の確認
GAS×Gmailを使用すると、以下の権限が必要になる。
| 権限 |
内容 |
リスク |
| Gmail読み取り |
メール内容の取得 |
機密情報へのアクセス |
| Gmail送信 |
メール送信 |
なりすまし送信 |
| Gmail変更 |
ラベル、削除 |
意図しない削除 |
2. APIキーの管理
// ❌ NG: コードに直書き
const apiKey = 'sk-xxxxxxxxxxxx';
// ✅ OK: スクリプトプロパティに保存
const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
3. 送信制限
| アカウント種別 |
1日の送信上限 |
| 無料Gmail |
100件 |
| Google Workspace |
2,000件 |
// 送信前に残り枠を確認
const remaining = MailApp.getRemainingDailyQuota();
console.log(`残り送信可能数: ${remaining}`);
4. テスト時の注意
// 本番送信前にログで確認
function testSendEmail() {
const to = 'test@example.com';
const subject = 'テスト';
const body = '本文';
// 実際には送信せず、ログに出力
console.log(`To: ${to}`);
console.log(`Subject: ${subject}`);
console.log(`Body: ${body}`);
// GmailApp.sendEmail(to, subject, body); // コメントアウト
}
まとめ
GAS×Gmail連携でできること
| 機能 |
メソッド |
活用例 |
| メール送信 |
sendEmail() |
リマインダー、一括送信 |
| メール取得 |
search() |
レポート作成、データ収集 |
| ラベル管理 |
addLabel() |
自動振り分け |
| 添付ファイル |
getAttachments() |
自動保存 |
このガイドのコードでできること
- 条件に合うメールをスプレッドシートに自動記録
- 定型メール・一括メールの自動送信
- ルールベースの自動ラベル付け
- 添付ファイルのGoogleドライブ自動保存
- ChatGPT連携で返信文を自動生成
次のステップ
コメント