Googleフォームの採点ミスを回答公開前に発見|GASで正解キーをdry-run監査

Googleフォームの採点ミスを回答公開前に発見|GASで正解キーをdry-run監査

ツールおじ|GoogleアカウントをAIエージェント化

ツールおじ|GoogleアカウントをAIエージェント化

Googleフォームのクイズでは、回答者の操作より前に「正解が空欄」「配点が0」「同じ選択肢が重複」といった設定ミスが紛れ込みます。この記事ではフォームを変更せず、正解キー用シートを読み取って問題候補だけをログへ出す無料GASを紹介します。

先に知っておきたいこと

  • この例はスプレッドシート上の正解キーを監査します。Googleフォーム本体や回答は変更しません。
  • 回答者名、メールアドレス、回答内容は読み取りません。
  • 問題文と選択肢は検証用コピーで試し、実運用前にフォーム画面でも目視確認してください。

準備するシート

`QuizKey` シートの1行目に、次の列を用意します。

  • question_id:問題を識別する任意のID
  • question:問題文
  • choices:選択肢を半角縦線 `|` で区切った文字列
  • correct_answer:正解として登録する選択肢
  • points:配点(1以上の整数)
  • enabled:採点対象なら TRUE

例として、2行目へ `Q001 / 日本の首都は? / 東京|大阪|京都 / 東京 / 1 / TRUE` を入力します。

コピーして使える最小コード

次のコードは監査だけを行います。`DRY_RUN` は常に true とし、シートやフォームを書き換える処理は含めていません。

function auditGoogleFormsQuizKeyFree() {
  const DRY_RUN = true;
  const SHEET_NAME = 'QuizKey';
  const MAX_ROWS = 200;
  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error('QuizKey シートが見つかりません。');

  const values = sheet.getDataRange().getDisplayValues();
  if (values.length < 2) throw new Error('監査するデータ行がありません。');
  if (values.length - 1 > MAX_ROWS) throw new Error('200行を超えています。範囲を分けて確認してください。');

  const expected = ['question_id', 'question', 'choices', 'correct_answer', 'points', 'enabled'];
  const header = values[0].map(value => value.trim());
  if (expected.some((name, index) => header[index] !== name)) {
    throw new Error('列名または列順がテンプレートと一致しません。');
  }

  const idSeen = new Set();
  const findings = [];
  values.slice(1).forEach((row, index) => {
    const rowNumber = index + 2;
    const [idRaw, questionRaw, choicesRaw, answerRaw, pointsRaw, enabledRaw] = row;
    if (String(enabledRaw).trim().toUpperCase() !== 'TRUE') return;

    const id = idRaw.trim();
    const question = questionRaw.trim();
    const choices = choicesRaw.split('|').map(value => value.trim()).filter(Boolean);
    const answer = answerRaw.trim();
    const points = Number(pointsRaw);

    if (!id) findings.push({ row: rowNumber, issue: 'question_id が空欄' });
    if (id && idSeen.has(id)) findings.push({ row: rowNumber, issue: 'question_id が重複' });
    if (id) idSeen.add(id);
    if (!question) findings.push({ row: rowNumber, issue: '問題文が空欄' });
    if (choices.length < 2) findings.push({ row: rowNumber, issue: '選択肢が2件未満' });
    if (new Set(choices).size !== choices.length) findings.push({ row: rowNumber, issue: '選択肢が重複' });
    if (!answer) findings.push({ row: rowNumber, issue: '正解が空欄' });
    if (answer && !choices.includes(answer)) findings.push({ row: rowNumber, issue: '正解が選択肢に存在しない' });
    if (!Number.isInteger(points) || points < 1) findings.push({ row: rowNumber, issue: '配点が1以上の整数ではない' });
  });

  console.log(JSON.stringify({ dryRun: DRY_RUN, checkedRows: values.length - 1, findingCount: findings.length, findings }));
  return findings;
}

実行手順

1. 元の正解キーをコピーした検証用スプレッドシートを開きます。

2. 拡張機能からApps Scriptを開き、コードを貼り付けます。

3. `auditGoogleFormsQuizKeyFree` を選び、少量のサンプルで実行します。

4. 実行ログの `findingCount` と行番号を確認し、シート側を手動で修正します。

5. 指摘が0件でも、フォームの正解・配点・公開範囲を画面で再確認してから回答受付を始めます。

失敗しやすい点と停止条件

  • 選択肢中の `|` は区切りとして扱うため、選択肢本文には使えません。
  • 記述式や複数正解には対応していません。別ルールを足すまでは適用を止めてください。
  • 表示文字が同じでも全角・半角や余分な空白が異なると別の値になります。
  • 200行を超えた場合は停止します。対象を分け、実行時間上限にも注意してください。
  • ログには問題文や正解を出さず、行番号と問題種別だけを残します。

公開前チェックリスト

  • 元のフォームや回答をコードから変更していない
  • テスト用コピーで権限とログを確認した
  • 正解・配点・公開範囲をフォーム画面でも目視した
  • 個人情報、回答内容、認証情報をログへ出していない

まとめ

採点の自動化より先に、正解キーの空欄・重複・配点ミスを読み取り専用で洗い出すと、誤採点を公開前に止めやすくなります。まずは検証用コピーと少量データで確認してください。

関連する有料Tips「個人クリエイター公開準備チェックGAS Pro」を見る

GasおじのTips商品一覧を見る

※学習・検証用の例です。実データへ適用する前にコピー環境で確認してください。Google公式・Google公認の商品ではありません。


あなたも記事の投稿・販売を
始めてみませんか?

Tipsなら簡単に記事を販売できます!
登録無料で始められます!

Tipsなら、無料ですぐに記事の販売をはじめることができます Tipsの詳細はこちら
 

この記事のライター

ツールおじ|GoogleアカウントをAIエージェント化

おう、Gasおじだ。 AIツールとSaaSに散々突っ込んで遠回りした結果、最後に強かったのは「今あるGoogleアカウント」だった。 今ではAIエージェントであらゆるタスクを自動化して無双してるぞ。 GAS、スプレッドシート、フォーム、Gmail、AIエージェントを組み合わせれば、個人でも小さな会社でも、手作業だらけの業務はかなり自動化できる。 ここでは机上のAI論じゃなく、現場で動くテンプレ、コード、手順だけを置いていくぞ。 高いツールを増やす前に、まずお前さんのGoogleアカウントを仕事するエージェントに変えようじゃないか。

このライターが書いた他の記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
  • あとで見るURLを二重登録しない|GASで読書・動画ウォッチリストをdry-run監査

  • Google Driveのフォルダを一括作成する前に確認|GASのdry-run付き安全テンプレート

関連のおすすめ記事

  • Gmailの定型連絡を「送信せず」まとめて下書き化する|Gmail下書きテンプレGAS Pro

    ¥2,980
    1 %獲得
    (29 円相当)
    ツールおじ|GoogleアカウントをAIエージェント化

    ツールおじ|GoogleアカウントをAIエージェント化

  • 【Python】 Con-Que 【データベース接続】

    ¥3,000
    1 %獲得
    (30 円相当)
    GoGorilla

    GoGorilla

  • USBメモリで持ち運べるLinux Mint 22.1と永続的な書き込み領域の作成法【Rufus だけで作成する方法を初心者向けに徹底解説】

    ¥500
    1 %獲得
    (5 円相当)
    SmartSenior

    SmartSenior