Googleフォームの文章問題をAIで自動採点する仕組みを作ってみた

Googleフォームの文章問題をAIで自動採点する仕組みを作ってみた

2026.02.19

はじめに

クラスメソッドオペレーションズの藤本です。

皆さん、Google フォームでテストを作った時に、記述式(短文)・段落 形式の問題も自動採点できたらな…と思ったことは無いでしょうか?

選択問題や、記述式でも正規表現を使うことである程度自動採点は可能です。
ですが、ある程度の長さを記述する問題になってくると、どうしても手動チェックが必要になります。
この作業を少しでも楽にできたら…
チェック観点に基づいて自動採点してくれる機能があれば…
と思ったので、AIを組み合わせて実装してみました。

システム構成

今回の構成はシンプルに下記の内容で作りました

Googleフォーム
  ↓(送信トリガー)
Google Apps Script
  ↓(評価依頼)
AI API(Bedrock / OpenAI / Claude など)
  ↓(評価結果)
Google Apps Script
  ↓(ログ出力)
ログ確認

実装

Googleフォームの準備

  1. Google フォームを新規作成
  2. 回答形式を段落(もしくは記述式(短文))で質問を追加

今回はサンプルとして、国語の文章問題風な例題を用意しました
formcheck_01

Google Apps Script の作成

  1. Google フォーム右上の「︙」 > 「Apps Script」
  2. APIキーをスクリプトプロパティに設定
プロパティ
AI_API_KEY お手持ちのAPIキー

formcheck_02

formcheck_03

  1. コード作成
    今回は Bedrock で Sonnet 4.6 を呼び出してみます

参考:
[アップデート]Amazon BedrockでAPIキー管理が簡単になりました
Claude Sonnet 4.6 が Amazon Bedrock で利用可能になりました

function onFormSubmit(e) {
  // 回答を取得(最初の質問の回答)
  const answer = e.response.getItemResponses()[0].getResponse();

  // AIで評価
  const evaluation = evaluateWithAI(answer);

  // 結果をログに出力
  console.log('=== AI評価結果 ===');
  console.log(JSON.stringify(evaluation, null, 2));

}

//AIで回答を評価

function evaluateWithAI(answer) {
  const prompt = `以下の回答を評価してください。

【質問】
次の文章を読んで、問いに答えなさい。

Aさんは深夜、本番環境に設定変更を適用した。作業手順書は完璧だったし、ステージング環境でも問題はなかった。しかし変更直後、サービスが停止した。翌朝、原因はステージングだけに存在したダミーデータの影響だとわかった。Aさんは「手順は正しかった」と思いながらも、しばらく自分を責め続けた。

問い: 手順が正しかったにもかかわらず、Aさんが自分を責め続けたのはなぜだと思いますか。あなたの考えを書きなさい。

【受験者の回答】
${answer}

【評価してほしいこと】
1.結果への責任感:手順の正しさと、障害が発生したという結果は別の問題であることを踏まえ、Aさんが結果に対して責任を感じていることに触れているか
2.想定外へのリスク認識:ステージングと本番の環境差というリスクに気づけなかったことへの後悔が読み取れているか
3.自分の言葉で書けているか:本文をそのまま写すのではなく、自分なりの表現になっているか

簡潔に評価してください`;

  return callAI(prompt);
}

function callAI(prompt) {
  const region = 'ap-northeast-1';
  const modelId = 'jp.anthropic.claude-sonnet-4-6';
  const url = `https://bedrock-runtime.${region}.amazonaws.com/model/${modelId}/converse`;

  const payload = {
    messages: [{ role: "user", content: [{ text: prompt }] }],
    inferenceConfig: { maxTokens: 1000 }
  };

  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${PropertiesService.getScriptProperties().getProperty('AI_API_KEY')}`
    },
    payload: JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(url, options);
  const result = JSON.parse(response.getContentText());

  return result.output.message.content[0].text;
}
  1. トリガーの設定
    フォームから回答を送信した時に実行されるようにトリガーを設定して保存します

トリガー > トリガーの追加

項目名 設定内容
実行する関数を選択 onFormSubmit
イベントのソースを選択 フォームから
イベントの種類を選択 フォーム送信時

formcheck_04

formcheck_05

実行

では、公開して実際に動かしてみましょう
フォームに回答を記入し送信します。
※今回は間違った回答例を入力してみました。

formcheck_06

実行が済んだら、どのような結果が返ってきたかログを見てみましょう

formcheck_07

## 評価

**1. 結果への責任感:△**
「サービスが止まったから責めた」という表面的な言及はあるが、「手順の正しさと結果の責任は別」という核心には踏み込めていない。

**2. 想定外へのリスク認識:×**
「運が悪かった」と片付けており、環境差に気づけなかったことへの後悔という視点がまったく読み取れていない。

**3. 自分の言葉で書けているか:△**
「かわいそう」など一部自分の言葉はあるが、本文の言葉をほぼなぞる構成にとどまっており、自分なりの考察とは言いがたい。

---

**総評**
問いは「なぜ自分を責め続けたのか」という**理由の考察**を求めているが、回答は事実の言い換えと感想にとどまっている。責任感・後悔・プロ意識といった内面への掘り下げがなく、問いに正面から答えられていない。

しっかり評価して欲しい観点にあわせてAIが回答してくれていますね

あとはこの結果を、用途にあわせてスプレッドシートに結果を書き出したり、Slack に通知させたりと自由にカスタマイズすればOKです。

最後に

回答結果をそのまま鵜呑みにすることはまだできませんが、プロンプトを工夫することで、一次確認として十分に活用できる精度が期待できます。
一次確認をしてくれるだけで、人がチェックするポイントがかなり絞られるので確認・採点にかかる時間の短縮に繋がるはずです。是非お試しください。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。

運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。

当社は様々な職種でメンバーを募集しています。

「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 採用サイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事