見出し画像

【with AI】イベントアンケートのGoogleフォームをGASで自動出力する

AI x GASを学ぶコミュニティにお邪魔しています。

以下のXポストで紹介されているGoogleフォームをGASで出力する方法が知りたくて、ペアプロをお願いしました。

今回の記事では、教わったやり方を参考にしつつ、自分なりにアレンジしたGoogle Apps Script(以下、GAS)を紹介します。

シートを3枚用意する

まずスプレッドシートのシートを3枚用意します。それぞれ、「企画書」、「プロンプト」、「フォームURL」です。

  1. 「企画書」シートのA1セルには、企画書のテキストを記入します。

  2. 「プロンプト」シートのA1セルには、企画書からフォーム作成の素材となる情報を出力させるプロンプトを記入します。

  3. 「フォームURL」シートには、作成されたGoogleフォームのタイトル、閲覧用URL、編集用URLを記載します。

イベントの企画書を入力する

「企画書」シートのA1セルに、企画書のテキストを記入します。

デモでは、Peatixなどで公開されているイベントの概要をコピーさせてもらいます。今回は、私が所属する別の学習コミュニティ「ノンプロ研」で開催された公開イベントをサンプルに使わせてもらいます。

「企画書」シートのA1セル

AIにJSONを出力させてフォームを作る

企画書の内容から自動的にGoogleフォームを作成するプロセスで難しいのは、企画書の内容をプログラムが受け取れるような構造化データに変換する点です。ここで役立つのがJSON形式です。

JSON(JavaScript Object Notation)とは、データを構造化して保存・転送するためのシンプルかつ軽量なデータフォーマットです。人間にも読みやすく、コンピュータにとっても解析が容易なため、様々なプログラミング言語で利用されています。

Googleフォームを作成するための公式なJSONフォーマットは存在しません。そのため、企画書の内容に基づいてフォーム作成に繋げることができるサンプルJSONフォーマットをまずAIに生成させます。

企画書の内容によって、生成されるJSONの中身は動的に変化するはずです。また、それに対応させるために、GASのフォーム作成に関わるリファレンスをAIに読ませることで、精度の高いサンプルJSONフォーマットが出力されることを期待します。

ということで、こんな感じでAIにテンプレート出力を依頼しました。

ユーザーからのインプットとしてイベントの企画書の概要を与えられます。 このインプットをもとに、イベント終了後のアンケートのためのGoogleフォームを作成することが目的です。

Googleフォームを自動作成するために、企画書の概要からフォーム作成のための必要な情報を網羅したJSONフォーマットを作成します。

以下のClass Formのリファレンスを参考にテンプレートとなるJSONフォーマットを出力してください。企画書の内容は都度変わるため、JSONフォーマットは動的にフォームを作成できるものにしてください。

##Class Form リファレンス

freeelover

得られた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等)で試してみます。

ユーザーからのインプットとして、イベントの##企画書の概要を与えられます。 このインプットをもとに、イベント終了後のアンケートのためのGoogleフォームを作成することが目的です。##テンプレートJSONフォーマットを参考に##企画書の内容に即したアンケートを作成するためのJSONフォーマットを出力してください。

## テンプレートJSONフォーマット
[ここにJSONフォーマット記入]
## 企画書
[ここに企画書の概要記入]

freeelover

それっぽい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です。

以下のイベントの終了後に参加者にアンケートを行います。 アンケートの目的は、同じテーマで同様のイベントを行う際に、より満足度の高いイベントにするためのブラッシュアップを行うことです。 ただし、ユーザーはあまりアンケートに積極的に答えてくれません。この前提に基づいて、AIにアンケート項目を出力させるプロンプトの例を考えてください。

freeelover

出力された結果はこちら。

あなたはイベント企画のプロフェッショナルです。以下の条件を満たすイベント後アンケートの質問項目を5つ考えてください:

1. 回答時間が2分以内で完了する簡潔な質問
2. 主に選択式で、自由記述は最小限に抑える
3. イベントの満足度と改善点が明確になる質問
4. 次回の参加意欲を測れる質問を含める
5. 回答者の負担を減らしつつ、有益な情報が得られる工夫

また、回答率を上げるための工夫も1つ提案してください。

出力形式:
- 質問1:[質問内容]
- 質問2:[質問内容]
- 質問3:[質問内容]
- 質問4:[質問内容]
- 質問5:[質問内容]

回答率を上げるための工夫:[提案内容]

Claude 3.5 Sonnet

「プロンプト」シートのA1セルに完成したプロンプトを入力

これまでのプロセスを踏まえ、今回は以下のようにプロンプトを確定しました。もちろん、この時点ではこのプロンプトがうまく機能するとは限りませんので、実行結果を見て、必要に応じてプロンプトを調整します。

あなたはイベント企画のプロフェッショナルです。
ユーザーからのインプットとして、イベントの##企画書の概要を与えられます。 このインプットをもとに、イベント終了後のアンケートのためのGoogleフォームを作成することが目的です。##テンプレートJSONフォーマットを参考に##企画書の内容に即したアンケートを作成するためのJSONフォーマットを出力してください。アンケート作成にあたっては##制約条件を考慮してください。

## 制約条件
1. 回答時間が2分以内で完了する簡潔な質問
2. 主に選択式で、自由記述は最小限に抑える
3. イベントの満足度と改善点が明確になる質問
4. 次回の参加意欲を測れる質問を含める
5. 回答者の負担を減らしつつ、有益な情報が得られる工夫

## テンプレートJSONフォーマット
[ここにJSONフォーマット記入]

## 企画書

freeelover
「プロンプト」シートのA1セル

GASをAIに出力してもらう

ここまででおおよそ事前準備は完了です。

ここから、GASの実装ですが、ペアプロではAIを駆使してスクリプトを出力してもらいました。おおまかな手順としては以下の通りです。

  1. これまでの事前準備の内容から要件定義してもらう

  2. 要件定義に従ってGASを出力してもらい

  3. 実行してみてエラーが出たら、そのエラーをまたAIに修正してもらう

  4. 2-3のループ

なのですが、このnoteでは…

  1. これまでの事前準備の内容から要件定義してもらう

  2. 要件定義にAPIでエラーになりやすい部分の補足を手動で加える

  3. 1-2に従ってGASを出力してもらう

  4. コードを自分でレビューし自分で or ピンポイントにAIに指定して修正

というアプローチをとりました。

投げたプロンプトはこちら。

以下のプロンプトの指示をより良い出力をAIが出力するようにプロンプトを修正してください

- スプレッドシートには「企画書」「プロンプト」「フォームURL」の3つのシートが用意されています。
- 「企画書」シートのA1セルに企画書の概要テキストが入力されています。
- 「プロンプト」シートのA1セルに、企画書の内容からフォーム作成の素材となる情報を抽出するためのプロンプトが入力されています。
- 「フォームURL」シートには、ヘッダー項目として作成したフォームのタイトル、閲覧用URL、編集用URLが含まれています。
- 企画書の内容に基づき、「プロンプト」シートの指示に従ってJSONを出力します。
- Gemini APIを使用し、Class GeminiChatを利用します。
- 出力されたJSONを受け取り、Google Apps Script (GAS) を用いてフォームを自動作成します。

freeelover

返ってくるプロンプト案は、多くのケースで冗長なため、やり取りを重ねてコンパクトにまとめました。最終的には以下のスクリプト出力の指示にしました。

1. スプレッドシートの構成:
- 企画書シート: A1セルには企画書の概要テキストが入力されています。
- プロンプトシート: A1セルには、企画書の内容からフォーム作成の素材となる情報を抽出するためのプロンプトが入力されています。
- フォームURLシート: ヘッダー項目として「フォームのタイトル」、「閲覧用URL」、「編集用URL」があります。

2. 目的:
- 企画書の内容に基づいて、プロンプトシートの指示に従い、フォーム作成に必要な情報を抽出し、それをJSON形式で出力します。

3. 使用するAPI:
- Gemini API: Class GeminiChatを使用して、企画書の内容を解析し、必要な情報を抽出します。

4. Google Apps Script (GAS) の利用:
- 出力されたJSONを用いて、自動的にGoogleフォームを作成します。
## GeminiChatクラス
[ここにGeminiChatクラス記入]
## テンプレートJSONフォーマット
[ここにJSONフォーマット記入]

freeelover

ここで出力されたスクリプトを微調整して完成です。

ペアプロの感想

今回の "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クラス。

ここから先は

5,238字
この記事のみ ¥ 200

この記事が気に入ったらサポートをしてみませんか?