ChatGPTとGmailを連携して自動返信メールを作る方法

目次

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>")
    });
  });
}

④ トリガー設定(完全自動化)

  1. GAS左の「時計(トリガー)」→「トリガーを追加」
  2. 関数:autoReplyWithChatGPT(または autoDraftWithFilters
  3. イベントのソース:「時間主導型」/実行間隔:5〜15分など
  4. 初回は権限承認 → 完了

まずは ドラフト作成で数日運用し、問題がなければ自動返信に切り替えるのがおすすめです。

⑤ 運用のコツ(品質と安全)

  • 検索クエリを最適化:例)in:inbox is:unread -from:noreply -{特定ドメイン} newer_than:2d
  • 上限を設定:1回の実行で10通程度に制限し、誤送信リスクを低減
  • 署名/定型句:フッターに「自動応答のため詳細確認後に追ってご連絡します」を明記
  • 個人情報の扱い:本文を丸ごと外部に送らないポリシー運用が必要な場合は、要約前処理でマスキング
  • ログ確認:Logger.log() と実行ログで失敗原因を特定

まとめ

ChatGPTとGmailをGASでつなぐことで、受信→要約→一次返信の自動化が実現します。ドラフト運用から始めて品質を固めれば、問い合わせ初動を秒で返せる体制に。業務の「待ち時間」をなくし、対応の質とスピードを両立できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次