Googleフォームのクイズ採点をGASで自動化

GASGoogleフォーム教育
Googleフォームのクイズ採点をGASで自動化のサムネイル

Googleフォームのクイズ採点をGASで自動化

こんにちは、GASおじです。今回はGoogleフォームのクイズ機能を使っている中小企業の経営者やフリーランスの皆さん向けに、「採点作業をGoogle Apps Script(GAS)で自動化する方法」を解説していくよ。手作業の見直しは時間もコストもかかるけど、GASならGoogleアカウントの利用枠内で追加の専用SaaS料金なし(※Apps Scriptのquota・実行上限はあるので注意)で効率化できる。

おじさん自身、SaaS課金には厳しいので、できるだけ既存データを消さずに安全に処理する方法を重視している。実は採点結果は新しい日時付きシートに書き出す形にして、元データはそのままキープ。バックアップやロールバックにも対応しているから安心して使ってほしい。

初期設定と必要権限

まずはGoogleフォームの回答が自動でスプレッドシートに集まる状態にしておこう。Googleフォームの「回答」タブから「スプレッドシートにリンク」を設定すればOK。

次に、GASでスクリプトを作成し、以下の権限を付与する必要がある。

  • スプレッドシートの読み書き権限
  • Googleフォームの読み取り権限(必要に応じて)

また、採点処理を自動化したいなら「トリガー」から「時間主導型トリガー」や「フォーム送信時トリガー(installable trigger)」を設定しよう。installable triggerは手動で設定しないと動かないから注意してね。

入力検証とバッチ書き込みのポイント

採点の自動化でありがちなミスは「誤ったデータに対して処理をしてしまうこと」。だから、

  • フォーム回答の必須項目やフォーマットをチェック
  • 採点ルールに合わない回答はスキップまたはエラー記録

を必ず行う。さらに、スプレッドシートへの書き込みは1行ずつ処理するとAPI制限に引っかかりやすいから、バッチ(まとめて)処理がおすすめだ。

バックアップ&ロールバックの仕組み

もし間違ったスクリプトを実行しても、既存データはそのまま。新しいシートに結果を書き出すので、

  • 元データは消えずに残る
  • 新シートを削除すればロールバック可能
  • バックアップとしても利用できる

という利点がある。削除APIを使わずに済むから安心だね。

実際のコード例

以下は、

  • フォーム回答シートから回答を取得
  • 正解と照合して採点
  • バッチで新しい日時付きシートに結果を書き出す

サンプルコードだ。禁止APIは使わずに安全に設計している。

function gradeQuizAndWriteResults() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const formResponsesSheet = ss.getSheetByName('フォームの回答 1'); // フォーム回答シート名
  if (!formResponsesSheet) {
    Logger.log('回答シートが見つかりません。');
    return;
  }

  // 採点基準(例:設問ごとの正解)
  const correctAnswers = {
    2: '東京',    // B列の回答が「東京」なら正解
    3: '富士山',  // C列の回答が「富士山」なら正解
    // 必要に応じて追加
  };

  const dataRange = formResponsesSheet.getDataRange();
  const values = dataRange.getValues();

  // ヘッダー行を含むため2行目から開始
  const results = [];
  results.push(['タイムスタンプ', '氏名', '得点', '詳細']); // ヘッダー

  for (let i = 1; i < values.length; i++) {
    const row = values[i];
    const timestamp = row[0];
    const name = row[1];
    if (!name) {
      // 名前が空ならスキップ
      continue;
    }

    let score = 0;
    let detail = [];

    // 採点処理(2列目以降が回答)
    for (const colIndex in correctAnswers) {
      const correct = correctAnswers[colIndex];
      const answer = row[colIndex];
      if (answer === '') {
        detail.push(`Q${colIndex}: 未回答`);
      } else if (answer === correct) {
        score++;
        detail.push(`Q${colIndex}: 正解`);
      } else {
        detail.push(`Q${colIndex}: 不正解`);
      }
    }

    results.push([timestamp, name, score, detail.join(', ')]);
  }

  // 新しいシート名に日時を付与
  const dateStr = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
  const resultSheetName = `採点結果_${dateStr}`;
  const resultSheet = ss.insertSheet(resultSheetName);

  // バッチで書き込み
  resultSheet.getRange(1, 1, results.length, results[0].length).setValues(results);

  Logger.log(`採点完了。結果はシート「${resultSheetName}」に出力されました。`);
}

ポイントまとめ

  • 既存回答シートを上書きせず、結果は新シートに保存
  • 空欄や不正回答を検証してスキップ・記録
  • まとめて書き込みでAPI制限回避
  • トリガー設定で自動化可能
  • 手動で新シートを削除すればロールバック可

導入による仮想的なコスト削減例

例えば、1回の採点に10分かかっていたとして、月に20回実施すると200分の工数削減。時給2000円換算だと、

200分 ÷ 60分 × 2000円 = 約6666円/月のコスト削減

年間にすると約8万円の節約になる計算だ。ただし、Googleアカウントの利用枠内で実行されるため、Apps Scriptの実行回数や処理時間の上限は超えないように注意が必要。

個人情報の取扱いと復元手順

  • フォーム回答には個人情報が含まれることが多いので、スクリプトは権限を持つユーザーのみが管理・実行すること
  • 結果シートも閲覧権限を適切に設定し第三者に見られないように注意
  • 誤って作成した結果シートは手動で削除することで復元前の状態に戻せる(元の回答シートは触っていないため)

おわりに

Googleフォームのクイズ採点は、GASを使えば手間とコストをぐっと減らせる。今回の方法なら既存データは消さず安全に処理できて、バックアップやロールバックも簡単。Googleアカウントの利用枠内で追加の専用SaaS料金なしで実現可能だから、ぜひ試してみてほしい。

さらに便利なGASツールやノウハウを知りたいなら、GASおじラボのメンバーシップもチェックしてね。

GASおじラボで500ツール使い放題 →