function doGet(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// 1. 참석자 전자서명 등록 내역 (연수등록부 시트)
var signSheet = ss.getSheetByName("연수등록부") || ss.getSheets()[0];
var signData = signSheet.getDataRange().getValues();
var rows = [];
if (signData.length > 1) {
var headers = signData[0];
for (var i = 1; i < signData.length; i++) {
var row = {};
for (var j = 0; j < headers.length; j++) {
row[headers[j]] = signData[i][j];
}
rows.push(row);
}
}
// 2. 관리자가 입력한 사전 소속부서 및 참석자 성명 명단 (참석자명단 시트)
var presetSheet = ss.getSheetByName("참석자명단") || ss.getSheetByName("사전명단");
var presetMembers = [];
if (presetSheet) {
var pData = presetSheet.getDataRange().getValues();
if (pData.length > 1) {
var pHeaders = pData[0].map(function(h) { return String(h).trim(); });
var deptIdx = pHeaders.findIndex(function(h) { return /부서|소속/i.test(h); });
var nameIdx = pHeaders.findIndex(function(h) { return /성명|이름|참석자/i.test(h); });
var roleIdx = pHeaders.findIndex(function(h) { return /직급|직책|역할/i.test(h); });
var noteIdx = pHeaders.findIndex(function(h) { return /비고|메모/i.test(h); });
if (deptIdx === -1) deptIdx = 0;
if (nameIdx === -1) nameIdx = 1;
for (var k = 1; k < pData.length; k++) {
var pRow = pData[k];
var deptVal = String(pRow[deptIdx] || "").trim();
var nameVal = String(pRow[nameIdx] || "").trim();
if (deptVal || nameVal) {
presetMembers.push({
department: deptVal || "미지정",
name: nameVal,
role: roleIdx !== -1 ? String(pRow[roleIdx] || "").trim() : "",
note: noteIdx !== -1 ? String(pRow[noteIdx] || "").trim() : ""
});
}
}
}
}
return ContentService.createTextOutput(JSON.stringify({
status: "success",
data: rows,
presetMembers: presetMembers
})).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
function doPost(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var postData = JSON.parse(e.postData.contents);
// [관리자 액션] 웹앱의 부서 및 성명 명단을 스프레드시트에 저장 / 시트 생성
if (postData.action === "syncPresetMembers" && Array.isArray(postData.members)) {
var targetSheet = ss.getSheetByName("참석자명단");
if (!targetSheet) {
targetSheet = ss.insertSheet("참석자명단");
}
targetSheet.clear();
targetSheet.appendRow(["소속부서", "참석자성명", "직급", "비고"]);
var rowsToAppend = postData.members.map(function(m) {
return [m.department || "", m.name || "", m.role || "", m.note || ""];
});
if (rowsToAppend.length > 0) {
targetSheet.getRange(2, 1, rowsToAppend.length, 4).setValues(rowsToAppend);
}
return ContentService.createTextOutput(JSON.stringify({
status: "success",
message: "참석자명단 시트에 " + rowsToAppend.length + "명의 명단이 저장되었습니다."
})).setMimeType(ContentService.MimeType.JSON);
}
// [참석자 액션] 전자서명 등록 제출 (연수등록부 시트에 기록)
var signSheet = ss.getSheetByName("연수등록부") || ss.getSheets()[0];
if (signSheet.getLastRow() === 0) {
signSheet.appendRow(["등록일시", "부서명", "성명", "서명데이터", "연수명", "연수일시", "비고"]);
}
signSheet.appendRow([
postData.registeredAt || new Date().toLocaleString("ko-KR"),
postData.department || "",
postData.name || "",
postData.signature || "",
postData.trainingTitle || "",
postData.trainingTime || "",
postData.note || ""
]);
return ContentService.createTextOutput(JSON.stringify({ status: "success", message: "등록 완료" }))
.setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}