블로그 목록
Tools 9분 읽기

Excel-Google Sheets 마이그레이션: 통과 항목과 추가 검토 항목

수식 복구, 데이터 유효성 검사, 조건부 서식, 사후 검증까지 수행한 24개 시트 Excel 워크북의 마이그레이션 결과입니다.

이 결과물은 Freelancer 프로젝트 40579040의 요구사항을 처리한다. 제공된 Excel 워크북을 Google Sheets로 옮기면서 수식과 계산, VLOOKUP/HLOOKUP, IF/AND/OR, 배열 수식, 데이터 유효성 검사, 조건부 서식을 유지하는 작업이다.[1] 구현 코드는 새 Google Sheet를 만들고, 해당 워크북에서 확인된 호환성 문제를 보정하고, 규칙을 복원한 뒤 다시 XLSX로 내보내 구조를 비교했다. 24개 시트와 조건부 서식 68개, 선택한 핵심 값은 일치했지만 데이터 유효성 검사 비교 불일치와 새 DIVIDE_BY_ZERO 결과 534개가 발견됐다.[5] 따라서 정확한 상태는 “완벽한 변환”이 아니라 verification_requires_review다.

고객과 문제 정의

프로젝트의 단위는 모든 XLSX 파일을 처리하는 범용 변환기가 아니라 제공된 워크북 한 개다. 요구사항은 수식과 계산, 복잡한 조회·논리 수식, 배열 수식, 데이터 유효성 검사, 조건부 서식과 정확성 확인을 명시한다.[1] VBA를 Google Apps Script로 바꾸거나 Excel의 모든 기능을 일반화해 지원하는 것은 범위에 포함되지 않는다.

이 구분은 구현 방식에도 반영됐다. 코드는 먼저 제공된 파일을 조사하고, 실제로 존재하는 구조에 근거한 호환성 규칙만 적용한다. 일부 복구 규칙은 BASE_FILTER, BASE_CONSOL, BASE_TEMP, MP1_SHOP, MP1_DEP 같은 특정 시트와 좌표를 대상으로 한다. 이는 결과물이 해당 워크북에 맞춰졌다는 증거이지 범용 XLSX 지원을 뜻하지 않는다.

검증된 원본 규모는 다음과 같다.

  • 워크시트 24개
  • 값 또는 스타일이 있는 셀 569,008개
  • 수식 셀 241,330개
  • 배열 수식 앵커 5,513개
  • 표준 데이터 유효성 검사 정의 17개와 x14 정의 16개
  • 조건부 서식 규칙 68개
  • Office Open XML 패키지 파트 36개 전체 검증 완료[5]

Microsoft도 파일 형식이나 스프레드시트 환경이 달라지면 수식, 배열 동작, 참조, 유효성 검사 규칙에 호환성 검토가 필요할 수 있다고 설명한다.[6] 이 작업에서 “복제”는 변환 실행, 필요한 보정, 측정 가능한 차이의 보고까지를 의미한다.

현재 업무 흐름과 병목

Google Drive는 Microsoft Excel 파일을 Google Sheets 형식으로 가져올 수 있다.[2] 구현은 이 기본 변환을 출발점으로 삼는다. 레이아웃, 병합 범위, 값, 수식, 스타일에 Google의 기본 변환을 먼저 적용한 뒤 필요한 항목만 보정한다.

처리 순서는 다음과 같다.

  1. 원본 XLSX 해시와 모든 OOXML 파트·관계를 조사한다.
  2. 원본 사본과 구조화한 투영 데이터를 결정적 스냅샷 ZIP에 저장한다.
  3. 검증된 원본을 새 네이티브 Google Sheet로 업로드한다.
  4. 변환된 메타데이터를 읽고 모든 원본 시트 이름이 있는지 확인한다.
  5. 보정 쓰기를 막을 수 있는 유효성 검사 규칙을 임시 해제한다.
  6. 수식 토큰, 배열 앵커, 손상된 참조, 복구 가능한 캐시 값을 보정한다.
  7. Sheets API로 데이터 유효성 검사와 조건부 서식을 복원한다.
  8. 수식 오류와 선택한 핵심 값을 감사한다.
  9. Google Sheet를 XLSX로 다시 내보내 원본 구조와 비교한다.
  10. 결과를 verification_passed 또는 verification_requires_review로 기록한다.

Google Sheets의 spreadsheets.batchUpdate는 요청 순서대로 변경을 적용하고, 하나라도 유효하지 않으면 해당 배치를 부분 적용하지 않는다.[3] 구현은 항목 수와 바이트 크기로 배치를 제한하고, 쓰기 속도를 조절하며, 재시도 가능한 HTTP·전송 실패에 제한된 지수 백오프를 적용한다. 실제 실행에서도 첫 유효성 검사 배치에서 타임아웃과 HTTP 500이 발생했지만 재시도로 완료됐다.

계산 레이아웃과 보고 열이 유지된 변환 후 MP1_DEP 워크시트
변환 후 MP1_DEP 계산 레이아웃

AI 적용 시나리오

생성형 AI는 마이그레이션의 핵심 경로에 두지 않았다. 안전한 자동화 경계는 결정적이다. 워크북을 조사하고, 허용 목록에 있는 호환성 보정만 적용하고, Google API를 호출하고, 측정 가능한 결과를 비교한다. AI는 향후 검토 결과를 요약하는 데 보조적으로 쓸 수 있지만 수식을 추측하거나 회계 로직을 임의로 확정하거나 최종 승인을 대신해서는 안 된다.

일반 수식과 호환성 접두사 또는 플레이스홀더 함수가 포함된 수식을 구분했다. 자동 토큰 변경은 _xludf.IFNA에서 IFNA, _xludf.IFS에서 IFS, 지원되는 FILTER·UNIQUE·SORT 접두사처럼 문서화된 허용 목록으로 제한한다. 수식 문자열 안의 텍스트는 변경하지 않는다.

레거시 Excel 배열 수식은 앵커 수식과 결과 범위를 따로 저장한다. 같은 표현식을 일반 스칼라 수식처럼 기록하면 Google Sheets에서 다른 결과가 날 수 있다. 따라서 복구 가능한 앵커는 ARRAYFORMULA로 보존하고 플레이스홀더 스필 셀을 먼저 비운 뒤 앵커를 기록한다.

원본 동적 수식을 안전하게 해석할 수 없는 __xludf.DUMMYFUNCTION은 수식을 만들어 내지 않고 형식이 있는 캐시 값을 보존한다. 실행 보고서는 이를 구분한다.

  • 수식 업데이트 3,144개
  • 캐시 값 업데이트 160,903개
  • 원본 분석에서 식별한 접두사 함수 변경 1,204개
  • 복구 가능한 더미 수식 앵커 53개
  • 비우도록 예약된 스필 셀 858개[5]

160,903개의 캐시 값 보존은 제한사항이다. 해당 셀은 워크북의 계산 결과 스냅샷을 유지하지만, 알 수 없는 생성 수식까지 복원한 것은 아니다.

워크북별 필터 구조를 보여주는 변환 후 BASE_FILTER 워크시트
변환 후 BASE_FILTER 워크시트

데이터, 보안, 운영 경계

표준 Excel 데이터 유효성 검사와 x14 확장 검사를 모두 추출하고 범위를 정규화했다. 가능한 경우 누락된 드롭다운 값을 복구한 뒤 변환 과정에서 생긴 규칙을 지우고 의도한 규칙을 Sheets API로 다시 기록했다.

실행 결과 유효성 검사 대상 473개를 복원했고 API 확인 단계에서는 규칙 16개가 관찰됐다. 최종 내보낸 XLSX에는 원본 총계와 같은 데이터 유효성 검사 레코드 33개가 있었지만 API 수준 비교는 false였다.[5] Google Sheets에서 각 규칙이 동일하게 동작한다고 단정할 수 없으며 승인 전에 대표 시트의 드롭다운 동작을 확인해야 한다.

조건부 서식은 원본 68개, 복원 68개, 최종 메타데이터 68개로 개수 비교를 통과했다.[5] 이는 픽셀 단위로 동일하다는 뜻은 아니지만 규칙 수가 조용히 줄지는 않았다는 근거다.

명령줄 도구의 기본 동작은 분석 전용이며 --execute를 사용해야 실제 Drive 파일을 만든다. --force-new는 이전 실행물을 수정하지 않고 새 파일을 생성한다. OAuth 자격 증명과 갱신 토큰은 운영 비밀이며 공개 문서·영상에 포함하지 않는다. 워크북 셀 값, 스프레드시트 ID, 비공개 URL, 핵심 값 샘플도 공개 산출물에서 제외했다.

구현 아키텍처와 비용 가정

구현은 Google Drive·Sheets API를 사용하는 로컬 Python 마이그레이션 도구다. 스냅샷, 네이티브 가져오기, 보정, 규칙 복원, 감사, 내보내기, 비교 단계로 구성된다. 이번 한 번의 실행은 기존에 승인된 Google 계정과 로컬 워크스테이션을 사용했으므로 전용 호스팅 비용 가정은 월 $0이다. 이 금액에는 Google Workspace 구독료, API 할당량 정책 변경, 사람의 검토 시간, 향후 호스팅형 스케줄러·모니터링 비용을 제외한다.

통과한 검사는 다음과 같다.

  • 새 네이티브 Google Sheet 생성
  • 원본 워크시트 이름 24개 유지
  • 원본 스냅샷 파트 36개와 내부 관계 32개 검증
  • 선택한 핵심 원본·조회 값 일치
  • 조건부 서식 68개 복원, 68개 확인
  • 내보낸 워크북에서 시트 24개, 데이터 유효성 검사 33개, 조건부 서식 68개 확인[5]

추가 검토가 필요한 항목은 다음과 같다.

  • API에서 확인한 유효성 검사 상태와 기대값 불일치
  • 검토 대상 MP 워크시트 범위에서 새 DIVIDE_BY_ZERO 결과 534개
  • 내보낸 워크북의 OOXML 구조가 원본과 다름
  • Google 변환 과정에서 수식 셀 표현과 일부 구조 해시 변경
  • 외부 스프레드시트 데이터가 필요하면 사용자가 IMPORTRANGE 접근을 허용해야 할 수 있음[4][5]
수식과 표시 값을 사후 검토하는 데 사용한 MP1_SHOP 워크시트
MP1_SHOP 변환 후 검토

534개 결과가 모두 새로 손상된 비즈니스 값이라는 뜻은 아니다. Excel에서 캐시 값만 있던 수식이 Google Sheets에서 실제 계산되면서 0인 분모가 드러날 수 있다. 그래도 빈 상태에서 예상된 결과인지, IFERROR나 분모 보호가 필요한지, 실제 변환 결함인지 분류해야 한다.

도입 로드맵과 KPI

도입 순서는 원본 분석, 새 Sheet 생성, 차이 검토, 사용자 승인이다. 핵심 KPI는 시트 수 일치, 조건부 서식 수 일치, 데이터 유효성 검사 결과, 새 수식 오류 수, 핵심 값 일치, 사용자 인수 체크리스트 완료 여부다. 이번 실행에서는 구조 개수 일부와 선택한 핵심 값이 통과했고 유효성 검사 비교와 새 수식 오류 수는 승인 기준을 충족하지 못했다.[5]

분석 전용 실행 예시는 다음과 같다.

bash
python3 main.py \
  --input test.xlsx \
  --report analysis-report.json

승인된 실제 마이그레이션 예시는 다음과 같다.

bash
python3 main.py \
  --input test.xlsx \
  --execute \
  --force-new \
  --validation-policy warn \
  --report migration-report.json

--reuse-existing은 같은 제목과 원본 해시를 가진 가장 최근 Sheet를 의도적으로 이어서 처리할 때만 사용한다. 마이그레이션 코드는 원본 XLSX를 다시 저장하지 않으며 검증된 스냅샷 사본의 바이트를 업로드한다.

리스크와 체크리스트

마이그레이션 소유자가 다음 검토를 마쳐야 “실행 완료”에서 “승인 완료”로 상태를 바꿀 수 있다.

  • [x] 원본 스냅샷 해시와 제공된 워크북 일치 확인
  • [x] Google Sheet에 워크시트 24개 존재 확인
  • [x] 선택한 핵심 값과 원본 조회 값 일치 확인
  • [x] 조건부 서식 수 확인: 원본 68개, 복원 68개, 확인 68개
  • [ ] 유효성 검사 불일치를 조사하고 대표 시트의 드롭다운 동작 시험
  • [ ] 새 DIVIDE_BY_ZERO 셀 534개를 예상된 빈 상태와 결함으로 분류
  • [ ] 병합 범위, 수식 표현, 스타일 구성요소 등 중요한 OOXML 차이 검토
  • [ ] 필요하면 IMPORTRANGE 접근 권한 부여 후 시험[4]
  • [ ] 일반 편집, 필터링, 조회, 보고 흐름에 대한 사용자 인수 시험 수행
  • [ ] 허용한 예외를 기록하고 최종 고객 승인 확보

결론

제공된 24개 시트 워크북에 대해 요청된 Excel-Google Sheets 마이그레이션이 실행됐다. 시트 수를 유지하고 조건부 서식 68개를 개수 기준으로 복원·확인했으며, 데이터 유효성 검사 레코드 33개를 내보낸 파일에서 확인했다. 수식 3,144개를 보정하고 복구 가능한 캐시 값 160,903개를 보존했으며 선택한 핵심 값도 일치했다.[5] 동시에 데이터 유효성 검사 불일치, 새 0 나누기 결과 534개, 구조 차이도 확인했다. 현재 산출물은 재현 가능한 감사 기록과 명확한 검토 목록을 갖춘 마이그레이션 후보이며, 최종 승인은 위 체크리스트를 완료한 뒤 내려야 한다.

출처

  1. Excel to Google Sheets Migration, Project ID 40579040. Freelancer. 2026년 7월. https://www.freelancer.com/projects/google-sheets/Excel-Google-Sheets-Migration-40579040/details. 확인일: 2026-07-20.
  2. Upload file data. Google for Developers. 2026년 업데이트. https://developers.google.com/workspace/drive/api/guides/manage-uploads. 확인일: 2026-07-20.
  3. Method: spreadsheets.batchUpdate. Google for Developers. 2026-06-16 업데이트. https://developers.google.com/workspace/sheets/api/reference/rest/v4/spreadsheets/batchUpdate. 확인일: 2026-07-20.
  4. IMPORTRANGE. Google Docs Editors Help. https://support.google.com/docs/answer/3093340?hl=en. 확인일: 2026-07-20.
  5. 정제한 마이그레이션 실행 요약. 2026-07-20에 검토한 로컬 검증 자료.
  6. Formula compatibility issues in Excel. Microsoft Support. https://support.microsoft.com/en-US/Excel/formula-compatibility-issues-in-excel. 확인일: 2026-07-20.