function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var data = JSON.parse(e.postData.contents);
var school = data.school || "";
var className = data.className || "";
var sheetName = school + "_" + className;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
if (!sheet) {
sheet = ss.insertSheet(sheetName);
sheet.appendRow([
"名次", "學校", "班級", "座號", "姓名", "總得分",
"總花費時間(秒)", "格式化時間", "提交時間",
"A關用時", "B關用時", "C關用時", "D關用時"
]);
sheet.getRange("A1:M1").setFontWeight("bold").setBackground("#10b981").setFontColor("#ffffff");
}
var rows = sheet.getDataRange().getValues();
var rowIndex = -1;
for (var i = 1; i < rows.length; i++) {
if (String(rows[i][3]) === String(data.number) && String(rows[i][4]) === String(data.name)) {
rowIndex = i + 1;
break;
}
}
function formatSec(sec) {
if (sec === null || sec === undefined || isNaN(sec) || sec === "") return "未完成";
var m = Math.floor(sec / 60);
var s = sec % 60;
// 💡 在最前面加上單引號 "'"
return "'" + (m < 10 ? "0" + m : m) + ":" + (s < 10 ? "0" + s : s);
}
// 🛑 修正這裡:將 stageA_Seconds 改為 stage_A_Seconds (加上底線)
var rowData = [
0,
data.school,
data.className,
data.number,
data.name,
data.score,
data.timeUsed,
data.timeUsedStr,
data.date,
formatSec(data.stage_A_Seconds),
formatSec(data.stage_B_Seconds),
formatSec(data.stage_C_Seconds),
formatSec(data.stage_D_Seconds)
];
if (rowIndex > -1) {
sheet.getRange(rowIndex, 1, 1, rowData.length).setValues([rowData]);
} else {
sheet.appendRow(rowData);
}
sortAndUpdateSheet(sheet);
return ContentService.createTextOutput(JSON.stringify({"success": true})).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({"success": false, "error": err.toString()})).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
function doGet(e) {
var school = e.parameter.school || "";
var className = e.parameter.className || "";
var sheetName = school + "_" + className;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var records = [];
if (sheet) {
// 💡 將 getValues 改為 getDisplayValues
var rows = sheet.getDataRange().getDisplayValues();
for (var i = 1; i < rows.length; i++) {
if (rows[i][4]) {
// 🛑 修正這裡:同樣將回傳的 Key 加上底線,配合前端讀取
records.push({
school: rows[i][1],
className: rows[i][2],
number: rows[i][3],
name: rows[i][4],
score: rows[i][5],
timeUsed: rows[i][6],
timeUsedStr: rows[i][7],
date: rows[i][8],
stage_A_Time: rows[i][9],
stage_B_Time: rows[i][10],
stage_C_Time: rows[i][11],
stage_D_Time: rows[i][12]
});
}
}
}
return ContentService.createTextOutput(JSON.stringify({"success": true, "records": records})).setMimeType(ContentService.MimeType.JSON);
}
function sortAndUpdateSheet(sheet) {
var range = sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn());
var values = range.getValues();
values.sort(function(a, b) {
if (b[5] !== a[5]) {
return b[5] - a[5];
}
return a[6] - b[6];
});
for (var i = 0; i < values.length; i++) {
values[i][0] = i + 1;
}
range.setValues(values);
}