【初心者向け】GAS×ChatGPTで自動メール返信Botを作ろう
本記事では、プログラミング初心者でも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で業務を自動化!実践ユースケース5選
- OpenAI API公式ドキュメント(英語)
まとめ
このチュートリアルでは、GAS×ChatGPTを使った自動メール返信Botを作成しました。
学んだこと:
- Googleフォーム → スプレッドシート → GAS の連携
- ChatGPT APIの基本的な使い方
- スクリプトプロパティによるAPIキー管理
- トリガーによる自動実行
一度仕組みを理解すれば、他の自動化にも応用できます。ぜひ自分の業務に合わせてカスタマイズしてみてください。
この記事は SkillUp Labs の運営者が執筆しました。質問があればお気軽にお問い合わせください。
コメント