メールテンプレートを使ったGmail自動返信システム

GASGmail自動返信
メールテンプレートを使ったGmail自動返信システムのサムネイル

みなさん、こんにちは!GASおじです。今日は「メールテンプレートを活用したGmail自動返信システム」の作り方について解説していくよ。特に中小企業の経営者やフリーランスの方に役立つ内容だ。おじさんがGASの達人目線で、コスト削減も意識しつつ丁寧に説明するから安心して読み進めてほしい。


Gmailの自動返信は便利だけど、テンプレート管理やデータの安全性、運用コストが気になるところ。SaaSの専用ツールを導入すると、月額費用がかかるし、使い放題を謳うけどGoogleアカウントの利用枠はちゃんと限られている。そこでGoogle Apps Script(以下GAS)を使って、無料の範囲内で安全に運用できる自動返信システムを作ろう。


自動返信システムの概要と初期設定

今回作るのは、指定のGmailラベルに届いたメールに対して、内容に応じたメールテンプレートで自動返信するスクリプトだ。テンプレートはGoogleスプレッドシートで管理し、返信履歴は新規作成のスプレッドシートに書き込むから既存データは絶対に壊さない。データのバックアップとロールバックの考え方も組み込むので安心だ。

初期設定

  1. Googleスプレッドシートを用意し、「テンプレート」シートを作成。

    • A列:テンプレート名
    • B列:メール件名(変数も対応可)
    • C列:メール本文(プレーンテキストまたは簡単な変数埋め込み)
  2. Gmail側で自動返信対象のメールに「AutoReply」というラベルを付ける。

  3. Google Apps Scriptのプロジェクトを作成し、Gmail APIとスプレッドシートAPIの権限を付与する。

  4. インストール型トリガー(時間主導型)を設定し、15分〜30分毎に自動実行する。


必要な権限と個人情報の取扱いについて

  • Gmail API読み取り・送信権限
  • スプレッドシート読み書き権限
  • 個人情報(メールアドレス・メール本文)は外部に送信されず、Googleのクラウド内で処理される。
  • スクリプトはGoogleアカウントの利用枠内で動作し、追加のSaaS料金は発生しない。

コード例:テンプレートを使ったGmail自動返信

以下はテンプレートに基づいて返信し、処理済みのメールIDを記録、新規スプレッドシートにログを書き出す例だ。既存シートのデータやメールは破壊しない設計だよ。

function autoReplyWithTemplates() {
  const labelName = 'AutoReply';
  const templateSheetId = 'テンプレート管理用スプレッドシートIDをここに';
  const logFolderId = 'ログ用フォルダのGoogleドライブIDをここに';

  // ① テンプレート取得
  const templateSs = SpreadsheetApp.openById(templateSheetId);
  const templateSheet = templateSs.getSheetByName('テンプレート');
  const templates = templateSheet.getRange(2, 1, templateSheet.getLastRow()-1, 3).getValues();

  // ② 処理済みメールID管理用プロパティ
  const scriptProps = PropertiesService.getScriptProperties();
  let processedIds = scriptProps.getProperty('processedMessageIds');
  processedIds = processedIds ? JSON.parse(processedIds) : [];

  // ③ AutoReplyラベルのメール取得(最大100件)
  const label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    Logger.log(`ラベル「${labelName}」が見つかりません。`);
    return;
  }
  const threads = label.getThreads(0, 100);

  let newProcessedIds = [];
  let logs = [];

  threads.forEach(thread => {
    const messages = thread.getMessages();
    messages.forEach(message => {
      const msgId = message.getId();
      if (processedIds.indexOf(msgId) !== -1) {
        // 既に処理済み
        return;
      }

      const subject = message.getSubject();
      const from = message.getFrom();
      const body = message.getPlainBody();

      // 簡単なテンプレート選定例:件名にテンプレート名が含まれていれば使用
      const matchedTemplate = templates.find(row => subject.includes(row[0]));
      if (!matchedTemplate) {
        Logger.log(`テンプレートが見つかりません(件名: ${subject})`);
        return;
      }

      // 変数埋め込み(例: {{name}}を差出人名で置換)
      const senderName = from.match(/"?([^"<@]+)"?\s*<.+>/);
      const name = senderName ? senderName[1] : "お客様";

      const mailSubject = matchedTemplate[1].replace(/{{name}}/g, name);
      const mailBody = matchedTemplate[2].replace(/{{name}}/g, name);

      try {
        // メール返信
        GmailApp.sendEmail(from, mailSubject, mailBody);

        // ログ記録用データ作成
        logs.push([new Date(), msgId, from, subject, matchedTemplate[0]]);

        // 処理済みID追加
        newProcessedIds.push(msgId);
      } catch(e) {
        Logger.log(`メール送信失敗: ${e.message}`);
      }
    });
  });

  // ④ 処理済みID更新(batch write)
  const updatedProcessedIds = processedIds.concat(newProcessedIds);
  scriptProps.setProperty('processedMessageIds', JSON.stringify(updatedProcessedIds));

  // ⑤ ログ書き込み(日時付き新規スプレッドシート作成)
  if (logs.length > 0) {
    const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
    const logSsName = `AutoReplyログ_${timestamp}`;
    const logSs = SpreadsheetApp.create(logSsName);
    const logSheet = logSs.getActiveSheet();
    logSheet.appendRow(['日時','メッセージID','送信元','元件名','使用テンプレート']);
    logSheet.getRange(2,1,logs.length, logs[0].length).setValues(logs);

    // ログファイルを専用フォルダに移動
    const file = DriveApp.getFileById(logSs.getId());
    const folder = DriveApp.getFolderById(logFolderId);
    folder.addFile(file);
    DriveApp.getRootFolder().removeFile(file);
  }
}

ポイント解説

  • 既存データを破壊しない:処理済みメールIDはScript PropertiesにJSONで保管し、ログは新規スプレッドシートに書き出し。既存テンプレートシートも変更しない。
  • 入力検証:テンプレートが見つからなければ処理をスキップする。
  • batch write:ログは一括書き込みし、処理済みIDもまとめて更新している。
  • バックアップ・復元:ログは別ファイルで保管されるから、過去の返信記録を辿れる。
  • トリガー設定:installable triggerで定期実行する想定。

具体的なコスト削減額の仮定と計算

例えば、外注やSaaSの自動返信ツールを月額5,000円払っているとしよう。
このGAS自動返信システムはGoogleアカウントの無料利用枠内(Apps ScriptのquotaやGmail送信上限はあるが通常の中小企業利用なら十分)で動作するから、専用SaaS料金はゼロ。

  • SaaS料金: 5,000円/月 × 12ヶ月 = 60,000円/年
  • GAS利用料: 0円(Googleアカウントの利用枠内)

年間のコスト削減額は理論上60,000円。
ただし、GASにも実行時間や1日あたりのメール送信制限(最大約1,500通/ユーザー)があるので、規模に応じた運用は必要だ。


installable triggerの設定と復元手順

  1. スクリプトエディタのメニュー → 「編集」→「現在のプロジェクトのトリガー」
  2. 「トリガーを追加」ボタンを押す
  3. 関数名: autoReplyWithTemplates
  4. イベントの種類: 時間主導型
  5. 時間ベースのトリガーのタイプ: 分ベースのタイマー(15分おきなど)
  6. 保存

復元手順は、バックアップログファイルのスプレッドシートを参照し、必要に応じて手動でメール送信履歴や返信内容を確認できる。処理済みIDはScript Propertiesなので、スクリプトエディタの「プロパティサービス」からも管理可能。


まとめ

  • Gmailの自動返信はテンプレート管理と安全なデータ運用がカギ
  • 既存データを破壊しない設計でトラブル防止
  • Googleアカウントの利用枠内で運用できるため追加のSaaS料金不要
  • インストール型トリガーで安定運用可能
  • ログ管理を別ファイルにすることでバックアップ・ロールバックも安心

これで中小企業やフリーランスの皆さんも、コストを抑えつつ効率的なメール対応ができるはず。おじさんもGASで賢く仕事を減らしていこう!


GASおじラボで500ツール使い放題 →