Skip to content

Instantly share code, notes, and snippets.

@ochilab
Created September 29, 2025 07:01
Show Gist options
  • Save ochilab/804b8fa55ee824e5cff3ba45882dac96 to your computer and use it in GitHub Desktop.
Save ochilab/804b8fa55ee824e5cff3ba45882dac96 to your computer and use it in GitHub Desktop.
Google Sheetの情報から GoogleFormを作成するGAS
function createQuizForm() {
var form = FormApp.create('復習テスト'); // フォームのタイトル
form.setIsQuiz(true);
form.setCollectEmail(true); // メールアドレス収集
form.setLimitOneResponsePerUser(true); // 1人1回答
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// シート全体のデータ
var data = sheet.getDataRange().getValues();
// 列数(シートの右端列数)
var col = sheet.getLastColumn();
// B列の実質的な最終行(空白を除外)
var lastRowAll = sheet.getLastRow();
var colBValues = sheet.getRange(1, 2, lastRowAll, 1).getValues(); // 1行目〜最終行のB列
var lastRowB = 0;
for (var r = colBValues.length - 1; r >= 0; r--) {
if (String(colBValues[r][0]).trim() !== '') {
lastRowB = r + 1; // シートの行番号(1始まり)
break;
}
}
// 見出し行(1行目)を除いた問題数
var row = Math.max(0, lastRowB - 1);
for (var i = 1; i <= row; i++) { // 1行目はヘッダーなので2行目(i=1)から
var questionTitle = String(data[i][0]).trim(); // 1列目:問題文
var correctAnswer = String(data[i][1]).trim(); // 2列目:正解ラベル
var point = Number(data[i][2]) || 0; // 3列目:得点(数値化)
// 4列目以降を選択肢として取得(空白除去・トリム)
var choices = data[i]
.slice(3, col) // 0始まりインデックス:3=4列目〜col-1列目まで
.map(function(v){ return String(v).trim(); })
.filter(function(v){ return v !== ''; });
// 問題文または選択肢が不足していればスキップ
if (!questionTitle || choices.length === 0) continue;
// Dropdown(リスト)で作成(MultipleChoiceにしたい場合は addMultipleChoiceItem() に変更)
var item = form.addListItem();
item.setTitle(questionTitle);
var choiceArray = [];
for (var j = 0; j < choices.length; j++) {
var label = choices[j];
var isCorrect = (label === correctAnswer);
choiceArray.push(item.createChoice(label, isCorrect));
}
item.setChoices(choiceArray);
item.setPoints(point);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment