Everhour 휴가 시간 동기화
고급
이것은HR분야의자동화 워크플로우로, 23개의 노드를 포함합니다.주로 If, Set, Code, HttpRequest, GoogleCalendar 등의 노드를 사용하며. Everhour 휴가 시간을 Google 캘린더 종일 이벤트로 자동 동기화
사전 요구사항
- •대상 API의 인증 정보가 필요할 수 있음
카테고리
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"id": "atCSLFdL7AyLdjJD",
"meta": {
"instanceId": "ed54b493f1b983b9b64b327a27338be1695af08f90b0f5fff3b6d18c570c4fc2"
},
"name": "Everhour Time Off",
"tags": [],
"nodes": [
{
"id": "fe08e8fe-779b-4428-8060-08da88a61118",
"name": "스케줄 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1856,
384
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "8082b4f8-5ff0-4af3-ac3f-268cdd8bee97",
"name": "할당 그룹 구성",
"type": "n8n-nodes-base.code",
"position": [
-656,
576
],
"parameters": {
"jsCode": "// Input: per-day items from Edit Fields (each has externalKey, startDate, endDateExclusive)\n// Output: one item per assignmentId with the set of current keys and a search window\n\nconst groups = {}; // { [assignmentId]: { currentKeys:Set, minDate, maxDate } }\n\nfor (const it of items) {\n const j = it.json;\n const parts = (j.externalKey || '').split(':'); // [\"everhour\", \"<id>\", \"<date>\"]\n const assignmentId = parts[1];\n if (!assignmentId) continue;\n\n if (!groups[assignmentId]) {\n groups[assignmentId] = {\n assignmentId,\n currentKeys: new Set(),\n minDate: j.startDate,\n maxDate: j.endDateExclusive\n };\n }\n groups[assignmentId].currentKeys.add(j.externalKey);\n if (j.startDate < groups[assignmentId].minDate) groups[assignmentId].minDate = j.startDate;\n if (j.endDateExclusive > groups[assignmentId].maxDate) groups[assignmentId].maxDate = j.endDateExclusive;\n}\n\n// Emit one item per assignment, with a small buffer on the search window (optional)\nconst out = [];\nfor (const id of Object.keys(groups)) {\n const g = groups[id];\n out.push({\n json: {\n assignmentId: id,\n currentKeys: Array.from(g.currentKeys),\n searchTimeMin: g.minDate + 'T00:00:00',\n searchTimeMax: g.maxDate + 'T23:59:59'\n }\n });\n}\nreturn out;\n"
},
"typeVersion": 2
},
{
"id": "f210fb86-0d78-4140-adff-0573566b23ac",
"name": "글로벌 키 세트 구성",
"type": "n8n-nodes-base.code",
"position": [
-656,
768
],
"parameters": {
"jsCode": "// Build the set of keys we SHOULD have right now\nlet minDate = null, maxDate = null;\nconst keys = new Set();\n\nfor (const it of items) {\n const j = it.json;\n if (j.externalKey) keys.add(j.externalKey);\n if (j.startDate && (!minDate || j.startDate < minDate)) minDate = j.startDate;\n if (j.endDateExclusive && (!maxDate || j.endDateExclusive > maxDate)) maxDate = j.endDateExclusive;\n}\n\n// Reasonable window (optional). Broaden if you want.\nif (!minDate) minDate = new Date().toISOString().slice(0,10);\nif (!maxDate) {\n const d = new Date(); d.setFullYear(d.getFullYear() + 1);\n maxDate = d.toISOString().slice(0,10);\n}\n\nreturn [{\n json: {\n currentKeys: Array.from(keys),\n searchTimeMin: minDate + 'T00:00:00',\n searchTimeMax: maxDate + 'T23:59:59'\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "c76c87dc-876c-46f0-ac7e-a4a15ac3661c",
"name": "Everhour - 휴가 시간 가져오기",
"type": "n8n-nodes-base.httpRequest",
"notes": "Uses Header Auth credential (add `X-Api-Key`). No hardcoded keys.",
"position": [
-1568,
384
],
"parameters": {
"url": "https://api.everhour.com/resource-planner/assignments",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "92a16e7c-bb00-439f-b819-6b7557ff5017",
"name": "승인된 휴가 필터링",
"type": "n8n-nodes-base.if",
"position": [
-1344,
384
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "9e28789f-61a6-4fcb-b132-294825f6ea39",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "approved"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "c20edb41-1400-4f8d-a90e-c61bda0295c7",
"name": "캘린더 페이로드 구성",
"type": "n8n-nodes-base.set",
"position": [
-896,
384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a7cb20ad-8a14-4252-9bb2-499db02852cd",
"name": "=searchQuery",
"type": "string",
"value": "={{ $json.externalKey }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "5fe3aab5-3136-4619-8857-96e53578adbd",
"name": "휴가 항목 준비",
"type": "n8n-nodes-base.code",
"position": [
-1120,
384
],
"parameters": {
"jsCode": "// All time-off (including half-day) → keep creating as ALL-DAY events,\n// but also expose `isAllDay` based on Everhour's original period.\n\nfunction* eachDateInclusive(startStr, endStr, includeWeekends) {\n const start = new Date(startStr + 'T00:00:00');\n const end = new Date(endStr + 'T00:00:00');\n for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n const dow = d.getDay(); // 0=Sun .. 6=Sat\n if (!includeWeekends && (dow === 0 || dow === 6)) continue;\n yield new Date(d);\n }\n}\nfunction fmtDate(d){ return d.toISOString().slice(0,10); }\n\nconst out = [];\nfor (const item of items) {\n const r = item.json;\n if ((r.status || '').toLowerCase() !== 'approved') continue;\n if (r.type !== 'time-off') continue;\n\n const userName = r.user?.name || 'Unknown';\n const userEmail = r.user?.email || '';\n const startDate = r.startDate;\n const endDate = r.endDate || r.startDate;\n const includeWeekends = !!r.includeWeekends;\n const period = r.timeOffPeriod || 'full-day'; // 'full-day' | 'half-of-day'\n const type = r.timeOffType?.name || 'Time Off';\n const note = r.note || '';\n const id = r.id;\n\n // Derive the original \"isAllDay\" from Everhour's period (without changing mapping)\n const isAllDayOriginal = (period !== 'half-of-day');\n\n // Expand per-day; skip weekends if flag=false\n for (const d of eachDateInclusive(startDate, endDate, includeWeekends)) {\n const day = fmtDate(d);\n\n // All-day mapping (end date exclusive)\n const endObj = new Date(d);\n endObj.setDate(endObj.getDate() + 1);\n const endExclusive = fmtDate(endObj);\n\n out.push({\n json: {\n // You are still creating ALL-DAY events\n isAllDay: isAllDayOriginal, // <-- added (reflects original Everhour period)\n startDate: day,\n endDateExclusive: endExclusive,\n\n employeeName: userName,\n employeeEmail: userEmail,\n type,\n note,\n status: r.status,\n\n // unique key per assignment-day\n externalKey: `everhour:${id}:${day}`,\n\n // keep for debugging/visibility\n originalPeriod: period\n }\n });\n }\n}\nreturn out;\n"
},
"typeVersion": 2
},
{
"id": "11e26f03-b016-445a-99b1-72b9e5b8c0c3",
"name": "외부 키로 기존 이벤트 찾기",
"type": "n8n-nodes-base.httpRequest",
"position": [
-672,
96
],
"parameters": {
"url": "={{ 'https://www.googleapis.com/calendar/v3/calendars/' + $items(\"Config\")[0].json.calendarId + '/events' }}",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "singleEvents",
"value": "true"
},
{
"name": "maxResults",
"value": "1"
},
{
"name": "=q",
"value": "={{ $json.externalKey }}"
}
]
},
"nodeCredentialType": "googleApi"
},
"typeVersion": 4.2
},
{
"id": "929dc366-f019-435e-88ed-9d1807ac70da",
"name": "발견된 이벤트 ID 첨부",
"type": "n8n-nodes-base.code",
"position": [
-448,
96
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// This Function is in \"Run Once for Each Item\" mode.\n// $json here is the HTTP search response for THIS PTO item.\n\nconst ev = Array.isArray($json.items) ? $json.items[0] : null;\n\n// IMPORTANT: use the current index, not 0\nconst i = $itemIndex;\nconst src = $items(\"Build Calendar Payload\")[i].json;\n\nreturn {\n json: {\n ...src, // keep your PTO fields for THIS item\n existingEventId: ev ? ev.id : null, // id if found\n found: !!ev // boolean for IF node\n }\n};\n"
},
"typeVersion": 2
},
{
"id": "b05c97db-3810-4847-8a24-b81a824894ab",
"name": "이벤트 존재 여부 확인",
"type": "n8n-nodes-base.if",
"position": [
-224,
96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "59967d64-2b86-4c86-a653-45adec8fba72",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.found }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1c3a725d-775e-452b-9567-b00f2a3181b2",
"name": "종일 이벤트 업데이트",
"type": "n8n-nodes-base.googleCalendar",
"notes": "Calendar ID pulled from the Config node: `$items(\"Config\")[0].json.calendarId`.",
"position": [
0,
0
],
"parameters": {
"eventId": "={{ $json.existingEventId }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "={{ $items(\"Config\")[0].json.calendarId }}"
},
"operation": "update",
"updateFields": {
"end": "={{ $json.endDateExclusive }}",
"start": "={{ $json.startDate }}",
"allday": "yes",
"summary": "={{ $json.employeeName }} - {{ $json.type }}",
"description": "=Everhour PTO\nKey: {{$json.externalKey}}\nType: {{$json.type}}\nStatus: {{$json.status}}\nNote: {{$json.note}}\n"
}
},
"notesInFlow": true,
"typeVersion": 1.3
},
{
"id": "ba91bdf7-b56a-4f61-adc3-ef1a016ebde6",
"name": "종일 이벤트 생성",
"type": "n8n-nodes-base.googleCalendar",
"notes": "Calendar ID pulled from the Config node: `$items(\"Config\")[0].json.calendarId`.",
"position": [
0,
192
],
"parameters": {
"end": "={{ $json.endDateExclusive }}",
"start": "={{ $json.startDate }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "={{ $items(\"Config\")[0].json.calendarId }}"
},
"additionalFields": {
"allday": "yes",
"summary": "={{ $json.employeeName }} - {{ $json.type }}",
"description": "=Everhour PTO\nKey: {{$json.externalKey}}\nType: {{$json.type}}\nStatus: {{$json.status}}\nNote: {{$json.note}}\n"
}
},
"notesInFlow": true,
"typeVersion": 1.3
},
{
"id": "2d4aeb2e-742d-499c-9e94-8a8be2c5c9d6",
"name": "할당 이벤트 목록화",
"type": "n8n-nodes-base.httpRequest",
"notes": "Calendar ID pulled from the Config node: `$items(\"Config\")[0].json.calendarId`.",
"position": [
-432,
576
],
"parameters": {
"url": "={{ 'https://www.googleapis.com/calendar/v3/calendars/' + $items(\"Config\")[0].json.calendarId + '/events' }}",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "singleEvents",
"value": "true"
},
{
"name": "maxResults",
"value": "2500"
},
{
"name": "orderBy",
"value": "startTime"
},
{
"name": "q",
"value": "={{ 'everhour:' + $json.assignmentId + ':' }}"
}
]
},
"nodeCredentialType": "googleApi"
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "cca57225-aef9-4426-9d21-816e8a882ab9",
"name": "사용되지 않는 이벤트 찾기 (할당별)",
"type": "n8n-nodes-base.code",
"position": [
-208,
576
],
"parameters": {
"jsCode": "// Run Once for ALL Items\n// Pair each HTTP Request2 result (events for an assignment) with the matching group from Code2\n\nconst groups = $items(\"Build Assignment Groups\").map(it => it.json); // <-- node name must match exactly\nconst out = [];\n\nfor (let i = 0; i < items.length; i++) {\n const group = groups[i];\n if (!group) continue;\n\n const current = new Set(group.currentKeys);\n const apiItems = Array.isArray(items[i].json.items) ? items[i].json.items : [];\n\n for (const ev of apiItems) {\n const desc = ev.description || \"\";\n const m = desc.match(/Key:\\s*(everhour:[^\\s]+)/i); // \"Key: everhour:<id>:<date>\"\n if (!m) continue;\n const key = m[1];\n\n if (!current.has(key)) {\n out.push({\n json: { eventId: ev.id, key, assignmentId: group.assignmentId }\n });\n }\n }\n}\n\nreturn out; // one item per stale event to delete\n"
},
"typeVersion": 2
},
{
"id": "acf5aa87-0784-4633-a127-0cae6a069bf8",
"name": "캘린더 이벤트 삭제",
"type": "n8n-nodes-base.googleCalendar",
"notes": "Calendar ID pulled from the Config node: `$items(\"Config\")[0].json.calendarId`.",
"position": [
16,
672
],
"parameters": {
"eventId": "={{ $json.eventId }}",
"options": {
"sendUpdates": "none"
},
"calendar": {
"__rl": true,
"mode": "list",
"value": "={{ $items(\"Config\")[0].json.calendarId }}"
},
"operation": "delete"
},
"notesInFlow": true,
"retryOnFail": true,
"typeVersion": 1.3
},
{
"id": "6c4c4f1e-7772-41f7-9ef9-22936167b523",
"name": "모든 Everhour 이벤트 목록화",
"type": "n8n-nodes-base.httpRequest",
"notes": "Calendar ID pulled from the Config node: `$items(\"Config\")[0].json.calendarId`.",
"position": [
-432,
768
],
"parameters": {
"url": "={{ 'https://www.googleapis.com/calendar/v3/calendars/' + $items(\"Config\")[0].json.calendarId + '/events' }}",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "singleEvents",
"value": "true"
},
{
"name": "maxResults",
"value": "2500"
},
{
"name": "orderBy",
"value": "startTime"
},
{
"name": "q",
"value": "everhour:"
}
]
},
"nodeCredentialType": "googleApi"
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "6651bc72-0b3d-4fe3-99cd-e1ff5a092da0",
"name": "사용되지 않는 이벤트 찾기 (전역)",
"type": "n8n-nodes-base.code",
"position": [
-208,
768
],
"parameters": {
"jsCode": "// Run Once for ALL Items\n// Compare calendar events (items[0].json.items) vs currentKeys from \"Build global key set\"\n\nconst current = new Set($items(\"Build Global Key Set\")[0].json.currentKeys);\nconst evs = Array.isArray(items[0].json.items) ? items[0].json.items : [];\nconst out = [];\n\nfor (const ev of evs) {\n const desc = ev.description || \"\";\n const m = desc.match(/Key:\\s*(everhour:[^\\s]+)/i); // extracts \"everhour:<id>:<date>\"\n if (!m) continue;\n const key = m[1];\n if (!current.has(key)) {\n out.push({ json: { eventId: ev.id, key }});\n }\n}\nreturn out; // one item per stale event to delete\n"
},
"typeVersion": 2
},
{
"id": "ac73d08e-3e0b-416f-8ec9-89b11e4c3a25",
"name": "구성",
"type": "n8n-nodes-base.set",
"notes": "Set your Google Calendar ID here. Example: team-calendar@group.calendar.google.com",
"position": [
-1856,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0b59d6f6-4e28-4f6d-a4ad-0cb253b9a65f",
"name": "calendarId",
"type": "string",
"value": "REPLACE_WITH_YOUR_CALENDAR_ID@group.calendar.google.com"
}
]
},
"includeOtherFields": true
},
"notesInFlow": true,
"typeVersion": 3.4,
"alwaysOutputData": true
},
{
"id": "9bde197a-7009-41d3-ac7e-6b86ccdd2863",
"name": "🗒️ 템플릿 설명 (읽어보기)",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2960,
160
],
"parameters": {
"color": null,
"width": 1024,
"height": 736,
"content": "## Everhour time-off sync to Google Calendar\n\n### Who’s it for\nTeams using **Everhour** for time tracking and **Google Calendar** for visibility.\n\n### What it does\n- Fetches **approved time-off** from Everhour\n- Creates/updates **all-day events** per day of absence\n- Deletes **stale events** if requests change or are canceled\n\n### How it works\n1. **Schedule Trigger** runs on an interval.\n2. Fetch Everhour assignments via API (Header Auth — set your Everhour API key in n8n credentials).\n3. Filter to **approved** time-off.\n4. Create/update events keyed by `everhour:<assignmentId>:<YYYY-MM-DD>`.\n5. Remove obsolete calendar events by comparing current keys with what’s on the calendar.\n\n### Setup\n- Create Everhour **Header Auth** credential: `X-Api-Key: <YOUR_EVERHOUR_API_KEY>`.\n- Add your **Google Calendar** OAuth credential to Calendar nodes.\n- In the **Config** node, set `calendarId` (e.g., `team@group.calendar.google.com`).\n\n### Customize\n- Change schedule cadence.\n- Filter by users/time-off types.\n- Adjust event title/description template.\n"
},
"typeVersion": 1
},
{
"id": "3dbeed2f-b8db-493e-ac9f-32b393008668",
"name": "참고: Everhour 가져오기",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1632,
240
],
"parameters": {
"color": 7,
"height": 336,
"content": "## **Fetch Everhour**\n\nFetch approved time-off from Everhour using Header Auth (no keys in node)."
},
"typeVersion": 1
},
{
"id": "a595b36f-b23f-4356-85ce-2da5a0758d03",
"name": "참고: 키 구성",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1168,
256
],
"parameters": {
"color": 7,
"width": 416,
"height": 336,
"content": "## **Build Keys**\n\nGenerate per-day `externalKey` like `everhour:<id>:<date>`."
},
"typeVersion": 1
},
{
"id": "b028f58c-bb85-4894-a274-a099a4ea92ec",
"name": "참고: 이벤트 업서트",
"type": "n8n-nodes-base.stickyNote",
"position": [
-720,
-112
],
"parameters": {
"color": 7,
"width": 976,
"height": 512,
"content": "## **Upsert Events**\n\nSearch by key → update if found, otherwise create all-day event."
},
"typeVersion": 1
},
{
"id": "921f878d-1014-4018-995c-bac11224961a",
"name": "참고: 정리",
"type": "n8n-nodes-base.stickyNote",
"position": [
-704,
432
],
"parameters": {
"color": 7,
"width": 960,
"height": 528,
"content": "## **Cleanup**\n\nList events and delete those not present in current keys."
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "13a31a87-6b2e-4e1d-9f14-0f8a350b0d78",
"connections": {
"fe08e8fe-779b-4428-8060-08da88a61118": {
"main": [
[
{
"node": "c76c87dc-876c-46f0-ac7e-a4a15ac3661c",
"type": "main",
"index": 0
},
{
"node": "ac73d08e-3e0b-416f-8ec9-89b11e4c3a25",
"type": "main",
"index": 0
}
]
]
},
"f210fb86-0d78-4140-adff-0573566b23ac": {
"main": [
[
{
"node": "6c4c4f1e-7772-41f7-9ef9-22936167b523",
"type": "main",
"index": 0
}
]
]
},
"929dc366-f019-435e-88ed-9d1807ac70da": {
"main": [
[
{
"node": "b05c97db-3810-4847-8a24-b81a824894ab",
"type": "main",
"index": 0
}
]
]
},
"b05c97db-3810-4847-8a24-b81a824894ab": {
"main": [
[
{
"node": "1c3a725d-775e-452b-9567-b00f2a3181b2",
"type": "main",
"index": 0
}
],
[
{
"node": "ba91bdf7-b56a-4f61-adc3-ef1a016ebde6",
"type": "main",
"index": 0
}
]
]
},
"c20edb41-1400-4f8d-a90e-c61bda0295c7": {
"main": [
[
{
"node": "11e26f03-b016-445a-99b1-72b9e5b8c0c3",
"type": "main",
"index": 0
},
{
"node": "8082b4f8-5ff0-4af3-ac3f-268cdd8bee97",
"type": "main",
"index": 0
},
{
"node": "f210fb86-0d78-4140-adff-0573566b23ac",
"type": "main",
"index": 0
}
]
]
},
"2d4aeb2e-742d-499c-9e94-8a8be2c5c9d6": {
"main": [
[
{
"node": "cca57225-aef9-4426-9d21-816e8a882ab9",
"type": "main",
"index": 0
}
]
]
},
"5fe3aab5-3136-4619-8857-96e53578adbd": {
"main": [
[
{
"node": "c20edb41-1400-4f8d-a90e-c61bda0295c7",
"type": "main",
"index": 0
}
]
]
},
"8082b4f8-5ff0-4af3-ac3f-268cdd8bee97": {
"main": [
[
{
"node": "2d4aeb2e-742d-499c-9e94-8a8be2c5c9d6",
"type": "main",
"index": 0
}
]
]
},
"92a16e7c-bb00-439f-b819-6b7557ff5017": {
"main": [
[
{
"node": "5fe3aab5-3136-4619-8857-96e53578adbd",
"type": "main",
"index": 0
}
]
]
},
"6c4c4f1e-7772-41f7-9ef9-22936167b523": {
"main": [
[
{
"node": "6651bc72-0b3d-4fe3-99cd-e1ff5a092da0",
"type": "main",
"index": 0
}
]
]
},
"c76c87dc-876c-46f0-ac7e-a4a15ac3661c": {
"main": [
[
{
"node": "92a16e7c-bb00-439f-b819-6b7557ff5017",
"type": "main",
"index": 0
}
]
]
},
"6651bc72-0b3d-4fe3-99cd-e1ff5a092da0": {
"main": [
[
{
"node": "acf5aa87-0784-4633-a127-0cae6a069bf8",
"type": "main",
"index": 0
}
]
]
},
"11e26f03-b016-445a-99b1-72b9e5b8c0c3": {
"main": [
[
{
"node": "929dc366-f019-435e-88ed-9d1807ac70da",
"type": "main",
"index": 0
}
]
]
},
"cca57225-aef9-4426-9d21-816e8a882ab9": {
"main": [
[
{
"node": "acf5aa87-0784-4633-a127-0cae6a069bf8",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 인사
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
HTTP Last-Modified 확인을 사용하여 Google Sheets에서 채용 공고 만료 및 새로고침 알림 가져오기
Google Sheets, HTTP 확인 및 Gmail을 통한 채용 공고 만료 알림 자동화
If
Set
Code
+
If
Set
Code
19 노드WeblineIndia
인사
GPT-4.1, Outlook 및 Mem.ai를 사용한 Microsoft Teams 회의 분석 자동화
GPT-4.1, Outlook 및 Mem.ai를 사용한 자동화된 Microsoft Teams 회의 분석
If
Set
Code
+
If
Set
Code
61 노드Wayne Simpson
인사
성과 검토 스케줄링 및 알림
Google Sheets, 캘린더, 이메일 및 Slack을 사용한 성과 검토 프로세스 자동화
If
Set
Code
+
If
Set
Code
16 노드Oneclick AI Squad
인사
AI 기반 회의 연구 및 일일 아젠다 (Google 캘린더, Attio CRM 및 Slack)
AI 기반 회의 연구 및 일일 아젠다: Google 캘린더, Attio CRM 및 Slack 활용
If
Set
Code
+
If
Set
Code
30 노드Harry Siggins
AI 요약
네일 살롱 (미국)
WhatsApp, GPT 및 Google 캘린더를 사용한 살롱 예약 관리 자동화
If
Set
Code
+
If
Set
Code
164 노드Denis
지원
자동화된 회의 준비
GPT-5 및 Gemini 리서치를 사용한 캘린더에서 Slack까지 Attio CRM 통해 회의 자동 준비
If
Set
Code
+
If
Set
Code
39 노드Harry Siggins
AI 요약