【with AI】イベントアンケートのGoogleフォームをGASで自動出力する
AI x GASを学ぶコミュニティにお邪魔しています。
以下のXポストで紹介されているGoogleフォームをGASで出力する方法が知りたくて、ペアプロをお願いしました。
今回の記事では、教わったやり方を参考にしつつ、自分なりにアレンジしたGoogle Apps Script(以下、GAS)を紹介します。
シートを3枚用意する
まずスプレッドシートのシートを3枚用意します。それぞれ、「企画書」、「プロンプト」、「フォームURL」です。
「企画書」シートのA1セルには、企画書のテキストを記入します。
「プロンプト」シートのA1セルには、企画書からフォーム作成の素材となる情報を出力させるプロンプトを記入します。
「フォームURL」シートには、作成されたGoogleフォームのタイトル、閲覧用URL、編集用URLを記載します。
イベントの企画書を入力する
「企画書」シートのA1セルに、企画書のテキストを記入します。
デモでは、Peatixなどで公開されているイベントの概要をコピーさせてもらいます。今回は、私が所属する別の学習コミュニティ「ノンプロ研」で開催された公開イベントをサンプルに使わせてもらいます。
AIにJSONを出力させてフォームを作る
企画書の内容から自動的にGoogleフォームを作成するプロセスで難しいのは、企画書の内容をプログラムが受け取れるような構造化データに変換する点です。ここで役立つのがJSON形式です。
JSON(JavaScript Object Notation)とは、データを構造化して保存・転送するためのシンプルかつ軽量なデータフォーマットです。人間にも読みやすく、コンピュータにとっても解析が容易なため、様々なプログラミング言語で利用されています。
Googleフォームを作成するための公式なJSONフォーマットは存在しません。そのため、企画書の内容に基づいてフォーム作成に繋げることができるサンプルJSONフォーマットをまずAIに生成させます。
企画書の内容によって、生成されるJSONの中身は動的に変化するはずです。また、それに対応させるために、GASのフォーム作成に関わるリファレンスをAIに読ませることで、精度の高いサンプルJSONフォーマットが出力されることを期待します。
ということで、こんな感じでAIにテンプレート出力を依頼しました。
得られたJSONフォーマットはこちら
{
"formTitle": "イベント名 フィードバックアンケート",
"formDescription": "イベントへのご参加ありがとうございました。今後の改善のため、ぜひご意見をお聞かせください。",
"confirmationMessage": "回答ありがとうございました!",
"isQuiz": false,
"collectsEmail": true,
"limitOneResponsePerUser": true,
"shuffleQuestions": false,
"items": [
{
"type": "MULTIPLE_CHOICE",
"title": "あなたの年齢層を教えてください。",
"choices": ["10代以下", "20代", "30代", "40代", "50代", "60代以上"],
"isRequired": true
},
{
"type": "CHECKBOX",
"title": "今回のイベントで良かった点を選んでください(複数選択可)。",
"choices": ["内容が興味深かった", "講演者の説明が分かりやすかった", "会場の雰囲気が良かった", "質疑応答の時間が十分だった", "その他"],
"isRequired": true
},
{
"type": "SCALE",
"title": "イベント全体の満足度を1〜5で評価してください。",
"lowerBound": 1,
"upperBound": 5,
"lowerLabel": "不満",
"upperLabel": "大変満足",
"isRequired": true
},
{
"type": "PARAGRAPH_TEXT",
"title": "イベントの改善点や今後のご要望があればお聞かせください。",
"isRequired": false
}
]
}
この時点では、このテンプレートJSONフォーマットが機能するか分かりませんが、この後に実装してみて、もしうまくいかない場合は、このステップに戻ってテンプレートJSONフォーマットを調整します。
アンケートの内容をAIにブラッシュアップしてもらう
特にアンケートの内容に希望がなければ、以下のシンプルなプロンプトがベースになります。まずはこんな感じでAIチャットアプリ(ChatGPT等)で試してみます。
それっぽいJSONが出力されます。
{
"formTitle": "【オンライン無料開催】ノンプロ研 特別公開イベント「ようこそ、ソフトウェアテストの世界へ!」フィードバックアンケート",
"formDescription": "イベントへのご参加ありがとうございました。今後の改善のため、ぜひご意見をお聞かせください。",
"confirmationMessage": "回答ありがとうございました!今後もノンプロ研のイベントにぜひご参加ください。",
"isQuiz": false,
"collectsEmail": true,
"limitOneResponsePerUser": true,
"shuffleQuestions": false,
"items": [
{
"type": "MULTIPLE_CHOICE",
"title": "あなたの年齢層を教えてください。",
"choices": ["10代以下", "20代", "30代", "40代", "50代", "60代以上"],
"isRequired": true
},
{
"type": "MULTIPLE_CHOICE",
"title": "あなたのプログラミング経験を教えてください。",
"choices": ["未経験", "VBAやGASを使用している", "その他の言語も使用している", "プロのエンジニア"],
"isRequired": true
},
{
"type": "SCALE",
"title": "イベント全体の満足度を1〜5で評価してください。",
"lowerBound": 1,
"upperBound": 5,
"lowerLabel": "不満",
"upperLabel": "大変満足",
"isRequired": true
},
{
"type": "CHECKBOX",
"title": "今回のイベントで良かった点を選んでください(複数選択可)。",
"choices": [
"ソフトウェアテストの基礎が理解できた",
"テスト自動化の面白さが分かった",
"ソフトウェアをテストしやすくする方法が学べた",
"講演者の説明が分かりやすかった",
"質疑応答の時間が十分だった",
"オンライン開催で参加しやすかった",
"その他"
],
"isRequired": true
},
{
"type": "MULTIPLE_CHOICE",
"title": "今回のイベントの難易度はいかがでしたか?",
"choices": ["簡単すぎた", "ちょうど良かった", "少し難しかった", "とても難しかった"],
"isRequired": true
},
{
"type": "MULTIPLE_CHOICE",
"title": "懇親会に参加されましたか?",
"choices": ["はい", "いいえ"],
"isRequired": true
},
{
"type": "PARAGRAPH_TEXT",
"title": "イベントの内容で特に印象に残った点や、もっと詳しく知りたかった点があれば教えてください。",
"isRequired": false
},
{
"type": "PARAGRAPH_TEXT",
"title": "今後のノンプロ研のイベントで取り上げてほしいテーマや、改善点があればお聞かせください。",
"isRequired": false
},
{
"type": "MULTIPLE_CHOICE",
"title": "今後もノンプロ研のイベントに参加したいと思いますか?",
"choices": ["ぜひ参加したい", "機会があれば参加したい", "あまり参加したくない", "参加しない"],
"isRequired": true
}
]
}
アンケートの内容をブラッシュアップしたい場合は、制約条件を指定する
もしシンプルなスクリプトで生成されるアンケートの内容が希望通りにならない場合、プロンプトにアンケート生成時の制約条件を具体的に記載するようにしてください。
これにより、ご希望に沿ったアンケート内容になるよう、AIをうまく誘導することが可能になります。
もちろんAIに聞いてもOKです。
出力された結果はこちら。
「プロンプト」シートのA1セルに完成したプロンプトを入力
これまでのプロセスを踏まえ、今回は以下のようにプロンプトを確定しました。もちろん、この時点ではこのプロンプトがうまく機能するとは限りませんので、実行結果を見て、必要に応じてプロンプトを調整します。
GASをAIに出力してもらう
ここまででおおよそ事前準備は完了です。
ここから、GASの実装ですが、ペアプロではAIを駆使してスクリプトを出力してもらいました。おおまかな手順としては以下の通りです。
これまでの事前準備の内容から要件定義してもらう
要件定義に従ってGASを出力してもらい
実行してみてエラーが出たら、そのエラーをまたAIに修正してもらう
2-3のループ
なのですが、このnoteでは…
これまでの事前準備の内容から要件定義してもらう
要件定義にAPIでエラーになりやすい部分の補足を手動で加える
1-2に従ってGASを出力してもらう
コードを自分でレビューし自分で or ピンポイントにAIに指定して修正
というアプローチをとりました。
投げたプロンプトはこちら。
返ってくるプロンプト案は、多くのケースで冗長なため、やり取りを重ねてコンパクトにまとめました。最終的には以下のスクリプト出力の指示にしました。
ここで出力されたスクリプトを微調整して完成です。
ペアプロの感想
今回の "with AI" コーディングでなるほどなーと思ったのは、フォームという内容が動的に変化するものでも、あまり気にせず、構造化されたテンプレート(今回の場合はJSON)を与えれば良いという点。
エラーが出る場合もあるだろうけれど、AIは心が折れないので、何回もトライすれば良いという発想ですね。
ペアプロ後に、個人的に足したエッセンスは、公式リファレンスを読ませてテンプレートJSONを作成させたことと、そのテンプレートをプロンプトに組み込んで、毎回安定したJSONを出力するようにしたこと。
結果、これでエラーも起きずに1回目からそれらしいフォームが生成されてました。
一方で、まだ難しいんだろうなと思ったのはAPIが関わるコーディング。ペアプロ中はGemini APIを意図通りに動かすのに手間取っていたので、ここは、一旦切り分けて関数化するなり、クラス化するなりして、事前に動く(=簡単な質問をして返答が得られる)ことを確認してから、そのコードを参照させてAIにメインのスクリプトを出力させたほうが良いなと思いました。
補足:GeminiChatクラス
個人的にはOpenAIのAPIを使うことが多いのですが、今回参加したコミュニティでは無料枠が提供されているGemini APIのほうが多くの人にとって試しやすいという声がありました。そこで、今回はGemini APIを使用して実装することにしました。
Gemini APIに関しては、以前に以下の記事を書きました。
この記事の内容をベースに、更にシンプルにAPIコールを実行できるようにするため、GeminiChatクラスを作成したのが以下の記事です。
GeminiChatクラスをGAS出力時のプロンプトに読み込ませることで、AIが苦手なAPI関連のコーディングをスムーズにします。
また、今回のスクリプトはJSONフォーマットでデータを受け渡すため、Gemini APIの出力をJSONに制限する必要があります。このJSON出力制限モードは、AIをプログラミングに組み込む際によく使用するので、この制御もGeminiChatクラスの機能として取り込んでいます。
イベントアンケートのGoogleフォームを自動出力するスクリプト
最後にスクリプトの紹介です。今回は以下3つのファイル構成で作っています。
class/GeminiChat
app/createGoogleForm
menu
まずGeminiChatクラス。
ここから先は
この記事が気に入ったらサポートをしてみませんか?