RECIPE 070
법인카드 사용내역 → 비용 보고서 자동 생성
- ▸이메일로 수신되는 법인카드 승인 내역 자동 파싱
- ▸부서/프로젝트별 비용 자동 분류 및 집계
- ▸월말 비용 보고서를 PDF로 자동 생성 후 재무팀 발송
✅사전 준비
- □법인카드 승인 알림 이메일 수신 계정 설정
- □Gmail Trigger 또는 IMAP 설정
- □Google Sheets 비용 분류 시트 생성
- □PDF 생성 API 키 (html2pdf.app 또는 Doppio API)
카드 승인 내역 파싱 (Regex)
// Code 노드 - 이메일 본문에서 정보 추출
const body = $json.emailBody;
const amount = body.match(/(\d{1,3}(,\d{3})*)원/);
const merchant = body.match(/가맹점:\s*(.+)/);
const date = body.match(/(\d{4}[.-]\d{2}[.-]\d{2})/);
const cardLast4 = body.match(/카드번호:\s*[*]+([\d]{4})/);
return [{
json: {
amount: amount ? parseInt(amount[1].replace(/,/g, '')) : 0,
merchant: merchant ? merchant[1].trim() : '알 수 없음',
date: date ? date[1] : $now.toISODate(),
cardLast4: cardLast4 ? cardLast4[1] : ''
}
}];PDF 리포트 생성 (html2pdf.app)
Node: HTTP Request
Method: POST
URL: https://api.html2pdf.app/v1/generate
Body:
{
"html": "<h1>{{ $now.toFormat('yyyy년 MM월') }} 비용 보고서</h1><table>...",
"apiKey": "YOUR_HTML2PDF_API_KEY",
"filename": "expense_report_{{ $now.toFormat('yyyyMM') }}.pdf"
}⚠️ 주의카드 승인 이메일 형식은 카드사마다 다릅니다. 처음 도입 시 10~20개 실제 이메일 샘플로 파싱 정확도를 반드시 검증하세요.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe070",
"title": "연간 예산 대시보드 자동 갱신",
"chapter": 6,
"category": "재무 & 정산 자동화",
"difficulty": "⭐⭐",
"estimatedTime": "35분",
"usedApps": [
"Google Sheets",
"Slack"
],
"description": "매주 월요일 지출 내역 시트에서 부서별·항목별 집계를 자동 계산해 연간 예산 대시보드 시트를 갱신하고, 전주 대비 주요 변화를 Slack 재무팀 채널에 요약 발송합니다.",
"nodes": [
{
"id": "node1",
"type": "n8n-nodes-base.scheduleTrigger",
"name": "매주 월요일 오전 8시 실행",
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 8 * * 1"
}
]
}
}
},
{
"id": "node2",
"type": "n8n-nodes-base.googleSheets",
"name": "지출 내역 전체 조회",
"parameters": {
"operation": "getAll",
"spreadsheetId": "={{$env.BUDGET_SHEET_ID}}",
"sheetName": "지출내역"
}
},
{
"id": "node3",
"type": "n8n-nodes-base.code",
"name": "부서별·항목별 집계 계산",
"parameters": {
"jsCode": "const data = items.map(i => i.json);\nconst summary = {};\ndata.forEach(row => {\n const dept = row['부서'];\n const category = row['지출유형'];\n const amount = parseFloat(row['금액']) || 0;\n if (!summary[dept]) summary[dept] = {};\n if (!summary[dept][category]) summary[dept][category] = 0;\n summary[dept][category] += amount;\n});\nreturn [{ json: { summary, updatedAt: new Date().toISOString() } }];"
}
},
{
"id": "node4",
"type": "n8n-nodes-base.googleSheets",
"name": "대시보드 시트 업데이트",
"parameters": {
"operation": "update",
"spreadsheetId": "={{$env.BUDGET_SHEET_ID}}",
"sheetName": "대시보드",
"columns": {
"mappingMode": "defineBelow",
"value": {
"마지막갱신": "={{$now.format('YYYY-MM-DD HH:mm')}}"
}
}
}
},
{
"id": "node5",
"type": "n8n-nodes-base.slack",
"name": "주간 재무 요약 Slack 발송",
"parameters": {
"channel": "={{$env.FINANCE_SLACK_CHANNEL}}",
"text": "📊 주간 예산 현황 업데이트\n갱신 시각: {{$now.format('MM/DD HH:mm')}}\n\n대시보드 확인: {{$env.BUDGET_DASHBOARD_URL}}\n\n이번 주 주요 변화는 대시보드에서 확인해주세요!"
}
}
],
"envVariables": {
"BUDGET_SHEET_ID": "Google Sheets 예산 관리 시트 ID",
"FINANCE_SLACK_CHANNEL": "재무팀 Slack 채널 ID",
"BUDGET_DASHBOARD_URL": "Google Sheets 대시보드 탭 공유 URL"
},
"tips": [
"Google Sheets의 SUMIF, PIVOT 함수를 대시보드 탭에 미리 설정해두면 n8n이 지출 내역만 업데이트해도 대시보드 수치가 자동으로 계산됩니다.",
"전주 대비 증감률을 계산하려면 Code 노드에서 이전 주 데이터와 비교하는 로직을 추가하세요.",
"임원 보고용이라면 Slack 메시지에 Google Sheets 공유 링크 대신 PDF 변환 후 첨부하는 방식도 가능해요."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe070"
}