/**
* [OX 퀴즈 백엔드 API]
* 작성자: Tech Kwon's Partner
* 기능: 문제 데이터 제공(GET) 및 결과 저장(POST)
*/
// ==========================================
// 1. 설정 영역 (Configuration)
// ==========================================
const SHEET_QUIZ = "문제은행"; // 문제 시트 이름
const SHEET_RESULT = "활동결과"; // 결과 저장 시트 이름
// ==========================================
// 2. GET 요청 처리: 문제 데이터 가져오기
// ==========================================
function doGet(e) {
// 요청 파라미터 확인 (예: ?code=1234)
const params = e.parameter;
const searchCode = params.code;
// 코드가 없으면 에러 반환
if (!searchCode) {
return responseJSON({ result: "error", message: "참여 코드가 없습니다." });
}
try {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_QUIZ);
// 데이터 범위 가져오기 (헤더 제외하고 데이터만 처리)
const lastRow = sheet.getLastRow();
if (lastRow < 2) {
return responseJSON({ result: "error", message: "등록된 문제가 없습니다." });
}
// A열(코드)부터 D열(정답)까지 데이터 가져오기
// getValues()는 2차원 배열을 반환합니다. [[Code, "", Question, Answer], ...]
const data = sheet.getRange(2, 1, lastRow - 1, 4).getValues();
// 코드(A열, 인덱스 0)가 일치하는 행만 필터링
// map을 사용하여 필요한 데이터(문제, 정답)만 추출
// 구조: A(0), B(1), C(2:문제), D(3:정답)
const quizList = data
.filter(row => String(row[0]) === String(searchCode)) // 코드 일치 여부 확인 (문자열 비교)
.map(row => ({
q: row[2], // C열: 문제
a: row[3] // D열: 정답 (O/X)
}));
// [보안] 일치하는 코드가 하나도 없으면 에러 반환
if (quizList.length === 0) {
return responseJSON({ result: "error", message: "유효하지 않은 참여코드입니다." });
}
// 성공 시 JSON 배열 반환
return responseJSON(quizList);
} catch (err) {
// 서버 내부 오류 처리
return responseJSON({ result: "error", message: err.toString() });
}
}
// ==========================================
// 3. POST 요청 처리: 점수 저장하기
// ==========================================
function doPost(e) {
try {
// 전달받은 JSON 데이터 파싱
// 내용: { "code": "...", "name": "...", "score": 100 }
const postData = JSON.parse(e.postData.contents);
const code = postData.code;
const name = postData.name;
const score = postData.score;
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_RESULT);
// 현재 시간 (KST 포맷)
const timestamp = Utilities.formatDate(new Date(), "GMT+9", "yyyy-MM-dd HH:mm:ss");
// 시트에 행 추가 [날짜, 코드, 이름, 점수]
sheet.appendRow([timestamp, code, name, score]);
// 성공 응답 반환
return responseJSON({ result: "success" });
} catch (err) {
return responseJSON({ result: "error", message: err.toString() });
}
}
// ==========================================
// 4. 유틸리티: JSON 응답 생성 헬퍼 함수
// ==========================================
function responseJSON(data) {
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}
/**
* [배포 가이드]
* 1. 우측 상단 '배포(Deploy)' > '새 배포(New deployment)' 클릭
* 2. 유형 선택: '웹 앱(Web app)'
* 3. 설명: 'OX 퀴즈 API v1' 등 입력
* 4. 다음 사용자 권한으로 실행(Execute as): '나(Me)' (교사 계정 권한으로 시트에 접근)
* 5. 액세스 권한(Who has access): ★'누구나(Anyone)'★ 선택 (학생들이 로그인 없이 접근 가능하게 함)
* 6. '배포(Deploy)' 클릭 후 생성된 '웹 앱 URL'을 복사해서 사용하세요.
*/