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の相談や導入サポートを見たい方へ
この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。
■ 関連サービス
GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。