GASでGoogleフォームの回答に
AIで返信下書きを自動作成する方法
問い合わせフォームの回答を、GmailApp(GASからGmailを操作する標準機能)とClaude API(Anthropic社の生成AI)で受け取り、 返信メールの下書きを自動作成してGmailに保存する方法を、そのまま動くコードで解説します。 送信はせず「下書き」までに留めるので、人の確認を挟んで安全に運用できます。
Table of Contents
なぜ返信の「下書き」を自動化するのか
結論から言うと、問い合わせフォームへの一次返信は、 GAS(Google Apps Script。Googleサービスを操作する無料のプログラム実行環境)とAIで下書きまで自動化できます。 回答が届いた瞬間にAIが返信文を作り、Gmailに下書きとして保存しておく——担当者はそれを開いて、 内容を確認・微修正して送るだけです。ゼロから書くより、返信の初動が大きく速くなります。
ここで大事なのは、自動「送信」ではなく自動「下書き」に留めることです。AIの文面には事実誤りや不適切な表現が混じることがあります。人の確認を必ず挟むことで、 スピードと安全の両方を取れます。手作業のゼロ書きと比べたメリットは次の通りです。
初動が速くなる
回答が届いた直後に下書きが用意され、返信までの時間を短縮できる
抜け漏れを防ぐ
全ての問い合わせに下書きが作られるので、返信忘れが起きにくい
品質を均一化
会社のトーンや定型の言い回しをプロンプトに固定でき、担当者ごとのばらつきを抑える
事故を防ぐ
送信は人が最終判断するため、誤送信や不適切な自動返信を避けられる
この記事では、Googleフォームの回答を受け取り、Anthropic社のClaude APIで返信文を生成し、Gmailに下書きを作る、という一連の流れを実装します。
準備:フォーム・APIキー・シートの下地
必要なのは3つです。1つ目はGoogleフォームと、その回答が集まるスプレッドシート。フォーム編集画面の 「回答」タブからスプレッドシートに連携しておきます。返信先を得るため、フォームでメールアドレスを収集する設定にするか、メールアドレスの入力欄を用意します。2つ目はGmailへのアクセス許可(GmailAppを初めて使うと承認画面が出ます)。
3つ目はClaude APIのキーです。このキーは料金が発生する権限そのものなので、コードに直書きしてはいけません。GASの「スクリプトプロパティ」(PropertiesServiceで読み書きする、スクリプト単位の設定保存領域)に入れておき、コードからはキー名で読み出します。
// 一度だけ実行してAPIキーを安全に保存する
function saveApiKey() {
// 実行後、この関数のキー文字列は削除しておく
PropertiesService.getScriptProperties()
.setProperty("ANTHROPIC_API_KEY", "sk-ant-xxxxxxxx");
}
// コードからはキー名で読み出す(直書きしない)
function getApiKey() {
const key = PropertiesService.getScriptProperties()
.getProperty("ANTHROPIC_API_KEY");
if (!key) throw new Error("APIキーが未設定です。saveApiKeyを実行してください。");
return key;
}コードは、スプレッドシートのメニュー「拡張機能 › Apps Script」から開くエディタに書きます。saveApiKeyを一度だけ実行したら、キー文字列はコードから消しておきましょう。以降はどの関数からもgetApiKey()で安全に取り出せます。
フォームの回答を取り出す
フォーム送信をきっかけに動く関数には、引数として送信イベントeが渡されます。この中のe.namedValuesは「質問名 → 回答の配列」という形のオブジェクトです。質問名を指定するだけで回答を取り出せます。
// フォーム送信イベントから必要な回答を取り出す
// e.namedValues は { "質問名": ["回答"], ... } の形
function extractAnswers(e) {
const nv = e.namedValues || {};
// 質問名はフォームの見出しと完全一致させる
const pick = function (label) {
const v = nv[label];
return v && v[0] ? String(v[0]).trim() : "";
};
return {
email: pick("メールアドレス"),
name: pick("お名前"),
subject: pick("お問い合わせ種別"),
body: pick("お問い合わせ内容")
};
}ポイントは、pick("お名前")のように渡す質問名を、フォームの見出しと完全一致させることです。見出しを後から変えると、キーが一致せず空文字になります。回答が空でも落ちないよう、 値の有無をチェックしてから取り出しています。
Claude APIで返信文を生成する
取り出した回答を渡すと、返信メールの本文を返す関数を作ります。返信の質を安定させるコツは、 プロンプト(AIへの指示文)に会社の立場・トーン・禁止事項を具体的に書くことです。特に、料金や納期のように断定できない事項は「確約せず、確認のうえ連絡する」と指示し、 AIが勝手に約束しないようにします。
// 問い合わせ内容から返信メールの下書き本文を作る
function generateReply(answer) {
const url = "https://api.anthropic.com/v1/messages";
// 会社情報・トーン・禁止事項をプロンプトに具体的に書く
const prompt =
"あなたは株式会社◯◯のカスタマーサポート担当です。\n" +
"以下の問い合わせに対する返信メールの本文を、日本語で作成してください。\n" +
"・丁寧語で、簡潔に。前置きの挨拶と結びの署名まで含める。\n" +
"・料金や納期など断定できない事項は、確約せず「確認のうえご連絡します」とする。\n" +
"・不明点が多い場合は、無理に回答せず折り返しを案内する。\n\n" +
"お名前: " + answer.name + "\n" +
"種別: " + answer.subject + "\n" +
"問い合わせ内容:\n" + answer.body;
const payload = {
model: "claude-haiku-4-5",
max_tokens: 700,
messages: [{ role: "user", content: prompt }]
};
const options = {
method: "post",
contentType: "application/json",
headers: {
"x-api-key": getApiKey(),
"anthropic-version": "2023-06-01"
},
payload: JSON.stringify(payload),
muteHttpExceptions: true // エラー時も例外にせずレスポンスを受け取る
};
const res = UrlFetchApp.fetch(url, options);
const code = res.getResponseCode();
if (code !== 200) {
throw new Error("API エラー (" + code + "): " + res.getContentText());
}
return JSON.parse(res.getContentText()).content[0].text.trim();
}返答はcontent配列の先頭textに入ります。muteHttpExceptions: trueを付けると、エラー時も例外で止まらず自分でステータスコードを確認できます。モデルは軽量なclaude-haiku-4-5から始め、より丁寧な文面にしたいときに高性能なclaude-opus-4-8へ差し替えるだけで切り替えられます。
Gmailに下書きを作成する
いよいよ本体です。フォーム送信で呼ばれるonFormSubmitの中で、回答を取り出し、返信文を作り、GmailApp.createDraft()で下書きを保存します。ここで使うのはsendEmail()ではなくcreateDraft()です。前者はすぐ送信、後者は下書きを作るだけ——この違いが安全運用の要になります。
// フォーム送信時に呼ばれる本体:下書きを作成する(送信はしない)
function onFormSubmit(e) {
const answer = extractAnswers(e);
// 返信先が無ければ処理しない(自動送信もしない前提)
if (!answer.email) return;
const replyBody = generateReply(answer);
// Gmailに「下書き」として保存する。送信はしない
GmailApp.createDraft(
answer.email, // 宛先
"【お問い合わせ】ご連絡ありがとうございます", // 件名
replyBody // AIが作った本文
);
}返信先アドレスが空のときはreturnで処理を止め、宛先のない下書きが作られないようにしています。作られた下書きはGmailの「下書き」フォルダに 入るので、担当者はそこから内容を確認して送信します。
フォーム送信トリガーで自動化する
最後に、フォーム送信トリガー(回答が送信されるたびに関数を自動実行するGASの仕組み)を設定します。 回答が集まるスプレッドシート上で、次の関数を一度だけ実行すればOKです。
// フォーム送信をきっかけに onFormSubmit を自動実行する設定
// 回答が集まるスプレッドシート上で一度だけ実行する
function createFormTrigger() {
ScriptApp.newTrigger("onFormSubmit")
.forSpreadsheet(SpreadsheetApp.getActive())
.onFormSubmit()
.create();
}ここで重要なのは、時間主導トリガーではなくonFormSubmit()を使う点です。これにより、回答が届いた瞬間だけ処理が走り、送信イベントeから回答内容を直接受け取れます。設定後は、テスト回答を1件送って、Gmailの下書きが作られるか確認しましょう。
誤送信を防ぐ運用のポイント
自動化で最も避けたいのは、AIが作った文面がそのまま顧客へ届いてしまう事故です。次の3点を守ると安全に運用できます。
送信は必ず人が判断
createDraft() を使い、自動送信はしない。担当者が下書きを確認してから送る
断定しない指示を固定
料金・納期・可否はプロンプトで確約を禁止し、確認のうえ連絡する旨に統一する
不確かな案件は定型へ
情報が足りない問い合わせは、無理に回答せず折り返し案内の定型文にフォールバックさせる
あわせて、問い合わせの種別をAIで先に分類してから返信テンプレートを切り替えると、精度がさらに上がります。 分類の実装は関連記事で解説しています。個人情報を含むため、APIに送る前に不要な項目を落とす配慮も忘れないでください。
まとめ
GoogleフォームとClaude APIをGASでつなぐと、問い合わせ返信の下書きを自動生成できます。ポイントは4つです。 APIキーはスクリプトプロパティで安全に保管し、回答はe.namedValuesから質問名で取り出し、返信文はプロンプトに会社の立場と禁止事項を固定して生成し、createDraft()で下書きに留めて人が確認する——この型を押さえれば、返信に限らず、見積の下書きや一次回答の自動生成にも 同じ流れで応用できます。
よくある質問
いいえ。この記事の実装は「下書き」をGmailに保存するだけで、送信はしません。AIの文面には事実誤りや不適切な表現が混じることがあるため、必ず人が内容を確認してから送る運用を前提にしています。誤送信を防ぎつつ、返信の下書きにかかる時間を大きく減らせます。
フォームの回答が集まるスプレッドシートに対して、フォーム送信トリガー(onFormSubmit)を設定します。コードから ScriptApp.newTrigger("onFormSubmit").forSpreadsheet(SpreadsheetApp.getActive()).onFormSubmit().create() を一度実行すれば設定できます。回答が送信されるたびに、指定した関数が自動で動きます。
フォーム送信トリガーの関数には、引数として送信イベント e が渡されます。e.namedValues は「質問名 → 回答の配列」の形のオブジェクトなので、e.namedValues["メールアドレス"][0] のように質問名を指定して回答を取り出せます。質問名はフォームの見出しと完全一致させる必要があります。
フォームの設定で「メールアドレスを収集する」を有効にするか、フォームにメールアドレスの入力欄を設けます。前者の場合は e.namedValues["メールアドレス"] に、後者の場合は設けた質問名で回答が入ります。取得したアドレスを GmailApp.createDraft() の宛先に使います。
プロンプト(AIへの指示文)に、会社名・署名・トーン・禁止事項を具体的に書き込むと安定します。さらに、想定質問と模範回答をいくつか例として渡すと精度が上がります。それでも不確かな案件は「担当者から折り返します」という定型文にフォールバックさせると、事故を防げます。
返信下書きは文章生成なので、まずはコストと速度のバランスが良い claude-haiku-4-5 で品質を確認するのがおすすめです。より自然で丁寧な文面にしたい場合は、高性能な claude-opus-4-8 へ切り替えます。モデルはリクエストの model フィールドの文字列を差し替えるだけで変更できます。
関連するサービス・記事
UrlFetchApp経由でClaude APIを呼び出し、問い合わせをカテゴリ分けする実装を解説します。返信振り分けと組み合わせられます。
GASからClaude APIで問い合わせを自動分類する方法を見る →
受信メールをClaude APIで要約してシートに記録する実装です。返信生成と同じAPI連携の型を使います。
Gmailの長文メールをAIで3行に要約する方法を見る →
AI APIとGASを組み合わせた、要約・分類・下書き生成などの自動化事例を紹介します。
AI×GAS自動化の対応範囲を見る →
フォーム連携・帳票作成・外部API連携など、GAS開発の依頼内容と流れを説明します。
GAS開発の対応範囲を見る →
AI×GASの業務自動化を
相談する。
返信下書きのほかにも、問い合わせ分類・優先度判定・メール要約など、 AI APIとGASを組み合わせた自動化をご相談いただけます。既存のフォーム・Gmail運用にも組み込めます。