본문 바로가기
카테고리 없음

LAMBDA로 재사용 가능한 맞춤 함수 라이브러리 만들기. 반복 수식을 이름 하나로 끝내는 법

by 시트자동화 2025. 8. 18.

lambda 샘플 데이터 관련 이미지
lambda 샘플 데이터

요약 — 같은 전처리 규칙과 같은 조회 로직을 모든 파일에서 다시 쓰고 계신가요. Excel의 LAMBDA는 자주 쓰는 수식을 이름 있는 함수로 승격시켜 줍니다. 한 번 정의하면 통합 문서 어디에서든 함수처럼 호출할 수 있고, 인수와 지역 변수도 갖습니다. 이 글에서는 현장 업무에서 바로 쓰이는 여덟 가지 LAMBDA를 설계하고, 샘플 데이터에 적용해 결과를 검증하는 전 과정을 보여 드립니다. 어려움없이 따라 하실 수 있도록 샘플과 결과 파일을 제공합니다.

파일 내려받기

샘플 데이터 설명

샘플은 2025년 6월부터 7월까지의 주문 행으로 구성되어 있습니다. 전처리와 조회 그리고 날짜 파생에 필요한 원재료를 넣었습니다. 결과 파일에는 전화 번호와 주소의 정규화 값, 카테고리 안전 조회 값, 말일 파생 값, 지역별 최근 30일 누계가 포함됩니다.

A10_lambda_sample.csv 필드 사전

컬럼 의미 예시 비고
order_id 주문 식별자 O-0042 고유 코드
date 주문 일자 2025-07-12 YYYY-MM-DD
region 지역 Seoul Seoul Busan Incheon
sku 제품 코드 S015 일부는 마스터에 없음
qty 수량 6 정수
unit_price 단가 15378 정수
phone_raw 연락처 원문 (010)4567-8901 대시와 공백이 제각각
addr_raw 주소 원문 Incheon Namdong-gu Nonhyeon-dong 12 줄바꿈 탭 포함 가능
note_raw 비고 원문 First order “ok” — check 스마트 따옴표 대시 포함

A10_lambda_master.csv 필드 사전

컬럼 의미 예시 비고
sku 제품 코드 S015
category 카테고리 Office 일부 누락 상태로 제공

A10_lambda_result.csv 파생 열

컬럼 의미 예시 계산 개념
amount 금액 123024 qty×unit_price
phone_std 정규화 연락처 010-1234-5678 PHONEFORMAT
addr_std 정규화 주소 Incheon Namdong-gu Nonhyeon-dong 12 TEXTNORMAL
category_safe 안전 조회 카테고리 미등록 SAFELOOKUP
month_end 말일 2025-06-30 MONTHEND
roll_30d_region_amt 지역별 최근 30일 누적 15942 ROLLING_DAYS_SUM 정책에 상응

핵심 아이디어. 함수는 짧게, 의미는 분명하게

라이브러리는 두 층으로 나누면 유지 보수가 쉽습니다. 첫째는 모든 정리 로직의 뿌리가 되는 공통 유틸입니다. 둘째는 업무 도메인을 반영한 응용 함수입니다. 아래 예시에서 TEXTNORMAL은 다른 함수들이 기대하는 입력 규칙을 보장합니다. PHONEFORMAT과 SLUG는 TEXTNORMAL에 의존합니다. SAFELOOKUP은 오류를 값으로 다루어 파이프라인이 끊어지지 않게 합니다. MONTHEND와 MONTHSEQ는 날짜를 일정한 기준으로 맞추고 ROLLING_DAYS_SUM은 SUMIFS에 기간 조건을 주입합니다. PARSEKV는 key=value 패턴을 가볍게 분해합니다.

라이브러리 정의문

이 절의 수식을 그대로 이름 관리자에 등록하시면 됩니다. 함수 이름은 첫 글자 대문자 표기이며 다른 통합 문서에서도 동일하게 쓰실 수 있도록 짧고 명확하게 지었습니다. TEXTNORMAL을 먼저 등록하셔야 PHONEFORMAT과 SLUG가 정상 동작합니다.

기본 정규화

=LAMBDA(txt, LET(_t, SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(txt, CHAR(160), " "), CHAR(9), " "), CHAR(10), " "), CHAR(13), " "), "–","-"), "—","-"), "−","-"), "“",""""), "”",""""), TRIM(CLEAN(SUBSTITUTE(SUBSTITUTE(_t, "’","'"), "‘","'")))))

이 함수는 비가시 공백을 일반 공백으로 바꾸고, 세 가지 대시와 스마트 따옴표를 표준 문자로 통일한 다음 TRIM CLEAN을 적용합니다.

전화 번호 포맷

=LAMBDA(txt, LET(t, TEXTNORMAL(txt), n, TEXTJOIN("",,IF(ISNUMBER(--MID(t, SEQUENCE(LEN(t)), 1)), MID(t, SEQUENCE(LEN(t)), 1), "")), IF(AND(LEN(n)=11, LEFT(n,3)="010"), LEFT(n,3)&"-"&MID(n,4,4)&"-"&RIGHT(n,4), n)))

안전 조회

=LAMBDA(k, keys, vals, default, LET(pos, XMATCH(k, keys, 0), IF(ISNA(pos), default, INDEX(vals, pos))))

말일과 월 시퀀스

=LAMBDA(d, off, EOMONTH(d, off))
=LAMBDA(start_firstday, months, EDATE(EOMONTH(start_firstday,-1)+1, SEQUENCE(months,1,0,1)))

최근 n일 합계

=LAMBDA(dates, values, end_date, days, SUMIFS(values, dates, ">="&end_date-days+1, dates, "<="&end_date))

key=value 파서와 슬러그

=LAMBDA(line, key, LET(k, key&"=", IFERROR(TEXTBEFORE(TEXTAFTER(line, k), " "), "")))
=LAMBDA(txt, LET(t, TEXTNORMAL(txt), UPPER(SUBSTITUTE(t, " ", "-"))))

설치 절차

  1. 수식 탭에서 이름 관리자를 열고 새로 만들기를 선택합니다.
  2. 이름에 TEXTNORMAL을 입력하고 참조 대상 상자에 위 수식을 붙여 넣습니다. 범위는 통합 문서로 지정합니다.
  3. 동일한 방식으로 PHONEFORMAT SAFELOOKUP MONTHEND MONTHSEQ ROLLING_DAYS_SUM PARSEKV SLUG를 차례로 등록합니다.
  4. 설치가 끝나면 시트에서 일반 함수처럼 호출하실 수 있습니다. 예를 들어 =PHONEFORMAT([@phone_raw])처럼 사용합니다.

샘플에 적용하기

샘플 데이터를 표로 만들고 표 이름을 Orders, 마스터를 Master라고 가정합니다. 다음 수식을 각 열에 배치합니다. 결과 파일은 이 규칙과 일치하도록 생성되어 있습니다.

-- 금액
=[@qty] * [@unit_price]

-- 정규화 연락처
=PHONEFORMAT([@phone_raw])

-- 정규화 주소
=TEXTNORMAL([@addr_raw])

-- 카테고리 안전 조회
=SAFELOOKUP([@sku], Master[sku], Master[category], "미등록")

-- 말일
=MONTHEND([@date], 0)

-- 지역별 최근 30일 누계
=ROLLING_DAYS_SUM(Orders[date], Orders[amount], [@date], 30)

주요 포인트는 두 가지입니다. 첫째 TEXTNORMAL이 모든 문자열 전처리의 단일 기준을 제공합니다. 둘째 SAFELOOKUP이 누락 데이터를 값으로 흡수해 파이프라인을 끊지 않습니다. 이 두 가지 원칙이 자동화의 안정성을 좌우합니다.

검증 체크리스트

  • 정규화 연락처는 숫자만 남겼을 때 11자리 또는 정책상 허용 길이인지 확인합니다.
  • category_safe 열에 미등록이 존재하는지, 마스터에 없는 SKU만 해당되는지 확인합니다.
  • month_end는 항상 해당 월의 말일인지 임의의 일자 샘플로 점검합니다.
  • roll_30d_region_amt는 날짜 오름차순에서 단조 증가만 보장되지 않습니다. 하루 금액이 낮으면 줄어들 수 있으니 증가만을 기대하면 안 됩니다.

유지 보수 전략

함수 정의를 통합 문서가 아닌 별도의 레지스트리로 관리하면 확장에 유리합니다. 제공한 카탈로그 CSV를 버전 관리 시스템이나 공유 드라이브에 두고, 바뀐 정의는 주석과 변경 이유를 함께 적어 두세요. 함수 이름은 의미를 담되 길게 만들지 않습니다. TEXTNORMAL처럼 의도가 분명하면 나중에 보아도 해석이 필요 없습니다. 또한 서로 의존하는 함수는 의존 순서를 문서화해야 합니다. 이번 예시에서는 TEXTNORMAL이 선행되어야 PHONEFORMAT과 SLUG가 올바르게 작동합니다.

자주 받는 질문

  • 워크북 간 공유는 어떻게 하나요 — 이름 관리자에서 정의를 선택하고 복사해 다른 통합 문서의 이름 관리자에 붙여 넣으면 됩니다. 또는 참조 범위를 통합 문서로 유지한 상태로 템플릿 파일을 만들어 배포하세요.
  • 값이 배열로 나오나요 — MONTHSEQ와 같이 동적 배열을 반환하는 함수는 스필됩니다. 표 바깥의 작업 영역을 확보해 두세요.
  • Google Sheets에서도 쓸 수 있나요 — Sheets의 Named function으로 동일한 수식을 저장할 수 있습니다. 다만 LAMBDA 키워드는 없고 정의 방식이 다르므로 본문 정의를 그대로 붙이는 대신 논리를 재현해 만드셔야 합니다.

정리

자동화의 본질은 규칙을 이름으로 저장하고 재사용하는 데 있습니다. LAMBDA로 규칙에 이름을 붙이면, 파일마다 수식을 다시 쓰지 않아도 됩니다. TEXTNORMAL로 입력을 고르게 만들고, SAFELOOKUP으로 누락을 흡수하고, MONTHEND와 ROLLING_DAYS_SUM으로 날짜를 다루는 공식을 표준화하면, 어느 시트에서도 같은 호출로 같은 결과를 얻습니다. 위의 CSV를 내려받아 파일 하나에 정의를 설치해 보세요. 통합 문서가 곧 라이브러리가 되는 경험을 하실 수 있습니다.