3시간 걸리던 시험 감독 배정이 3분 만에 — 감독 시간표 자동 편성 (GAS + 구글 시트 백엔드)
⏱️ 정기고사·학업성취도평가 교원 감독 시간표 편성 — 교무부장이 구글 시트에 교사 명단과 시험 시간표(교시·과목)를 넣고 버튼을 누르면 Apps Script가 공정 배분 알고리즘(공강 회피·시간 균등·담임 반 회피)을 실행하여 시트에 자동 편성하고, 교사별 개인 시간표를 추출합니다.
📖 한 줄 정의
Google Apps Script(GAS): 구글 스프레드시트 안에서 실행되는 서버리스 백엔드 스크립트 — 별도 서버 없이 무료로 웹앱을 배포할 수 있습니다.
구글 스프레드시트 = 무료 DB: 교사 명단·감독 배정 결과가 시트에서 실시간 계산·정리되어 교무부장이 엑셀처럼 검토할 수 있습니다.
⚠️ 개인정보·보안 안내 (필독)
이 웹앱은 GAS + 구글 스프레드시트를 활용하여 데이터를 구글 클라우드에 저장합니다.
• 구현 전 반드시 소속 교육청 정보보호 담당과에 사전 문의하세요.
• 이 도구는 교사 전용입니다 — 학생 개인정보를 일절 다루지 않습니다.
1. 3대 핵심 분석 비교표
| 무엇이 바뀌었나요? | 쉬운 설명 | 써보세요! |
|---|---|---|
| 3시간 ➔ 3분 | 교무부장이 손으로 포스트잇 붙여가며 맞추던 감독 시간표를 알고리즘이 3분 만에 배분합니다. | 시트 메뉴에서 "감독 배정 실행" 클릭 ➔ 1초 만에 표 채워짐 |
| 3대 공정 원칙 준수 | ① 감독 횟수 균등 ② 연속 3시간 감독 금지 ③ 담임은 자기 반 감독 제외 규칙을 코드로 보장합니다. | 누적 감독 횟수가 가장 적은 교사 우선 배정 |
| 개인별 시간표 즉시 출력 | 전체 시간표에서 교사별로 필터링된 개인 감독표가 자동 생성되어 배부용 서식이 완성됩니다. | "김선생님: 1일차 2교시(3-1), 2일차 1교시(2-3)" |
2. GAS 실전 구축 가이드
파일 1: Code.gs (백엔드 — 공정 배분 알고리즘)
function onOpen() {
SpreadsheetApp.getUi().createMenu("📋 감독배정")
.addItem("자동 배정 실행", "assignProctors")
.addToUi();
}
function assignProctors() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var tSheet = ss.getSheetByName("교사명단");
var sSheet = ss.getSheetByName("시험시간표");
var rSheet = ss.getSheetByName("배정결과");
var teachers = tSheet.getDataRange().getValues().slice(1); // [이름, 담당학급, 누적감독수]
var schedule = sSheet.getDataRange().getValues().slice(1); // [날짜, 교시, 학급]
rSheet.clearContents();
rSheet.appendRow(["날짜", "교시", "학급", "감독교사"]);
// 감독 횟수 추적
var countMap = {};
teachers.forEach(function(t) { countMap[t[0]] = 0; });
schedule.forEach(function(slot) {
var date = slot[0], period = slot[1], cls = slot[2];
// 정렬: 감독 횟수 적은 순
teachers.sort(function(a, b) { return countMap[a[0]] - countMap[b[0]]; });
var chosen = null;
for (var i = 0; i < teachers.length; i++) {
var t = teachers[i];
// 담임 반 제외 규칙
if (t[1] === cls) continue;
chosen = t[0];
countMap[chosen]++;
break;
}
rSheet.appendRow([date, period, cls, chosen || "미배정"]);
});
SpreadsheetApp.getUi().alert("감독 배정이 완료되었습니다!");
}
파일 2: index.html (교사용 개인 시간표 조회 프런트엔드)
<!DOCTYPE html>
<html lang="ko"><head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>내 감독 시간표</title>
</head><body>
<h2>📋 내 시험 감독 시간표</h2>
<input type="text" id="name" placeholder="교사 이름 입력">
<button onclick="search()">조회</button>
<div id="result"></div>
<script>
var G = "여기에_배포_URL";
function search() {
var name = document.getElementById("name").value;
fetch(G + "?name=" + encodeURIComponent(name))
.then(function(r){return r.json();})
.then(function(d){
var h = "<table border='1'><tr><th>날짜</th><th>교시</th><th>학급</th></tr>";
d.slots.forEach(function(s){ h += "<tr><td>" + s.date + "</td><td>" + s.period + "</td><td>" + s.class + "</td></tr>"; });
document.getElementById("result").innerHTML = h + "</table>";
});
}
</script>
</body></html>
제미나이 전용 에러 제로 프롬프트
[🚨 에러 방지 기본 안전장치]
1. 2개 파일 완결성: Code.gs와 index.html을 각각 완성한다.
2. assignProctors(): 감독 횟수 최소 우선 + 담임 반 회피 규칙을 코드로 구현한다.
3. doGet: 교사 이름을 쿼리로 받아 해당 교사의 감독 일정만 반환한다.
4. 학생 개인정보 0: 교사 이름과 학급 번호만 다룬다.
5. // TODO, /* 생략 */ 금지 — 끝까지 완성한다.
[❓ 역질문]
1. 시험은 며칠 동안 진행되나요? (기본: 3일)
2. 학급 수는 몇 반인가요? (기본: 학년당 4반)
🎯 에디터 한줄평
"교무부장의 가장 괴로운 밤이 사라집니다. '누구는 3번 들어가고 누구는 1번 들어간다'는 불만이 원천적으로 불가능해지는 수학적 공정성 — 코드가 규칙을 지키는 한, 편파 시비는 더 이상 없습니다."
📚 참고 링크
- Google Apps Script 공식 문서: https://developers.google.com/apps-script
- 교육과정 연계: 교무 행정(고사 관리·감독 편성), 교사 업무 자동화