【コピペでOK】Google FormにAIが自動返信!GeminiとGASで作る賢いアンケート返信システム
- 本間 充/マーケティングサイエンスラボ所長
- 12 分前
- 読了時間: 8分
はじめに:アンケート回答者一人ひとりに、心のこもった返信を届けたい
こんにちは!私は仕事でセミナーや講義を行う際、参加者の皆さんからのフィードバックを得るためにGoogle Formをよく使います。
「今回の内容は役に立ったか?」「もっと詳しく聞きたいことはなかったか?」
こうした貴重な声は、次回の改善に欠かせません。ただ、アンケートに答えてくださった方へのお礼は、いつも同じ資料を送るだけ…。せっかく個別の感想をいただいているのに、もっと一人ひとりに寄り添ったお返しができないものかと感じていました。
「もし、アンケートの内容に合わせて、AIがパーソナルなアドバイスを自動で返信してくれたら…?」
そんな思いつきから、Google Formと今話題のAI「Google Gemini」を連携させる仕組みを開発してみることにしました。今回は、その方法を誰でも真似できるように、分かりやすくご紹介します!
準備するものは、たったの3つだけ!
「AIとの連携」と聞くと難しそうに感じるかもしれませんが、ご安心ください。意外と簡単に、そして無料で試すことができます。使うのは以下の3つだけです。
Google Form: いつものアンケートフォームです。
Google Apps Script (GAS): Googleのサービスを便利にするためのプログラミング言語。今回はコピペでOKです!
Google Gemini の API key: AIの機能を使うための「鍵」のようなものです。これも簡単に取得できます。
ステップ1:土台となるGoogle Formを作成しよう
まずは、ユーザーに入力してもらうフォームを作成します。今回は、以下のようなシンプルなもので大丈夫です。
メールアドレス: AIからの返信先です。
お名前: メールの宛名に使います。
ご意見・ご感想など: ここに入力された内容をAIに渡します。
【ワンポイント】 フォームの「設定」タブで「メールアドレスを収集する」をオンにすると、回答者のメールアドレスを簡単・確実に取得できて便利です。

ステップ2:Google Gemini APIキーを取得しよう【最重要】
次に、AIの心臓部であるGemini APIを利用するための「APIキー」を取得します。
Google AI Studio にアクセスします。
Googleアカウントでログインし、「Create API key」ボタンをクリックすれば、すぐにキーが発行されます。
発行されたAPIキーは、後で使うのでコピーしてメモ帳などに貼り付けておきましょう。
※注意:APIキーは、あなた専用の秘密の鍵です。他人に知られないように大切に保管してください。
ステップ3:Google Apps Script (GAS) に魔法のコードを貼り付けよう
いよいよプログラミングですが、今回はコピー&ペーストするだけです。
作成したGoogle Formの編集画面を開きます。
右上のその他アイコン(︙)をクリックし、「スクリプトエディタ」を選択します。
新しいプロジェクト画面が開いたら、元々書かれているコードをすべて消して、次の完成版のコードを貼り付けます。
// ここに自分のGemini APIキーを貼り付けます
const API_KEY = '自分のGemini APIキー';
// フォームが送信されたときに実行される関数
function onFormSubmit(e) {
try {
// ★★★★★★★★★★★★★★★★★★★★★★★★
// カスタムメッセージをここで編集できます
// ★★★★★★★★★★★★★★★★★★★★★★★★
const openingMessage = 'この度は、お問い合わせいただき誠にありがとうございます。\nご入力いただいた内容に基づき、以下の通り回答いたします。';
const closingMessage = '今後ともよろしくお願いいたします。\n\n ○○会社 代表 MIKE’;
// フォームの回答内容を取得
const formResponse = e.response;
const itemResponses = formResponse.getItemResponses();
const email = formResponse.getRespondentEmail();
let inquiry = '';
let customerName = ''; // お名前を格納する変数を追加
for (let i = 0; i < itemResponses.length; i++) {
const itemTitle = itemResponses[i].getItem().getTitle();
// ★★★ フォームの項目名と完全に一致させてください ★★★
if (itemTitle === 'お問い合わせ内容') {
inquiry = itemResponses[i].getResponse();
} else if (itemTitle === 'お名前を教えてください。') { // 「お名前」項目を取得する処理を追加
customerName = itemResponses[i].getResponse();
}
}
// お名前が入力されていない場合のデフォルト名
if (!customerName) {
customerName = 'お客様';
}
if (!inquiry) {
console.log('お問い合わせ内容が見つかりませんでした。');
return;
}
// Geminiに送信するプロンプトを作成
const prompt = `以下の問い合わせに対して、丁寧な回答文章を作成してください。文章は500文字程度で作成してください。また、Plain Textで出力してください。\n\n問い合わせ内容:\n${inquiry}`;
const geminiResponse = callGeminiAPI(prompt);
// ★★★★★★★★★★★★★★★★★★★★★★★★
// メールの本文を組み立てます
// ★★★★★★★★★★★★★★★★★★★★★★★★
const body = `${customerName}様
${openingMessage}
---
${geminiResponse}
---
${closingMessage}
`;
const subject = 'お問い合わせありがとうございます';
MailApp.sendEmail(email, subject, body);
console.log('メールを送信しました: ' + email);
} catch (error) {
console.error('エラーが発生しました: ' + error.toString());
const adminEmail = Session.getActiveUser().getEmail();
MailApp.sendEmail(adminEmail, '【要確認】Gemini連携スクリプトでエラーが発生しました', error.toString());
}
}
// Gemini APIを呼び出す専門の関数(この関数は変更なし)
function callGeminiAPI(prompt) {
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${API_KEY}`;
const requestBody = {
"contents": [{
"parts": [{
"text": prompt
}]
}]
};
const options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(requestBody),
'muteHttpExceptions': true
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() >= 400) {
throw new Error(`APIリクエストに失敗しました。ステータス: ${response.getResponseCode()}, レスポンス: ${response.getContentText()}`);
}
const jsonResponse = JSON.parse(response.getContentText());
if (!jsonResponse.candidates || !jsonResponse.candidates[0] || !jsonResponse.candidates[0].content || !jsonResponse.candidates[0].content.parts || !jsonResponse.candidates[0].content.parts[0]) {
throw new Error('APIから予期せぬ形式の応答がありました。');
}
return jsonResponse.candidates[0].content.parts[0].text;
}

ステップ4:Google Apps Script (GAS)コードを自分仕様にカスタマイズしよう
貼り付けたコードは、ほんの少しだけあなた仕様に書き換える必要があります。難しくないので、一緒に見ていきましょう!
【必須】この2つを修正すれば、すぐに動きます!
'YOUR_GEMINI_API_KEY' の部分を、ステップ2で取得したあなた自身のAPIキーに置き換えます。
コード内の 'お名前' や 'ご意見・ご感想など' という部分は、ステップ1で作成したフォームの質問項目名と、一字一句同じになるように合わせてください。
【お好みで】ここを変えれば、もっと自分らしく!
メール冒頭の挨拶: openingMessage の中の文章を好きな挨拶文に変えられます。
メール文末の挨拶: closingMessage の中の文章を、自分の名前や組織名などに変更できます。
AIへの指示文(プロンプト): prompt の中身は、AIにどう動いてほしいかを指示する命令文です。ここを工夫することで、AIの返答をよりシャープにしたり、面白い返事をさせたりできます。
コードの準備はこれで完了です!

ステップ5:実行許可と自動化の設定(トリガー)
最後に、このスクリプトが自動で動くように設定します。
実行の許可
コードを初めて保存するとき、「承認が必要です」という画面が表示されます。これは、作成したスクリプトが「あなたの代わりにフォームを読み取り、メールを送信する」という操作を行うため、その許可をGoogleに与えるプロセスです。内容を確認し、許可してください。
自動化の設定(トリガー)
スクリプトエディタの左側にある、目覚まし時計のアイコン「トリガー」をクリックします。
右下の「トリガーを追加」ボタンをクリックします。
以下の通りに設定し、「保存」をクリックします。
実行する関数を選択: onFormSubmit
イベントのソースを選択: フォームから
イベントの種類を選択: フォーム送信時
お疲れ様でした!これで全ての準備が整いました。 試しに自分でフォームに入力・送信して、AIから心のこもった(?)メールが届けば成功です!

まとめ:あなただけのAIアシスタントを育てよう
今回は、Google Formの回答にGeminiが自動返信する仕組みをご紹介しました。
この仕組みを応用すれば、
Webサイトからのお問い合わせ対応
簡単な質問に答えてくれるチャットボット
入力内容に基づいた簡易診断ツール
など、様々な業務の自動化に応用できます。 ぜひ、この記事をきっかけに、あなただけの便利なAIアシスタントを育ててみてください!

また、GeminiのAIのモデルも徐々に増えています。詳細は、モデル バリエーションのページに詳細があります。
このBlogを書いた段階では、以下のモデルが使えます。このモデルバリエーションは、以下の赤字の部分で指定することで、変更可能です。
`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${API_KEY}`;
モデル バリエーション | 入力 | 出力 | 最適な用途 |
音声、画像、動画、テキスト | テキスト | 適応的思考、費用対効果 | |
gemini-2.5-flash-preview-native-audio-dialog、 gemini-2.5-flash-exp-native-audio-thinking-dialog | 音声、動画、テキスト | テキストと音声(インターリーブ) | 思考ありまたは思考なしで、高品質で自然な会話音声を出力 |
テキスト | 音声 | 低レイテンシで制御可能な、単一スピーカーと複数スピーカーのテキスト読み上げ音声生成 | |
音声、画像、動画、テキスト | テキスト | 思考と推論の強化、マルチモーダル理解、高度なコーディングなど | |
テキスト | 音声 | 低レイテンシで制御可能な、単一スピーカーと複数スピーカーのテキスト読み上げ音声生成 | |
音声、画像、動画、テキスト | テキスト | 次世代の機能、速度、思考、リアルタイム ストリーミング。 | |
音声、画像、動画、テキスト | テキスト、画像 | 会話型の画像生成と編集 | |
音声、画像、動画、テキスト | テキスト | 費用対効果と低レイテンシ | |
音声、画像、動画、テキスト | テキスト | さまざまなタスクで高速で汎用性の高いパフォーマンスを実現 | |
音声、画像、動画、テキスト | テキスト | 大規模でインテリジェンスが低いタスク | |
音声、画像、動画、テキスト | テキスト | より多くのインテリジェンスを必要とする複雑な推論タスク | |
テキスト | テキスト エンベディング | テキスト文字列の関連性の測定 | |
テキスト | 画像 | Google の最先端の画像生成モデル | |
テキスト、画像 | 動画 | 高画質動画の生成 | |
音声、動画、テキスト | テキスト、音声 | 低レイテンシの双方向の音声と動画によるやり取り |
Comments