1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoogleFormsをJSONから作らせるツール作ってみた

1
Last updated at Posted at 2025-11-04

想定読者

  • GoogleFormsをJSONから作りたい人
  • GoogleFormsのGUIをポチポチしたくない人
  • GoogleFormsのアンケート設問構造そのものをGitなどでバージョン管理したい人

作ったもの

完成品はこちらです。
https://github.com/k5san/form-creator

使い方はリポジトリのreadmeに書いてあります。

作成の経緯

部門内メンバーに自身のキャリア・スキルについてアンケート回答させたくなりました。
Excelファイルで入力シートを作って配布してもよかったのですが、それだと集計するのがやや面倒だなと…。

アンケートを作るサービスとして私が知っていたのは次の二つでした。

  • MicrosoftForms
  • GoogleForms

課題

課題1. GUIポチポチしたくない

MicrosoftFormsもGoogleFormsも、少し調べた感じだとGUIをポチポチやってアンケートフォームを作っていくような感じでした。

設問順を並び変えたり、似たような設問をパッとコピーしたり、設問構造をテキストエディタで編集するような手軽さで編集したいなぁと思いました。

課題2. バージョン管理したい

このアンケートは、今後部門内の課員に定期的にやってもらうことを想定していて、将来的にアンケートの設問も変化していきそうです。
そうなったとき、設問構造そのもののバージョン管理をしたいと思いました。

調査

「ありそうかな」と思ったのはGoogleFormsやMicrosoftFormsで作ったフォームを、XMLなどの形式にエクスポート/インポートする機能。
しかし、調べた感じそういった機能はないらしい。
外部のサービスでそういったものもないか調べていると、ChatGPTが「GoogleAppsScript (GAS)を使えばGoogleFormsのフォームを作ることができる」ことを教えてくれた。

Google Apps Scriptとは

**Google Apps Script(GAS)**は、Googleが提供するJavaScriptベースのスクリプト言語で、Google Workspace(旧称G Suite)のアプリケーション(Gmail、Google Sheets、Google Docs、Google Drive など)を自動化・拡張するためのツールです。

だそうです。さっそく作ってみる。

にアクセスして、新しいプロジェクトを開く。そして次のように記述。

function createSkillMapForm() {
  const form = FormApp.create("スキルマップアンケート");

  const javaItem = form.addMultipleChoiceItem()
                      .setTitle("Javaのスキルレベルを選んでください");
  
  const javaChoices = [
    javaItem.createChoice("0"),
    javaItem.createChoice("1"),
    javaItem.createChoice("2"),
    javaItem.createChoice("3"),
    javaItem.createChoice("4")
  ];
  
  javaItem.setChoices(javaChoices).setRequired(true);

  Logger.log("[INFO] フォームURL: " + form.getEditUrl());
}

保存して実行。

フォーム.png

できました。

.gsファイル → Formはできた

テキストエディタで編集した「.gsファイル」から「フォーム」を出力できた。
一応これで課題であるところの

  • GUIポチポチしたくない
  • バージョン管理したい

この要求は満たせそうだ。
一瞬「これでいいか」と思ったんですが、これは言ってしまえばアンケート構造のソースコードが.gsファイルという状況。
そうではなく、生成エンジンに構造ファイルを入力させて、アンケート構造を出力させたい。

json → Form そしてシステム全体像

設定ファイルっぽいフォーマット、例えばJSONからフォームを作りたい。GASのソースコードを読んでみると、なんか外部ファイルからパースできる雰囲気を感じたのでGPTに聞いてみると「できます」とのこと。

ついでにGASでローカルのファイルを読み取ったりできるかどうかも聞いてみたが、直接はできず、GoogleDrive経由ならできるとのことだった。

GoogleDrive上のどのファイルを読み取るかをGUIで選択できるようにしたかったが、GASだけではGUIも展開できないらしい。
Googleスプレッドシートと組み合わせれば、HTMLで書いたGUIを表示できるとのこと。
GoogleスプレッドシートにはGASによるスクリプトを紐づけられる。完全にEXCELマクロのようなイメージ。

  1. GoogleFromsのアンケート構造を定義したJSONを記述。
  2. GoogleWorkspaceにJSONをアップロード。
  3. Googleスプレッドシートを開く。
  4. Googleスプレッドシートからスクリプト実行。アップロードしているJSONからフォームを生成。

以上の流れでやることにした。回答者も含めたシステムの全体像はこんな感じ。

システム構成図.png

作りこみ

システムの全体像と、実現のための要素は揃ったのであとはほぼAIにお任せしました。
GoogleFormsで対応している質問形式全てに対応させ、また選択式の回答の場合、選択肢を別の質問で再利用するケースがありそうだったので、そういったのにも対応しました。(choicesTemplates

GUIからならテキストフォーマットを指定できたり、画像挿入できたりしますが、そこまでは非対応です。

人がテキストエディタから編集することを考えると、JSONよりもYAMLの方が適していると思ったが、GASはJSONのパースはできるがYAMLのパースを直接サポートしていないらしい。やり方はあるらしいがYAML→JSONは別にローカルでやることにした。

完成形(使い方)

1. GoogleDrive上にJSONをアップロードする。

JSONのアップロード.png

2. スプレッドシートからJSONを選択。フォーム作成。

完成形1.png

3. 処理が完了すればアンケートフォームが出来上がる。

完成系2.png

使用したJSONはこちら。詳しい仕様はREADMEを確認してください。

{
  "title": "スキルマップ総合デモ(全パターン網羅)",
  "description": "choicesTemplates の description を helpText 末尾へ追記、grid/checkboxgrid の rows は itemTemplates 参照も可。テンプレ利用と直接配列の両方を網羅。",
  "choicesTemplates": [
    {
      "name": "業務-理解度軸",
      "description": "1=未認知・用語, 2=概要理解, 3=プロセス理解, 4=要件変換, 5=業務再設計",
      "choices": [
        { "label": "1:未認知・用語レベル", "score": 1 },
        { "label": "2:概要理解レベル", "score": 2 },
        { "label": "3:プロセス理解レベル", "score": 3 },
        { "label": "4:要件変換レベル", "score": 4 },
        { "label": "5:業務再設計レベル", "score": 5 }
      ]
    },
    {
      "name": "技術-理解度軸",
      "description": "1=分からない, 2=知っているが説明できない, 3=説明できるが実装できない, 4=説明・実装できる, 5=説明・実装・適用判断ができる",
      "choices": [
        { "label": "1:分からない", "score": 1 },
        { "label": "2:知っているが説明できない", "score": 2 },
        { "label": "3:説明できるが実現方法が分からない/実装できない", "score": 3 },
        { "label": "4:説明/実現できる", "score": 4 },
        { "label": "5:説明/実現/適用判断ができる", "score": 5 }
      ]
    },
    {
      "name": "技術-経験軸",
      "description": "1=未経験, 2=学習のみ, 3=業務で一部担当, 4=主担当経験, 5=複数回経験・指導可能",
      "choices": [
        { "label": "1:未経験", "score": 1 },
        { "label": "2:学習経験のみ", "score": 2 },
        { "label": "3:業務利用(部分担当)", "score": 3 },
        { "label": "4:主担当経験あり", "score": 4 },
        { "label": "5:複数回経験あり・指導可能", "score": 5 }
      ]
    },
    {
      "name": "Yes/No",
      "description": "はい/いいえ から選択",
      "choices": [
        { "label": "はい", "score": 1 },
        { "label": "いいえ", "score": 0 }
      ]
    }
  ],
  "itemTemplates": [
    {
      "name": "業務テンプレ",
      "items": ["小売", "製造", "金融", "商社", "サービス・インフラ"]
    },
    {
      "name": "Java系テンプレ",
      "items": ["Java", "Spring", "Spring Boot", "JPA/Hibernate", "JUnit"]
    }
  ],
  "questions": [
    {
      "type": "pagebreak",
      "title": "基本情報(テンプレ未使用の設問いろいろ)",
      "helpText": "以下はテンプレートを使わない直接定義の例です。"
    },
    {
      "type": "text",
      "title": "氏名",
      "required": true,
      "helpText": "フルネームを入力してください。"
    },
    {
      "type": "paragraph",
      "title": "自己PR",
      "required": false,
      "helpText": "簡潔に記入してください。"
    },
    {
      "type": "date",
      "title": "入社日",
      "required": false,
      "helpText": "西暦で選択してください。"
    },
    {
      "type": "time",
      "title": "普段の始業予定時刻",
      "required": false
    },
    {
      "type": "scale",
      "title": "今期の自己満足度",
      "required": false,
      "helpText": "1=不満, 5=満足",
      "min": 1,
      "max": 5,
      "minLabel": "不満",
      "maxLabel": "満足"
    },
    {
      "type": "multiplechoice",
      "title": "配属希望(直接配列)",
      "required": true,
      "helpText": "第1希望を選択してください。",
      "choices": [
        { "label": "B2Bアプリ", "score": 0 },
        { "label": "コンシューマWeb", "score": 0 },
        { "label": "基盤/共通", "score": 0 }
      ]
    },
    {
      "type": "checkbox",
      "title": "得意領域(直接配列)",
      "required": false,
      "helpText": "複数選択可。",
      "choices": [
        { "label": "Webバックエンド", "score": 0 },
        { "label": "フロントエンド", "score": 0 },
        { "label": "インフラ/クラウド", "score": 0 },
        { "label": "データベース", "score": 0 }
      ]
    },
    {
      "type": "list",
      "title": "勤務形態(直接配列)",
      "required": true,
      "choices": ["常駐", "リモート", "ハイブリッド"]
    },
    {
      "type": "multiplechoice",
      "title": "Java 技術理解度",
      "required": true,
      "helpText": "自己評価を選んでください。",
      "choices": "技術-理解度軸"
    },
    {
      "type": "checkbox",
      "title": "保有資格",
      "required": false,
      "choices": [
        { "label": "基本情報技術者", "score": 1 },
        { "label": "応用情報技術者", "score": 2 },
        { "label": "AWS SAA", "score": 2 },
        { "label": "LPIC-1", "score": 1 }
      ]
    },
    {
      "type": "list",
      "title": "現在の稼働可否(テンプレ参照)",
      "required": true,
      "choices": "Yes/No"
    },
    {
      "type": "grid",
      "title": "業務理解度",
      "required": true,
      "helpText": "各業務の理解度を自己評価してください。",
      "rows": "業務テンプレ",
      "columns": "業務-理解度軸"
    },
    {
      "type": "checkboxgrid",
      "title": "技術経験",
      "required": false,
      "helpText": "経験レベルを該当箇所に複数チェック可。",
      "rows": "Java系テンプレ",
      "columns": "技術-経験軸"
    },
    {
      "type": "multiplechoice",
      "title": "勤怠申請の理解度",
      "required": false,
      "choices": "業務-理解度軸"
    },
    {
      "type": "pagebreak",
      "title": "自由記述・補足",
      "helpText": "最後に自由記述です。"
    },
    {
      "type": "paragraph",
      "title": "補足・希望・今後の学習計画",
      "required": false
    }
  ]
}

終わりに

少し調べた感じだとテキストからGoogleFormを作るエンジンを作っている人はいなさそうだったので自前で作りました。といっても実装はほぼAI…。

Qiita初投稿でしたが誰かの役に立てばと思います。



2025/12/09 追記

事前にJSONをアップロードするのが手間なのと、AIが生成してきたJSONをそのままペタっと貼り付けて作りたいと思い、モードを2つ追加しました。

  • JSONを直接入力してフォーム作成
  • JSONをアップロードしてフォーム作成(ローカルファイルを選んでアップロードしつつ、それをつかってフォーム作成)

モード追加.png

アップロードをスプレッドシート上の操作で完結できるのは単純に楽なのと、JSONの仕様を喰わせたGoogleForms生成専用のGPTsを作ったらめちゃくちゃいい感じで感動していたんですが、

「むしろこんな中間で手作業を挟まずともアンケート生成くらいGPTsだけでできるのでは?」

と思い調べてみると…

ありました。しかも一年以上前から……
ま、まぁ中間ファイルとしてJSONファイルができるから、あえてアンケート構造をGit管理とかしたい人には需要あるかもしれないから…

リサーチは大事ですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?