目次
Contents
ChatGPTとGmailを連携して自動返信メールを作る方法【GASで完全自動化】
受信メールへの一次返信を自動化できると、問い合わせ対応の初動が劇的に速くなります。この記事では ChatGPT × Google Apps Script(GAS) × Gmail を組み合わせ、未読メールをAIが要約→返信文を生成→自動返信する仕組みを作ります。
できること
- Gmailの未読メールを検索(例:
in:inbox is:unread) - 本文をChatGPTに渡して、ていねいな初回返信文を自動生成
- スレッドに自動返信(引用返信)&「AI返信済み」ラベル付け
- 時間トリガーで定期実行(例:5分/15分/毎時)
① 事前準備(APIキー&ラベル)
- OpenAIの APIキー を取得
- Gmailにラベル
AI返信済みを作成 - GAS(スプレッドシート → 拡張機能 → Apps Script)を開く
- GASの「設定 → プロジェクトのプロパティ → スクリプトのプロパティ」に以下を保存
└
OPENAI_API_KEY(ChatGPTのAPIキー) └GMAIL_QUERY(Gmail検索クエリ。例:in:inbox is:unread -category:promotions)
② コード(基本版:未読を拾ってAIで返信)
/**
* ChatGPTで返信文を生成してGmailに自動返信(基本版)
* - 検索クエリはスクリプトプロパティ GMAIL_QUERY を使用
* - 返信後に「AI返信済み」ラベルを付与
*/
function autoReplyWithChatGPT() {
const PROP = PropertiesService.getScriptProperties();
const OPENAI = PROP.getProperty("OPENAI_API_KEY");
const QUERY = PROP.getProperty("GMAIL_QUERY") || "in:inbox is:unread";
// 対象スレッドを取得(上限は必要に応じて)
const threads = GmailApp.search(QUERY, 0, 10);
if (!threads.length) return;
const label = getOrCreateLabel_("AI返信済み");
threads.forEach(thread => {
// 既に返信済みならスキップ
if (thread.hasLabel(label)) return;
const msg = thread.getMessages().pop(); // 最新メッセージ
const from = msg.getFrom();
const subject = msg.getSubject();
const plain = msg.getPlainBody().slice(0, 8000); // 安全のため長文を制限
// 返信文をChatGPTに依頼
const replyText = generateReply_(OPENAI, subject, plain);
// Gmailへ返信(引用返信/HTML可)
thread.reply(replyText, {
htmlBody: replyText.replace(/\n/g,"<br>"),
name: "サポート窓口(自動応答)"
});
// ラベル付与・既読化(任意)
thread.addLabel(label);
thread.markRead();
Utilities.sleep(500); // 連投抑制
});
}
/** OpenAI Chat Completionsで返信文を生成 */
function generateReply_(apiKey, subject, body) {
const url = "https://api.openai.com/v1/chat/completions";
const prompt = [
"あなたは日本語のカスタマーサポート担当です。",
"以下のメール件名と本文を読み、",
"1) 受領の御礼 2) 要点の要約 3) 対応方針/次のアクション 4) 返信不要の注意 を含む丁寧な返信文を300〜500字で作成してください。",
"絵文字や過剰な装飾は不要。会社名は出さず、一般的な文面にしてください。",
"",
"件名:" + subject,
"本文:",
body
].join("\n");
const payload = {
model: "gpt-4o-mini",
messages: [{ role: "user", content: prompt }],
temperature: 0.4,
max_tokens: 700
};
const res = UrlFetchApp.fetch(url, {
method: "post",
headers: { Authorization: "Bearer " + apiKey },
contentType: "application/json",
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
const json = JSON.parse(res.getContentText());
const text = (json.choices && json.choices[0].message.content) || "(AIでの返信文生成に失敗しました)";
return text.trim();
}
/** ラベル取得/作成 */
function getOrCreateLabel_(name) {
return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}
この基本版は、未読メールを検索 → ChatGPTで返信文を生成 → スレッドに返信 → ラベル付与 までを自動化します。
③ 応用(NGワード/差し戻し・ホワイトリスト・ドラフト化)
そのまま自動送信が不安な場合は、ドラフト作成のみにして人の最終確認を挟む運用が安全です。また、迷惑・広告・メーリングリストなどを除外するフィルタを入れましょう。
function autoDraftWithFilters() {
const PROP = PropertiesService.getScriptProperties();
const OPENAI = PROP.getProperty("OPENAI_API_KEY");
const BASE = "in:inbox is:unread -category:promotions -category:social -from:noreply";
const threads = GmailApp.search(BASE, 0, 10);
const NG = ["広告", "セール", "懸賞"]; // 本文に含まれていたらスキップ
const ALLOW_FROM = ["@example.co.jp", "@partner.jp"]; // 送り主の許可ドメイン
threads.forEach(th => {
const msg = th.getMessages().pop();
const from = msg.getFrom();
if (!ALLOW_FROM.some(d => from.includes(d))) return; // 許可ドメインのみ
const text = msg.getPlainBody();
if (NG.some(w => text.includes(w))) return;
const reply = generateReply_(OPENAI, msg.getSubject(), text);
// 下書きに保存(自動送信しない)
GmailApp.createDraft(msg.getFrom(), "Re: " + msg.getSubject(), reply, {
htmlBody: reply.replace(/\n/g,"<br>")
});
});
}
④ トリガー設定(完全自動化)
- GAS左の「時計(トリガー)」→「トリガーを追加」
- 関数:
autoReplyWithChatGPT(またはautoDraftWithFilters) - イベントのソース:「時間主導型」/実行間隔:5〜15分など
- 初回は権限承認 → 完了
まずは ドラフト作成で数日運用し、問題がなければ自動返信に切り替えるのがおすすめです。
⑤ 運用のコツ(品質と安全)
- 検索クエリを最適化:例)
in:inbox is:unread -from:noreply -{特定ドメイン} newer_than:2d - 上限を設定:1回の実行で10通程度に制限し、誤送信リスクを低減
- 署名/定型句:フッターに「自動応答のため詳細確認後に追ってご連絡します」を明記
- 個人情報の扱い:本文を丸ごと外部に送らないポリシー運用が必要な場合は、要約前処理でマスキング
- ログ確認:
Logger.log()と実行ログで失敗原因を特定
まとめ
ChatGPTとGmailをGASでつなぐことで、受信→要約→一次返信の自動化が実現します。ドラフト運用から始めて品質を固めれば、問い合わせ初動を秒で返せる体制に。業務の「待ち時間」をなくし、対応の質とスピードを両立できます。
