RECIPE 001
매일 아침 오늘의 할 일 Slack 알림
- ▸RSS Feed Read 노드로 외부 피드를 n8n에 연결할 수 있다
- ▸SplitInBatches 노드로 대량 데이터를 안전하게 처리할 수 있다
- ▸Google Sheets에 중복 없이 데이터를 누적 저장할 수 있다
✅사전 준비
- □Google Sheets 자격증명(Credentials) 연결 완료
- □수집할 RSS 피드 URL 1개 이상 준비
- □Google Sheets에 시트 생성 후 1행에 헤더 입력 (제목 / 링크 / 발행일 / 수집일시)
Schedule Trigger — Cron 설정값
매일 오전 8시 실행
Cron Expression: 0 8 * * *
Timezone: Asia/SeoulRSS Feed Read 노드 — URL 예시
블로터: https://www.bloter.net/feed
ZDNet Korea: https://zdnet.co.kr/rss.asp
Yonhap IT: https://www.yna.co.kr/rss/it.xml
※ 모르면 사이트 주소 뒤에 /feed 또는 /rss.xml 을 붙여보세요Google Sheets Append — 컬럼 매핑 표현식
제목: {{ $json.title }}
링크: {{ $json.link }}
발행일: {{ $json.pubDate }}
수집일시: {{ $now.toFormat("yyyy-MM-dd HH:mm") }}💡 TIPRSS 피드가 없는 사이트는 HTTP Request + HTML Extract 노드 조합으로 스크래핑할 수 있어요. 레시피 003에서 다룹니다.
⚠️ 주의Google Sheets API는 분당 호출 제한이 있습니다. 항목이 100개 이상이면 SplitInBatches 노드를 추가하고 Batch Size를 50으로 설정하세요.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"name": "recipe001_daily_todo_slack",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"triggerAtHour": 9,
"triggerAtMinute": 0
}
]
}
},
"id": "schedule-001-01",
"name": "매일 오전 9시 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
200,
400
]
},
{
"parameters": {
"resource": "sheet",
"operation": "getRows",
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $env.TODO_SHEET_ID }}"
},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "할일목록"
},
"filtersUI": {
"values": [
{
"lookupColumn": "날짜",
"lookupValue": "={{ $now.format('yyyy-MM-dd') }}"
}
]
},
"options": {}
},
"id": "sheets-001-02",
"name": "오늘 할 일 가져오기",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.5,
"position": [
420,
400
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "cond-has-data",
"leftValue": "={{ $json['할 일'] }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEquals"
}
}
],
"combinator": "and"
}
},
"id": "if-001-03",
"name": "할 일 데이터 있는지 확인",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
640,
400
]
},
{
"parameters": {
"jsCode": "const today = $now.setLocale('ko').toFormat('yyyy년 M월 d일 cccc');\nconst items = $input.all();\nconst todoLines = items.map(item => {\n const todo = item.json['할 일'] || '';\n const assignee = item.json['담당자'] || '';\n return assignee ? `• ${todo} (${assignee})` : `• ${todo}`;\n}).join('\\n');\nreturn [{\n json: {\n message: `📅 *${today} 오늘의 할 일*\\n\\n${todoLines}\\n\\n화이팅! 💪`\n }\n}];"
},
"id": "code-001-04",
"name": "메시지 포맷 조합",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
860,
300
]
},
{
"parameters": {
"resource": "message",
"operation": "post",
"channel": "#daily-todo",
"text": "={{ $json.message }}",
"otherOptions": {}
},
"id": "slack-001-05",
"name": "Slack 할 일 알림 발송",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1080,
300
]
},
{
"parameters": {
"resource": "message",
"operation": "post",
"channel": "#daily-todo",
"text": "📅 오늘 등록된 할 일이 없어요. 구글 시트를 확인해주세요!",
"otherOptions": {}
},
"id": "slack-001-06",
"name": "할 일 없음 처리",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
860,
560
]
}
],
"connections": {
"매일 오전 9시 트리거": {
"main": [
[
{
"node": "오늘 할 일 가져오기",
"type": "main",
"index": 0
}
]
]
},
"오늘 할 일 가져오기": {
"main": [
[
{
"node": "할 일 데이터 있는지 확인",
"type": "main",
"index": 0
}
]
]
},
"할 일 데이터 있는지 확인": {
"main": [
[
{
"node": "메시지 포맷 조합",
"type": "main",
"index": 0
}
],
[
{
"node": "할 일 없음 처리",
"type": "main",
"index": 0
}
]
]
},
"메시지 포맷 조합": {
"main": [
[
{
"node": "Slack 할 일 알림 발송",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"timezone": "Asia/Seoul"
},
"meta": {
"chapter": 1,
"recipe": "001",
"title": "매일 아침 오늘의 할 일 Slack 알림",
"difficulty": "⭐",
"estimatedTime": "15분",
"apps": [
"Google Sheets",
"Slack"
],
"workflowUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe001"
}
}