# -*- coding: utf-8 -*- """검수완료 시 엑셀 결과영역 Y/Z/AA 일괄 작성. 사용: python -X utf8 _fill_YZAA.py <엑셀경로> <담당자> [--write] Y 완료여부(Y,N) = "Y" (모든 데이터 행) Z 확인 날짜 = 검수일(datetime, yyyy-mm-dd 표시) AA 수집 담당자 = 담당자(프리랜서1/프리랜서2) - 데이터 행 판별: B열(순번)이 정수인 행만(3행~). 트레일링 빈행/잡행 제외. - 인자 없이/--write 없이 실행하면 dry-run(채울 행수만 출력). - --write 시 백업 *_backup_YZAA전.xlsx 생성 후 기입. 기존 셀 스타일·테두리 보존(값/표시형식만 변경). """ import sys import datetime import openpyxl from openpyxl.styles import Alignment YCOL, ZCOL, AACOL = 25, 26, 27 # Y, Z, AA def main(): if len(sys.argv) < 4: print('usage: _fill_YZAA.py <담당자> [--write]') return path, dstr, who = sys.argv[1], sys.argv[2], sys.argv[3] write = '--write' in sys.argv[4:] y, m, d = (int(x) for x in dstr.split('-')) dt = datetime.datetime(y, m, d) wb = openpyxl.load_workbook(path) ws = wb.active targets = [r for r in range(3, ws.max_row + 1) if isinstance(ws.cell(r, 2).value, int)] if not targets: print('데이터 행 없음(B열 순번 정수 없음) — 중단'); return # 이미 채워진 행 수 점검 pre_y = sum(1 for r in targets if ws.cell(r, YCOL).value not in (None, '')) print('데이터 %d행 | 이미 Y채움 %d행 | 날짜=%s 담당자=%s' % (len(targets), pre_y, dstr, who)) if not write: print('(dry-run) --write 추가 시 기입'); return bak = path.rsplit('.', 1)[0] + '_backup_YZAA전.xlsx' wb.save(bak) for r in targets: cy, cz, ca = ws.cell(r, YCOL), ws.cell(r, ZCOL), ws.cell(r, AACOL) cy.value, cz.value, ca.value = 'Y', dt, who cz.number_format = 'yyyy-mm-dd' for c in (cy, cz, ca): c.alignment = Alignment(horizontal='center', vertical='center') wb.save(path) print('기입 완료: Y/Z/AA %d행 → %s (백업 %s)' % (len(targets), path, bak)) if __name__ == '__main__': main()