以前、GASで作る「相互評価システム」 という記事を公開しました。
これはチームメンバー同士で評価し合うためのシンプルなアプリでした。
今回、このコードをベースに 「AntiGravity上の Claude Opus 4.5」 とペアプログラミング(というかほぼ丸投げ)を行い、「授業評価アンケート(生徒が授業・教員を評価するアプリ)」 へと大規模なリファクタリングを行いました。
驚くべきことに、たった10回の指示 で、データベース構造の変更から、権限による画面の出し分け、変数のリネームまで完遂できました。そのプロセスと完成したシステムを公開します。
なお、無料枠で制限にかかることなく構築できました。
🎯 ビフォーアフター
Before: 相互評価システム
- 誰が: チームメンバー全員が
- 誰を: 他のメンバーを
- どうする: 評価する(フラットな関係)
After: 授業評価アンケート
🤖 Claude Opus 4.5 への10の指示(プロンプト)
実際にAIに投げた指示の全貌です。これだけでアプリが変貌していく様は圧巻でした。
Phase 1: データベースと基本構造の変更
まず、相互評価(Member to Member)から、授業評価(Student to Teacher/Subject)へ構造を変えます。
指示1
このプログラムは相互評価をするためのWebアプリである。これを授業評価のためのアプリに改修する。手始めに生徒が教員の授業を評価する枠組みを実装する。
①スプレッドシートメンバーを生徒名簿にリネーム(列1:生徒メールアドレス、列2:生徒氏名、列3:学籍番号)とする。
②スプレッドシート科目担当DBを追加(列1:教員メールアドレス、列2:教員名、列3:教科、列4:科目)
index.htmlのセクション"targetSelectionSection"の冒頭に教科のリストボックス、科目のリストボックス、教員のリストボックスおよび「追加」ボタンを1行で追加する。
初期データを読み込む際、教科担当DBの配列を追加で読み込む。教科担当DBから教科のリストボックスに重複のない教科をセットする。教科が変更されたら教科に含まれる科目を科目リストボックスにセットする。さらに科目が変更されたら教員のリストボックスに科目に含まれる教員名をセットする。
教科、科目、教員がセットされた状態で追加ボタンが押されたら評価シートに列を追加する。
指示2
追加で相互評価データは授業評価データとリネームして、一意のデータを保存するために列を追加する。
列1:タイムスタンプ、列2:生徒メールアドレス、列3:教員メールアドレス、列4:科目(追加)、列5以降:授業評価データ。
1行目、2行目の利用方法はそのままにする。
Phase 2: UI/UXの調整
生徒が評価すべき対象(履修科目)だけを表示・管理できるようにします。
指示3
評価対象の選択テーブルでは現状のすべての対象を表示するのではなく、授業評価データに存在する対象のみを表示する(表示内容は教科名、科目名、教員名、タイムスタンプとする)。
指示4
実装を開始してください。
※生徒のメールアドレスのないレコードを生成したので修正のための指示
指示5
追加ボタンで新たな科目を追加する場合生徒のメールアドレスも併せて追加する。そして、生徒が評価を入力したらその列を上書きするように変更してください。
指示6
評価対象の選択画面で登録されている科目教員の表の一番右に削除ボタンを追加し、レコードを削除する機能を追加してください。
Phase 3: 権限管理とリファクタリング
ここがAIの真骨頂でした。「教員」と「生徒」で画面を出し分け、さらにコードの意味的な整合性を取るためのリネームを行わせました。
指示7
結果表示は教員のみが閲覧可能。初期データの取得時に生徒か教員かをuserRoleでHTMLが受け取るようにする。そしてuserRoleがstudentの時は現在の動作をするようにする。
もし、教員の場合は自分のすべての担当科目を評価対象の選択と同等の一覧表示をする。(削除ボタン、科目の追加は不要)表示は教科名、科目名、評価人数とする。そして行がクリックされたとき、該当科目の評価を表示する。
指示8
ここまでの修正で関数名、HTML要素のID、HTMLのクラスの名前が実態と乖離したものができました。現状と意味が合致するよう変数名等を変更してください。
※この指示8で、targetSelection → subjectSelection や memberData → studentData のような面倒な置換を完璧にやってくれました。
Phase 4: 集計機能とアクセスコントロール
最後に、管理者が使う集計機能と、期間外のロック機能を実装。
指示9
ラジオボタンでの評価の平均点を算出したい。シート授業評価データの1行目E列以降を担当教員DB1行目E列以降にコピーし教員のメールアドレス、科目名によってスコアを集計し、担当教員DBの2列目以降に設問ごとの平均点を張り付けてください。
関数はメニュー結果集計の評価結果の集計で実行できるようにしてください。また集計結果をクリアするメニュー集計結果クリアも実装してください。
指示10
Webアプリで教員が集計結果を見られるのはシート設定で結果閲覧可能(B4)がYesの場合のみとしてください。また、生徒が入力できない場合、教員が閲覧できない場合は「現在入力(閲覧)はできません」と表の代わりに表示するようにしてください。
🚀 完成した「授業評価アンケート」
こうして完成したのが以下のシステムです。
📂 スプレッドシート構成
- 設定: 期間設定など
- 生徒名簿: 生徒の管理(Email, 学年, クラス, 番号, 氏名)
- 科目担当DB: 教員と科目のマスタ(兼 集計結果出力先)
- 授業評価データ: 生徒からの回答ログ
-
教員基礎データ:科目担当DBを生成するためのシート(メニュー初期設定でDB作成)
自分で書いたのは初期設定でDBを作成する部分と学籍番号を年、組、番に変更したところのみです。
💻 Webアプリの挙動
-
生徒でログインした場合:
- 3つのプルダウン(教科・科目・教員)から、自分の履修科目を選択して「追加」
- 追加された科目リストから、評価を入力
-
教員でログインした場合:
- 自分が担当する科目の一覧が表示される
- 科目をクリックすると、生徒からの評価結果(グラフ・コメント)を閲覧できる
📦 配布用テンプレート
以下のスプレッドシートをコピーすれば、すぐに試すことができます。
スクリプトも全て実装済みです。(なお、生徒名簿についてはメールアドレス、学年、クラス、番号、氏名に変更しています)
👉 【テンプレート】授業評価アプリ
MITライセンスで配布します。著作権 (c) 2025 Shigeru Suzuki
ソフトウェアは「現状のまま」提供され、明示的または黙示的な保証は一切ありません。
ご質問や改善提案があれば、この記事のコメントでお知らせください。
導入手順
- 上記シートをコピー
-
生徒名簿にテスト用の(WorkSpeceのテナントの)生徒アカウントを登録 -
教員基礎データにテスト用の教員データと教科、科目を登録 -
メニュー初期設定で科目担当DB作成を実行 - 「拡張機能」>「Apps Script」からデプロイ(Webアプリとして公開)
💭 AI駆動開発の感想
今回特に感動したのは以下の点です。
- 文脈の理解力: 「相互評価を授業評価にする」という抽象的な目的を維持したまま、DBのカラム追加などを適切に処理してくれた
- リファクタリングの精度: 指示8の「変数名の変更」は、人間がやると置換ミスが起きやすい作業ですが、AIは依存関係を壊さずに綺麗に書き換えてくれました
-
GAS特有の知識:
LockServiceやdoGetの仕組みを維持したまま機能拡張してくれました
「作りたいもの」の仕様さえ言語化できれば、実装コストは劇的に下がることを実感しました。
皆さんもぜひ、AIを相棒にGAS開発を楽しんでみてください!
Created with AntiGravity & Claude Opus 4.5



