본문으로 건너뛰기
멍냥잇 — AI & LIFE

멍냥잇 AI 활용 제작 기록 · 검증한 실습

엑셀 주간 업무보고 자동 생성기 만들기: 숫자 검증부터 Gemini 설명까지

주간 업무보고를 만들 때 업무표를 보며 완료 건수와 밀린 일을 손으로 세면, 기준을 바꾸지 않았는데도 보고 숫자가 달라질 수 있습니다. 이번 실습에서는 가상 엑셀 한 파일을 읽어 주간 집계를 확정하고, Gemini가 그 숫자만 바탕으로 한국어 설명 초안을 쓰는 작은 프로그램을 만들었습니다. 출력은 브라우저에서 열 수 있는 보고서이고, 카카오톡이나 이메일로 자동 전송하지 않습니다.

완성된 결과: 무엇을 자동화했나

예제 주간은 2026년 9월 21일 월요일부터 27일 일요일까지입니다. 업무표에는 다음 주에 시작할 행까지 포함해 7개 행을 넣었습니다. 프로그램은 그중 6개를 보고 대상으로 선택하고, 완료 2건·미완료 4건·기한 초과 2건·보류 1건을 계산했습니다. 다음 주 시작인 W-007은 제외했습니다.

집계 검증한 값 근거 업무ID
대상 6건 W-001~W-006
이번 주 완료 2건 W-001, W-004
주말 시점 미완료 4건 W-002, W-003, W-005, W-006
미완료 중 기한 초과 2건 W-002, W-005
미완료 중 보류 1건 W-006

Gemini가 실제 시험에서 만든 설명은 “총 6건의 대상 업무 중 2건을 완료했습니다”처럼 확정 집계에 붙는 짧은 문장입니다. 업무명과 담당자는 Gemini에 보내지 않았습니다. 설명은 초안이며, 최종 공유 전에는 사람이 원본과 대조합니다.

가상 업무 7건이 담긴 엑셀 업무목록 예제
실습에 사용한 가상 업무목록. 실제 회사 업무나 개인정보는 넣지 않았습니다.

예제 파일과 실행 순서

예제 엑셀과 전체 코드 ZIP 내려받기. ZIP에는 sample-tasks.xlsx, weekly_report.py, requirements.txt, 사용 설명서, 설계 문서, 자동 테스트가 있습니다. 비밀키와 실제 업무표는 포함하지 않았습니다.

  1. Windows에 Python 3.11 이상을 설치하고 ZIP을 압축 해제합니다.
  2. 그 폴더에서 PowerShell을 열어 아래 명령을 실행합니다.
  3. 출력된 경로의 report.html을 브라우저로 엽니다. audit.json의 counts와 예제의 6·2·4·2·1을 대조합니다.
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe weekly_report.py --input .\sample-tasks.xlsx --week 2026-09-21

여기까지는 API 키 없이 실행됩니다. AI 설명도 만들어 보고 싶을 때만 Gemini API 키를 현재 PowerShell 세션에 설정하고 --ai를 붙입니다. 키는 코드·엑셀·ZIP에 저장하지 않습니다.

$env:GEMINI_API_KEY = Read-Host 'Gemini API 키'
.\.venv\Scripts\python.exe weekly_report.py --input .\sample-tasks.xlsx --week 2026-09-21 --ai
Remove-Item Env:GEMINI_API_KEY

모델 기본값은 gemini-3.5-flash-lite입니다. 모델 제공 상태와 사용량·요금은 계정에 따라 달라질 수 있으니 Google 모델 문서와 본인의 AI Studio 설정을 확인하세요.

왜 숫자 계산을 AI에 맡기지 않았나

주간 보고에서 먼저 정해야 할 것은 “이번 주 대상 업무”의 정의입니다. 이 프로그램은 월요일 00:00부터 일요일 23:59까지를 한 주로 보고, 주말 이전에 시작했으며 주초 전에 이미 끝나지 않은 업무만 대상으로 삼습니다. 완료는 완료일이 그 주 안에 있는 행이고, 기한 초과는 일요일 시점에 끝나지 않았으며 마감일이 일요일보다 이른 행입니다. 일요일 마감은 아직 기한 초과로 세지 않습니다.

included = [t for t in tasks
            if t.start <= week_end
            and (t.completed is None or t.completed >= week_start)]
completed = [t for t in included
             if t.completed is not None
             and week_start <= t.completed <= week_end]
unfinished = [t for t in included if t.completed is None]
overdue = [t for t in unfinished if t.due < week_end]

완료율을 일부러 만들지 않았습니다. 진행 중 업무를 분모에 넣을지, 이번 주 새로 시작한 업무만 셀지 합의되지 않았다면 숫자가 오히려 오해를 낳습니다. 지난주 대비 증감도 지난주 상태를 저장한 별도 파일이 없어서 계산하지 않습니다.

입력 엑셀은 어떤 형식이어야 하나

시트 이름은 업무목록이고 첫 행은 열 제목입니다. 열 순서는 상관없습니다. 필수 열은 업무ID, 업무명, 분류, 시작일, 마감일, 상태, 완료일이며 담당자는 선택입니다. 상태는 완료·진행중·대기·보류 중 하나입니다. 날짜는 Excel 날짜 셀 또는 YYYY-MM-DD 형식으로 입력합니다.

프로그램은 원본을 다시 저장하지 않습니다. 중복 업무ID, 9/1/26처럼 해석이 갈리는 날짜, 완료 상태와 완료일의 불일치, 필수 열의 수식 셀을 발견하면 해당 행과 이유를 표시하고 보고서를 만들지 않습니다. 선택 주간보다 뒤에 완료된 행이 있으면 현재 파일만으로 과거 일요일의 상태를 확정할 수 없으므로 역시 중단합니다. 입력 파일이 실행 중 바뀌었는지도 SHA-256 해시로 확인합니다. 수식 처리에 관한 이유는 openpyxl 문서와 함께 설계 문서에 적었습니다.

Gemini에 보낸 정보와 응답 검증

Gemini에는 원본 행을 보내지 않습니다. 프로그램이 계산한 보고 기간, 대상·완료·미완료·기한 초과·보류 건수와 F1부터 F5까지의 임시 사실 ID만 보냅니다. 원본 업무ID, 업무명, 담당자, 엑셀 파일은 로컬 PC에만 남습니다. 그래서 AI 문장은 구체적 업무 내용을 설명하지 못합니다. 이 제한은 개인정보 노출을 줄이는 대신 설명 범위를 좁히는 의도적인 선택입니다.

AI에는 “이번 주 요약”, “주의할 점”, “확인이 필요한 사항” 세 문단을 JSON으로 돌려달라고 요청합니다. 코드는 문단 수와 제목, 사용한 사실 ID, 문장 속 아라비아 숫자가 해당 사실의 집계값과 맞는지 확인합니다. 예컨대 대상이 6건인데 “99건”이라고 쓰면 문장을 버립니다. Google의 구조화 출력 문서도 JSON 형식이 의미의 정확성까지 보증하지는 않는다고 설명합니다. 한글 수사나 미묘한 인과 표현까지 완벽하게 검출할 수 없으므로 사람 검토가 필요합니다.

API 연결이나 문장 검증에 실패해도 코드는 확인된 집계표와 근거 ID를 담은 보고서를 남기고 “AI 설명 생성 실패”를 표시합니다. 이때 AI 문장을 임의로 채우지 않습니다.

검증에서 무엇을 확인했나

가상 예제 파일을 실제로 실행해 audit.json의 6·2·4·2·1과 근거 업무ID를 대조했습니다. 원본 엑셀 해시는 실행 전후 같았습니다. ZIP을 새 폴더에 풀어 API 키 없이 다시 실행해 같은 집계를 재현했습니다. 별도로 Gemini 실호출을 한 번 시험했고 세 한국어 문단이 응답 검증을 통과했습니다. 이 실호출은 가상 집계만 사용했습니다.

자동 테스트 6개는 집계·재실행, 중복 업무ID와 애매한 날짜, 수식 셀과 상태 충돌, 미래 완료일, AI의 지어낸 숫자, HTML 특수문자 이스케이프, API 실패 시 집계 유지, 주간 종료 전 실행 차단을 확인합니다. 독자도 다음 명령으로 테스트할 수 있습니다.

.\.venv\Scripts\python.exe -m unittest discover -s tests -v

실제 업무표에 맞출 때 바꿀 지점

조직의 업무표 열 이름이나 상태명이 다르면 HEADERS와 STATUSES를 바꾸고, 계산 기준도 함께 문서화해야 합니다. “기한 초과”를 일요일 기준이 아니라 금요일 퇴근 시점으로 볼 조직이라면 overdue 조건을 고쳐야 합니다. 여러 주를 비교하려면 매주 말의 스냅샷을 별도로 보관해야 하며, 현재 파일 하나로 과거 상태를 추측하면 안 됩니다.

첫 버전은 개인 PC에서 수동 실행하는 보고서 초안입니다. 실제 회사 자료에 --ai를 적용하기 전에는 조직의 외부 AI 사용 규정을 확인하세요. 보고서의 숫자와 AI 설명을 원본과 대조하기 전에는 공유하지 않는 흐름으로 설계했습니다.