const data = sheet.getDataRange().getValues().slice(1); // skip headers
const form = FormApp.create(quizTitle).setTitle(quizTitle);
const folderName = `Quiz Forms - ${new Date().getFullYear()}`;
const formFolder = getOrCreateFolderByName(folderName);
DriveApp.getFileById(form.getId()).moveTo(formFolder);
form.setIsQuiz(true)
.setRequireLogin(true)
.setLimitOneResponsePerUser(true)
.setAllowResponseEdits(false)
.setPublishingSummary(false)
.setShowLinkToRespondAgain(false)
.setConfirmationMessage("Your response has been recorded.")
.setShuffleQuestions(false);
form.addTextItem().setTitle("Full Name").setRequired(true);
const correctAnswerMap = {};
const questionTitles = [];
data.forEach(row => {
const question = (row[0] || '').toString().trim();
const choices = row.slice(1, 5).map(c => (c || '').toString().trim());
const correctChar = (row[5] || '').toString().trim().toUpperCase();
const points = Number(row[6]) || 0;
const correctIndex = ['A', 'B', 'C', 'D'].indexOf(correctChar);
if (!question || correctIndex === -1 || !choices[correctIndex]) return;
const item = form.addMultipleChoiceItem().setTitle(question);
const opts = choices.map((choice, idx) =>
choice ? item.createChoice(choice, idx === correctIndex) : null
).filter(Boolean);
item.setChoices(opts).setPoints(points);
correctAnswerMap[question] = choices[correctIndex];
questionTitles.push(question);
});
// Store correct answers in script properties
PropertiesService.getDocumentProperties().setProperty(quizTitle, JSON.stringify(correctAnswerMap));
const resultsSheetName = `${quizTitle} - Results`;
const resultsSheet = ss.getSheetByName(resultsSheetName) || ss.insertSheet(resultsSheetName);
resultsSheet.clear();
const publicUrl = form.getPublishedUrl();
const timestamp = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "yyyy-MM-dd HH:mm");
resultsSheet.getRange("A1:B1").merge().setValue(`${quizTitle} - Generated ${timestamp}`);
resultsSheet.getRange("C1:G1").merge()
resultsSheet.getRange("C1").setValue(publicUrl);
resultsSheet.getRange("A1:G1")
.setFontSize(8)
.setWrap(false)
.setVerticalAlignment("middle");
const allHeaders = ["Name", ...questionTitles, "Correct Count", "Wrong Count"];
resultsSheet.getRange(2, 1, 1, allHeaders.length).setValues([allHeaders]);
resultsSheet.getRange(2, 1, 1, allHeaders.length)
.setFontWeight("bold")
.setBackground("#f1f1f1");
resultsSheet.setColumnWidths(2, 16, 133);
resultsSheet.setColumnWidth(1, 139);
resultsSheet.getRange('B2:Q2').setWrapStrategy(SpreadsheetApp.WrapStrategy.WRAP)
resultsSheet.getRange("2:2").setVerticalAlignment('bottom');
resultsSheet.setRowHeight(2, 51);
resultsSheet.setFrozenRows(2);
resultsSheet.getRange(3, 1, resultsSheet.getMaxRows() - 2, allHeaders.length).setWrap(true);
resultsSheet.getRange("1:1").setWrap(false);
applyZebraStriping(resultsSheet, allHeaders.length);
ScriptApp.newTrigger("syncQuizResponsesToSheet")
.forForm(form)
.onFormSubmit()
.create();
}
function syncQuizResponsesToSheet(e) {
const response = e.response;
const items = response.getItemResponses();
const formTitle = e.source.getTitle();
const correctMap = JSON.parse(PropertiesService.getDocumentProperties().getProperty(formTitle) || "{}");
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(`${formTitle} - Results`);
const headers = sheet.getRange(2, 1, 1, sheet.getLastColumn()).getValues()[0];
let name = "";
const answers = [];
let correctCount = 0;
items.forEach((item, i) => {
const title = item.getItem().getTitle();
const answer = item.getResponse();
if (i === 0 && headers[0] === "Name") {
name = answer;
} else {
const correctAns = correctMap[title];
const isCorrect = answer === correctAns;
answers.push((isCorrect ? "✅" : "❌") + " " + answer);
if (isCorrect) correctCount++;
}
});
const wrongCount = answers.length - correctCount;
const row = [name, ...answers, correctCount, wrongCount];
sheet.appendRow(row);
}
function getOrCreateFolderByName(name) {
const folders = DriveApp.getFoldersByName(name);
return folders.hasNext() ? folders.next() : DriveApp.createFolder(name);
}
function applyZebraStriping(sheet, colCount) {
const range = sheet.getRange(3, 1, sheet.getMaxRows() - 2, colCount);
range.applyRowBanding(SpreadsheetApp.BandingTheme.LIGHT_GREY).setHeaderRowColor("#f1f1f1");
}
function exportResultsData() {
const sheet = SpreadsheetApp.getActiveSheet();
const ui = SpreadsheetApp.getUi();
const lastRow = sheet.getLastRow();
const lastCol = sheet.getLastColumn();
try {
if (lastRow < 3) throw new Error("No data to export.");
const headers = sheet.getRange(2, 1, 1, lastCol).getValues()[0];
const data = sheet.getRange(3, 1, lastRow - 2, lastCol).getValues();
const csv = [headers, ...data].map(row => row.join(",")).join("\n");
const blob = Utilities.newBlob(csv, "text/csv", `${sheet.getName()}.csv`);
DriveApp.createFile(blob);
ui.toast("CSV export complete.");
} catch (err) {
ui.alert("Export Failed", err.message, ui.ButtonSet.OK);
}
}
// FORMULA FOR CELL G2: =ARRAYFORMULA(IF(A2:A<>"", ROUNDDOWN(100/COUNTA(A2:A), 0), ""))