2026년 9월 8일 화요일

[행정/고사] 시험 감독 시간표 자동 편성 - GAS + 구글 시트

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
  • 교육과정 연계: 교무 행정(고사 관리·감독 편성), 교사 업무 자동화