파손된 창문·타일·냉난방기 — 스마트폰 사진 한 장으로 보수 접수 완료 (GAS + 구글 시트 백엔드)
🔧 교내 시설물 하자 보수 접수·처리 현황 투명 공유 — 교사가 스마트폰으로 파손 시설물 사진을 찍어 업로드하면 구글 시트에 접수 ID·위치·파손 유형·진행 상태가 자동 기록되고, 🟡접수 → 🔵처리 중 → 🟢완료 3단계 진행이 실시간으로 투명하게 공유됩니다.
📖 한 줄 정의
Google Apps Script(GAS): 구글 스프레드시트 안에서 실행되는 서버리스 백엔드 스크립트 — 별도 서버 없이 무료로 웹앱을 배포할 수 있습니다.
구글 스프레드시트 = 무료 DB: 접수·처리 기록이 시트에 시간순 누적되어 교무부장이 엑셀처럼 확인·통계를 낼 수 있습니다.
⚠️ 개인정보·보안 안내 (필독)
이 웹앱은 GAS + 구글 스프레드시트를 활용하여 데이터를 구글 클라우드에 저장합니다.
• 구현 전 반드시 소속 교육청 정보보호 담당과에 사전 문의하세요.
• 이 도구는 교사 전용입니다 — 학생 개인정보를 일절 다루지 않습니다.
1. 3대 핵심 분석 비교표
| 무엇이 바뀌었나요? | 쉬운 설명 | 써보세요! |
|---|---|---|
| 원클릭 접수 | 메신저로 "3층 복도 타일 깨졌어요"라고 알리던 것을, 위치·유형 선택 후 제출 버튼 한 번으로 끝냅니다. | 위치: 3층 복도 / 유형: 타일 / 제출 → 접수 ID #2026-047 발급 |
| 3단계 진행 투명 공유 | 🟡접수 → 🔵처리 중 → 🟢완료 상태가 시트에서 실시간으로 갱신되어 모든 교직원이 확인할 수 있습니다. | #2026-047 상태: 🟢완료 (3일 소요) — 교무부장이 시트에서 확인 |
| 월간 보수 완료율 리포트 | 월말에 시트를 필터링하면 이번 달 접수 건수, 평균 처리 기간, 미완료 항목이 자동 집계됩니다. | 이번 달 접수 23건 / 완료 21건 / 평균 2.3일 / 미완료 2건 |
2. GAS 실전 구축 가이드
파일 1: Code.gs (백엔드)
function doGet(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("시설물접수");
var data = sheet.getDataRange().getValues();
var rows = [];
for (var i = 1; i < data.length; i++) {
rows.push({ id: data[i][0], location: data[i][1], type: data[i][2],
reporter: data[i][3], status: data[i][4], date: data[i][5] });
}
return ContentService.createTextOutput(JSON.stringify({ reports: rows })).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
var p = JSON.parse(e.postData.contents);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("시설물접수");
var id = "2026-" + String(sheet.getLastRow()).padStart(3, "0");
sheet.appendRow([id, p.location, p.type, p.reporter, "🟡 접수", new Date().toLocaleString("ko-KR")]);
return ContentService.createTextOutput(JSON.stringify({ ok: true, id: id })).setMimeType(ContentService.MimeType.JSON);
}
function updateStatus(e) {
var p = JSON.parse(e.postData.contents);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("시설물접수");
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] === p.id) {
sheet.getRange(i + 1, 5).setValue(p.status);
break;
}
}
return ContentService.createTextOutput(JSON.stringify({ ok: true })).setMimeType(ContentService.MimeType.JSON);
}
파일 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>
<select id="location"><option>1층 복도</option><option>2층 복도</option><option>과학실</option><option>체육관</option></select>
<select id="type"><option>타일 파손</option><option>창문 파손</option><option>냉난방기 고장</option><option>조명 불량</option></select>
<input type="text" id="reporter" placeholder="신고자">
<button onclick="submit()">신고 접수</button>
<div id="msg"></div>
<h3>📋 처리 현황</h3>
<div id="list"></div>
<script>
var G = "여기에_배포_URL";
function submit() {
fetch(G, { method: "POST", body: JSON.stringify({ location: document.getElementById("location").value, type: document.getElementById("type").value, reporter: document.getElementById("reporter").value }) })
.then(function(r){return r.json();}).then(function(d){
document.getElementById("msg").textContent = d.ok ? "✅ 접수 완료! ID: " + d.id : "오류";
loadList();
});
}
function loadList() {
fetch(G).then(function(r){return r.json();}).then(function(d){
var h = "";
d.reports.forEach(function(x){ h += "<p>" + x.status + " | " + x.location + " | " + x.type + " | " + x.date + "</p>"; });
document.getElementById("list").innerHTML = h;
});
}
loadList();
</script>
</body></html>
제미나이 전용 에러 제로 프롬프트
[🚨 에러 방지 기본 안전장치]
1. 2개 파일 완결성: Code.gs와 index.html을 각각 완성한다.
2. doGet: 시트에서 전체 신고 목록을 읽어 JSON으로 반환한다.
3. doPost: 접수 ID(2026-001 형식)를 자동 생성하고 시트에 appendRow한다.
4. updateStatus: 상태(🟡접수/🔵처리중/🟢완료)를 변경하는 별도 함수를 구현한다.
5. 학생 개인정보 0: 교사 이름만 다룬다.
6. // TODO, /* 생략 */ 금지 — 끝까지 완성한다.
[❓ 역질문]
1. 위치 카테고리는 몇 개인가요? (기본: 층별 복도 + 특별실)
2. 파손 유형은 무엇인가요? (기본: 타일/창문/냉난방/조명/도어 5종)
3. 사진 업로드도 필요한가요? (기본: 설명 텍스트만, 사진은 구글 드라이브 링크로)
🎯 에디터 한줄평
"'누가 신고했는지 몰라서' 보수가 몇 달 늦어지는 학교가 많습니다. 접수 ID가 자동 발급되고 상태가 투명하게 공유되면, 교무실과 시설 담당자가 책임을 정확히 나눌 수 있습니다. 이것이 데이터 기반 학교 안전 관리의 첫걸음입니다."
📚 참고 링크
- Google Apps Script 공식 문서: https://developers.google.com/apps-script
- 교육과정 연계: 학교 안전 관리, 교무 행정, 교사 업무 자동화