MENU

【初心者向け】GAS×ChatGPTで自動メール返信Botを作ろう

【初心者向け】GAS×ChatGPTで自動メール返信Botを作ろう

「お問い合わせへの返信が大変…」「もっと早く対応したい」

そんな悩みを解決する自動メール返信Botを、Google Apps Script(GAS)とChatGPT APIで作ってみましょう。

本記事では、プログラミング初心者でも30分で完成できるよう、すべての手順をスクリーンショットなしでも分かるレベルで丁寧に解説します。

目次

完成イメージ

このチュートリアルで作成するBotの動作フローです:


1. ユーザーがGoogleフォームからお問い合わせを送信
        ↓
2. スプレッドシートに自動記録
        ↓
3. GASが起動し、ChatGPT APIに問い合わせ内容を送信
        ↓
4. ChatGPTが返信文を生成
        ↓
5. 生成された返信文をメールで自動送信
        ↓
6. スプレッドシートに「返信済み」を記録

何ができるようになるか

  • お問い合わせを受けた数秒以内に自動返信
  • ChatGPTが内容に応じた適切な返信文を生成
  • 24時間365日対応可能
  • 対応履歴がスプレッドシートに自動記録

事前準備

必要なもの

  • Googleアカウント(無料)
  • OpenAI APIキー(従量課金、月数百円程度〜)
  • 30分程度の時間

OpenAI APIキーの取得

まだAPIキーを持っていない方は、以下の手順で取得してください。

STEP 1: OpenAIにアカウント登録

  • OpenAI Platform にアクセス
  • 「Sign up」をクリック
  • メールアドレスまたはGoogleアカウントで登録
  • 電話番号認証を完了

STEP 2: APIキーを作成

  • ログイン後、右上のアイコン → 「API keys」をクリック
  • 「Create new secret key」をクリック
  • 名前を入力(例: gas-bot
  • 「Create secret key」をクリック
  • 表示されたキーをコピーして安全な場所に保存

重要: APIキーは一度しか表示されません。必ずコピーして保存してください。

STEP 3: 支払い方法を設定

  • 左メニュー「Settings」→「Billing」
  • 「Add payment method」でクレジットカードを登録
  • 初回は$5相当の無料クレジットが付与されます

STEP 1: Googleフォームを作成

1-1: フォームの新規作成

  • Google Forms にアクセス
  • 「空白」をクリックして新規フォーム作成
  • フォームタイトルを入力: 「お問い合わせフォーム」

1-2: 質問項目を追加

以下の4つの質問を追加します:

質問 形式 必須
お名前 記述式(短文)
メールアドレス 記述式(短文)
お問い合わせ種別 ラジオボタン
お問い合わせ内容 段落(長文)

お問い合わせ種別の選択肢例:

  • サービスについて
  • 料金について
  • 技術的な質問
  • その他

1-3: スプレッドシートと連携

  • フォーム上部の「回答」タブをクリック
  • スプレッドシートアイコン(緑)をクリック
  • 「新しいスプレッドシートを作成」を選択
  • 名前を入力: 「お問い合わせ管理」
  • 「作成」をクリック

これで、フォームの回答がスプレッドシートに自動記録されるようになりました。


STEP 2: スプレッドシートを準備

2-1: スプレッドシートを開く

先ほど作成したスプレッドシート「お問い合わせ管理」を開きます。

2-2: 列を追加

フォームの回答列(A〜E列)の右に、以下の列を追加します:

項目名
F 返信ステータス
G 返信文
H 返信日時

1行目(ヘッダー行)のF1、G1、H1セルにそれぞれ入力してください。

2-3: シート名を確認

シート名が「フォームの回答 1」になっていることを確認します。

(後でコードで使用するため、変更した場合はコードも修正が必要です)


STEP 3: GASスクリプトを作成

3-1: スクリプトエディタを開く

  • スプレッドシートのメニュー「拡張機能」→「Apps Script」をクリック
  • 新しいタブでスクリプトエディタが開きます
  • プロジェクト名を「お問い合わせBot」に変更

3-2: コードを入力

デフォルトの function myFunction() {} を削除し、以下のコードを全てコピー&ペーストしてください。


/**
 * お問い合わせ自動返信Bot
 * GAS × ChatGPT API
 */

// ========================================
// 設定値(必要に応じて変更してください)
// ========================================
const CONFIG = {
  SHEET_NAME: 'フォームの回答 1',  // シート名
  COMPANY_NAME: 'SkillUp Labs',     // 会社名(返信文に使用)
  SENDER_NAME: 'サポートチーム',    // 送信者名
  CHATGPT_MODEL: 'gpt-4o-mini',     // 使用するモデル
  MAX_TOKENS: 1500,                  // 最大トークン数
  TEMPERATURE: 0.7                   // 生成の多様性(0.0〜1.0)
};

// ========================================
// メイン処理: フォーム送信時に実行
// ========================================
function onFormSubmit(e) {
  try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(CONFIG.SHEET_NAME);
    const lastRow = sheet.getLastRow();

    // フォームデータを取得
    const timestamp = sheet.getRange(lastRow, 1).getValue();
    const name = sheet.getRange(lastRow, 2).getValue();
    const email = sheet.getRange(lastRow, 3).getValue();
    const category = sheet.getRange(lastRow, 4).getValue();
    const content = sheet.getRange(lastRow, 5).getValue();

    // ChatGPTで返信文を生成
    const replyText = generateReplyWithChatGPT(name, category, content);

    // メールを送信
    sendReplyEmail(email, name, category, replyText);

    // スプレッドシートに記録
    sheet.getRange(lastRow, 6).setValue('返信済み');
    sheet.getRange(lastRow, 7).setValue(replyText);
    sheet.getRange(lastRow, 8).setValue(new Date());

    console.log(`返信完了: ${email}`);

  } catch (error) {
    console.error('エラーが発生しました:', error);
    // エラー通知(任意)
    notifyError(error);
  }
}

// ========================================
// ChatGPT APIで返信文を生成
// ========================================
function generateReplyWithChatGPT(customerName, category, inquiryContent) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');

  if (!apiKey) {
    throw new Error('APIキーが設定されていません。スクリプトプロパティを確認してください。');
  }

  const prompt = `あなたは${CONFIG.COMPANY_NAME}のカスタマーサポート担当です。
以下のお問い合わせに対する返信メールの本文を作成してください。

【お客様名】
${customerName} 様

【お問い合わせ種別】
${category}

【お問い合わせ内容】
${inquiryContent}

【返信作成のルール】
1. 丁寧で温かみのある文章にする
2. お問い合わせへのお礼から始める
3. 質問に対する具体的な回答を含める
4. 不明点があれば確認の文言を入れる
5. 締めの挨拶で終わる
6. 署名は不要(システムで自動付与)
7. 300〜500文字程度

返信本文のみを出力してください。`;

  const url = 'https://api.openai.com/v1/chat/completions';

  const payload = {
    model: CONFIG.CHATGPT_MODEL,
    messages: [
      {
        role: 'system',
        content: 'あなたは丁寧で親切なカスタマーサポート担当者です。'
      },
      {
        role: 'user',
        content: prompt
      }
    ],
    max_tokens: CONFIG.MAX_TOKENS,
    temperature: CONFIG.TEMPERATURE
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      'Authorization': 'Bearer ' + apiKey
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const responseCode = response.getResponseCode();

  if (responseCode !== 200) {
    throw new Error(`ChatGPT API エラー: ${responseCode} - ${response.getContentText()}`);
  }

  const json = JSON.parse(response.getContentText());
  return json.choices[0].message.content.trim();
}

// ========================================
// メール送信
// ========================================
function sendReplyEmail(toEmail, customerName, category, replyBody) {
  const subject = `【${CONFIG.COMPANY_NAME}】お問い合わせありがとうございます(${category})`;

  const body = `${customerName} 様

${replyBody}

────────────────────────
${CONFIG.COMPANY_NAME}
${CONFIG.SENDER_NAME}
────────────────────────

※このメールは自動送信されています。
ご不明点がございましたら、このメールに返信してください。`;

  GmailApp.sendEmail(toEmail, subject, body);
}

// ========================================
// エラー通知(任意)
// ========================================
function notifyError(error) {
  const adminEmail = Session.getActiveUser().getEmail();
  const subject = '【エラー通知】お問い合わせBot';
  const body = `エラーが発生しました。\n\n${error.toString()}\n\n時刻: ${new Date()}`;

  GmailApp.sendEmail(adminEmail, subject, body);
}

// ========================================
// 手動テスト用
// ========================================
function testGenerateReply() {
  const testReply = generateReplyWithChatGPT(
    'テスト太郎',
    'サービスについて',
    'サービスの料金体系について教えてください。月額プランはありますか?'
  );
  console.log('生成された返信文:\n' + testReply);
}

// ========================================
// APIキー設定の確認用
// ========================================
function checkApiKey() {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OPENAI_API_KEY');
  if (apiKey) {
    console.log('APIキーは設定されています(先頭5文字: ' + apiKey.substring(0, 5) + '...)');
  } else {
    console.log('APIキーが設定されていません。');
  }
}

3-3: コードを保存

  • キーボード: Ctrl + S(Mac: Cmd + S
  • または: ツールバーのフロッピーディスクアイコン

STEP 4: APIキーを設定

APIキーをコードに直接書くのはセキュリティ上NGです。スクリプトプロパティに保存します。

4-1: スクリプトプロパティを開く

  • 左メニューの歯車アイコン「プロジェクトの設定」をクリック
  • 下にスクロールして「スクリプトプロパティ」セクションを見つける
  • 「スクリプトプロパティを追加」をクリック

4-2: APIキーを登録

プロパティ
OPENAI_API_KEY sk-xxxxxxxxxxxxx(あなたのAPIキー)
  • 「プロパティ」に OPENAI_API_KEY と入力
  • 「値」に取得したAPIキーを貼り付け
  • 「スクリプトプロパティを保存」をクリック

STEP 5: 動作テスト

5-1: APIキーの確認

  • スクリプトエディタに戻る
  • 関数選択ドロップダウンで checkApiKey を選択
  • 「実行」ボタンをクリック
  • 初回は権限の承認が求められます

– 「権限を確認」→ Googleアカウントを選択

– 「詳細」→「〇〇(安全ではないページ)に移動」

– 「許可」をクリック

  • 「APIキーは設定されています」と表示されれば成功

5-2: 返信生成のテスト

  • 関数選択で testGenerateReply を選択
  • 「実行」をクリック
  • 下部の「実行ログ」に返信文が表示されれば成功

出力例:


生成された返信文:
テスト太郎様

この度は弊社サービスについてお問い合わせいただき、誠にありがとうございます。

料金体系についてご案内いたします。
弊社では月額プランをご用意しており、...

STEP 6: トリガーを設定

フォーム送信時に自動でスクリプトが実行されるよう、トリガーを設定します。

6-1: トリガーの追加

  • 左メニューの時計アイコン「トリガー」をクリック
  • 右下の「トリガーを追加」をクリック

6-2: トリガーの設定

以下のように設定します:

項目 設定値
実行する関数 onFormSubmit
実行するデプロイ Head
イベントのソース スプレッドシートから
イベントの種類 フォーム送信時
エラー通知設定 毎日通知を受け取る

設定後「保存」をクリック。


STEP 7: 本番テスト

7-1: フォームを開く

  • Googleフォームを開く
  • 右上の「プレビュー」(目のアイコン)をクリック

7-2: テスト送信

以下のようなテストデータを入力して送信:

  • お名前: テスト花子
  • メールアドレス: (自分のメールアドレス)
  • お問い合わせ種別: サービスについて
  • お問い合わせ内容: サービスの無料トライアルはありますか?期間と制限を教えてください。

7-3: 結果確認

  • メール: 入力したアドレスに自動返信メールが届く
  • スプレッドシート:

– F列: 「返信済み」

– G列: 生成された返信文

– H列: 返信日時


カスタマイズのヒント

返信文のトーンを変更

CONFIGオブジェクトのTEMPERATUREを調整:

  • 0.3〜0.5: フォーマルで一貫性のある返信
  • 0.7〜0.8: 自然で多様な返信
  • 0.9以上: クリエイティブだが、ばらつきが大きい

会社情報を変更


const CONFIG = {
  COMPANY_NAME: 'あなたの会社名',
  SENDER_NAME: 'カスタマーサポート',
  // ...
};

返信ルールをカスタマイズ

generateReplyWithChatGPT関数内のプロンプトを編集:


const prompt = `あなたは...
【返信作成のルール】
1. カジュアルな文体で(「ですます」調)
2. 絵文字を1〜2個使用
3. ...
`;

トラブルシューティング

エラー: APIキーが設定されていません

原因: スクリプトプロパティの設定ミス

対処:

  • プロジェクトの設定を再確認
  • プロパティ名が正確に OPENAI_API_KEY か確認(大文字・小文字注意)
  • APIキーに余分なスペースが入っていないか確認

エラー: ChatGPT API エラー: 401

原因: APIキーが無効

対処:

  • OpenAIプラットフォームで新しいAPIキーを発行
  • スクリプトプロパティを更新

エラー: ChatGPT API エラー: 429

原因: レート制限またはクレジット不足

対処:

  • OpenAIダッシュボードでクレジット残高を確認
  • 必要に応じてクレジットを追加

メールが届かない

原因: Gmail送信制限または迷惑メールフォルダ

対処:

  • 迷惑メールフォルダを確認
  • Gmailの1日の送信制限(無料: 100件/日)を確認

トリガーが動作しない

原因: 権限の問題

対処:

  • トリガーを一度削除して再作成
  • 権限の承認をやり直す

次のステップ

おめでとうございます!自動返信Botが完成しました。

さらにレベルアップしたい方は、以下にチャレンジしてみてください:

機能追加アイデア

  • Slack通知: お問い合わせがあったらSlackにも通知
  • カテゴリ別対応: 種別に応じて異なるプロンプトを使用
  • FAQ参照: スプレッドシートのFAQデータを返信に活用
  • 下書き保存: 自動送信せず、下書きとして保存(人間が確認後に送信)

関連記事


まとめ

このチュートリアルでは、GAS×ChatGPTを使った自動メール返信Botを作成しました。

学んだこと:

  • Googleフォーム → スプレッドシート → GAS の連携
  • ChatGPT APIの基本的な使い方
  • スクリプトプロパティによるAPIキー管理
  • トリガーによる自動実行

一度仕組みを理解すれば、他の自動化にも応用できます。ぜひ自分の業務に合わせてカスタマイズしてみてください。


この記事は SkillUp Labs の運営者が執筆しました。質問があればお気軽にお問い合わせください。

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

この記事を書いた人

コメント

コメントする

目次