n8n API와 이메일을 사용하여 주간 작업 흐름 분석 보고서 생성
고급
이것은DevOps분야의자동화 워크플로우로, 19개의 노드를 포함합니다.주로 N8n, Set, Code, Gmail, Merge 등의 노드를 사용하며. n8n API와 이메일을 사용하여 주간 워크플로우 분석 보고서 생성
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
카테고리
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "89249a8a187ba6e01e16112a0d334a3aa01d510ad8f88d223e12cc0a2a8beb6b"
},
"nodes": [
{
"id": "9c2f922e-2f23-417f-9e26-f2f91d719728",
"name": "일정 트리거",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
912,
16
],
"parameters": {
"rule": {
"interval": [
{
"daysInterval": 7
}
]
}
},
"typeVersion": 1.1
},
{
"id": "ea56ce13-5b66-439c-8241-3c8eecb06eb8",
"name": "Get all previous executions",
"type": "n8n-nodes-base.n8n",
"position": [
1824,
112
],
"parameters": {
"filters": {},
"options": {},
"resource": "execution",
"returnAll": true,
"requestOptions": {}
},
"notesInFlow": false,
"typeVersion": 1
},
{
"id": "22cefb90-bce7-402d-a996-6489bda7c136",
"name": "Get all Workflows",
"type": "n8n-nodes-base.n8n",
"position": [
1424,
-160
],
"parameters": {
"filters": {},
"requestOptions": {}
},
"typeVersion": 1
},
{
"id": "b6395b45-7c15-4ab4-9dc4-905ddf04d54b",
"name": "병합",
"type": "n8n-nodes-base.merge",
"position": [
2496,
0
],
"parameters": {
"mode": "combine",
"options": {
"clashHandling": {
"values": {
"resolveClash": "preferLast"
}
}
},
"advanced": true,
"joinMode": "enrichInput2",
"mergeByFields": {
"values": [
{
"field1": "workflowId",
"field2": "workflowId"
}
]
}
},
"typeVersion": 3.2
},
{
"id": "8e131881-f7ab-46cf-9ebc-f006a819d66d",
"name": "Edit Field ID to workflowId",
"type": "n8n-nodes-base.set",
"position": [
2160,
-160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "474e54af-e79e-4d58-8c11-dbd920f0511c",
"name": "workflowId",
"type": "string",
"value": "={{ $json.id }}"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "12a17b24-b3c7-4d40-8a03-3b84c932521b",
"name": "필터 executions last week",
"type": "n8n-nodes-base.filter",
"position": [
2896,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "31745f1d-793a-4674-80ab-77afede449d6",
"operator": {
"type": "dateTime",
"operation": "after"
},
"leftValue": "={{ $json.startedAt }}",
"rightValue": "={{ DateTime.now().minus({ days: 7 }) }}"
}
]
}
},
"typeVersion": 2,
"alwaysOutputData": false
},
{
"id": "2e18c677-62ae-4228-9aeb-ba665f8d05c8",
"name": "Prepare html report",
"type": "n8n-nodes-base.code",
"position": [
3376,
0
],
"parameters": {
"jsCode": "// Calculate the date range (7 days ago to now)\nconst now = new Date();\nconst sevenDaysAgo = new Date(now.getTime() - (7 * 24 * 60 * 60 * 1000));\n\n// Group executions by workflow\nconst workflowStats = {};\n\nfor (const item of $input.all()) {\n const workflowId = item.json.workflowId;\n const workflowName = item.json.name;\n const status = item.json.status;\n const startedAt = new Date(item.json.startedAt);\n const stoppedAt = item.json.stoppedAt ? new Date(item.json.stoppedAt) : null;\n \n // Calculate runtime in seconds\n let runtime = 0;\n if (stoppedAt) {\n runtime = (stoppedAt - startedAt) / 1000; // Convert to seconds\n }\n \n // Initialize workflow stats if not exists\n if (!workflowStats[workflowId]) {\n workflowStats[workflowId] = {\n name: workflowName,\n id: workflowId,\n error: { count: 0, totalRuntime: 0 },\n success: { count: 0, totalRuntime: 0 },\n waiting: { count: 0, totalRuntime: 0 }\n };\n }\n \n // Update counts and runtime based on status\n if (status === 'error') {\n workflowStats[workflowId].error.count++;\n workflowStats[workflowId].error.totalRuntime += runtime;\n } else if (status === 'success') {\n workflowStats[workflowId].success.count++;\n workflowStats[workflowId].success.totalRuntime += runtime;\n } else if (status === 'waiting') {\n workflowStats[workflowId].waiting.count++;\n workflowStats[workflowId].waiting.totalRuntime += runtime;\n }\n}\n\n// Helper function to format date (without time)\nfunction formatDate(date) {\n const options = { \n year: 'numeric', \n month: 'long', \n day: 'numeric'\n };\n return date.toLocaleDateString('en-US', options);\n}\n\n// Helper function to format runtime\nfunction formatRuntime(seconds) {\n if (seconds < 60) {\n return `${seconds.toFixed(2)}s`;\n } else if (seconds < 3600) {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = (seconds % 60).toFixed(0);\n return `${minutes}m ${remainingSeconds}s`;\n } else {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n return `${hours}h ${minutes}m`;\n }\n}\n\n// Format date range for header and subject (7 days ago to now)\nconst fromDate = formatDate(sevenDaysAgo);\nconst toDate = formatDate(now);\nconst dateRangeText = `${fromDate} - ${toDate}`;\nconst subject = `n8n Execution Report ${fromDate} - ${toDate}`;\n\n// Build HTML report\nlet html = `\n<!DOCTYPE html>\n<html>\n<head>\n <style>\n body {\n font-family: Arial, sans-serif;\n margin: 20px;\n background-color: #f5f5f5;\n }\n .header {\n background-color: white;\n padding: 20px;\n margin-bottom: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n }\n h1 {\n color: #333;\n margin: 0 0 10px 0;\n }\n .date-range {\n color: #666;\n font-size: 1.1em;\n margin: 10px 0;\n }\n .summary {\n display: flex;\n gap: 20px;\n margin-top: 15px;\n }\n .summary-item {\n padding: 10px 15px;\n border-radius: 4px;\n font-weight: bold;\n }\n .summary-error {\n background-color: #ffebee;\n color: #c62828;\n }\n .summary-success {\n background-color: #e8f5e9;\n color: #2e7d32;\n }\n .summary-waiting {\n background-color: #fff3e0;\n color: #ef6c00;\n }\n table {\n width: 100%;\n border-collapse: collapse;\n background-color: white;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n border-radius: 8px;\n overflow: hidden;\n }\n th {\n background-color: #4CAF50;\n color: white;\n padding: 12px;\n text-align: left;\n font-weight: bold;\n }\n td {\n padding: 10px 12px;\n border-bottom: 1px solid #ddd;\n }\n tr:hover {\n background-color: #f5f5f5;\n }\n .workflow-name {\n font-weight: bold;\n color: #333;\n }\n .workflow-id {\n color: #666;\n font-size: 0.9em;\n display: block;\n margin-top: 4px;\n }\n .status-cell {\n text-align: center;\n }\n .status-badge {\n display: inline-block;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.85em;\n font-weight: bold;\n margin-bottom: 4px;\n }\n .error { background-color: #ffebee; color: #c62828; }\n .success { background-color: #e8f5e9; color: #2e7d32; }\n .waiting { background-color: #fff3e0; color: #ef6c00; }\n .runtime {\n font-size: 0.8em;\n color: #666;\n display: block;\n margin-top: 2px;\n }\n .no-data {\n color: #999;\n font-style: italic;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <h1>n8n Execution Report</h1>\n <div class=\"date-range\">\n <strong>Period:</strong> ${dateRangeText}\n </div>\n`;\n\n// Calculate totals for summary\nlet totalError = 0;\nlet totalSuccess = 0;\nlet totalWaiting = 0;\n\nfor (const workflowId in workflowStats) {\n const stats = workflowStats[workflowId];\n totalError += stats.error.count;\n totalSuccess += stats.success.count;\n totalWaiting += stats.waiting.count;\n}\n\nhtml += `\n <div class=\"summary\">\n <div class=\"summary-item summary-error\">\n ✗ ${totalError} Errors\n </div>\n <div class=\"summary-item summary-success\">\n ✓ ${totalSuccess} Success\n </div>\n <div class=\"summary-item summary-waiting\">\n ⏳ ${totalWaiting} Waiting\n </div>\n </div>\n </div>\n \n <table>\n <thead>\n <tr>\n <th>Workflow</th>\n <th class=\"status-cell\">Error</th>\n <th class=\"status-cell\">Success</th>\n <th class=\"status-cell\">Waiting</th>\n </tr>\n </thead>\n <tbody>\n`;\n\n// Add rows for each workflow\nfor (const workflowId in workflowStats) {\n const stats = workflowStats[workflowId];\n \n html += `\n <tr>\n <td>\n <span class=\"workflow-name\">${stats.name}</span>\n <span class=\"workflow-id\">${stats.id}</span>\n </td>\n `;\n \n // Error column\n html += '<td class=\"status-cell\">';\n if (stats.error.count > 0) {\n const avgRuntime = stats.error.totalRuntime / stats.error.count;\n html += `\n <span class=\"status-badge error\">✗ ${stats.error.count}</span>\n <span class=\"runtime\">Avg: ${formatRuntime(avgRuntime)}</span>\n <span class=\"runtime\">Total: ${formatRuntime(stats.error.totalRuntime)}</span>\n `;\n } else {\n html += '<span class=\"no-data\">-</span>';\n }\n html += '</td>';\n \n // Success column\n html += '<td class=\"status-cell\">';\n if (stats.success.count > 0) {\n const avgRuntime = stats.success.totalRuntime / stats.success.count;\n html += `\n <span class=\"status-badge success\">✓ ${stats.success.count}</span>\n <span class=\"runtime\">Avg: ${formatRuntime(avgRuntime)}</span>\n <span class=\"runtime\">Total: ${formatRuntime(stats.success.totalRuntime)}</span>\n `;\n } else {\n html += '<span class=\"no-data\">-</span>';\n }\n html += '</td>';\n \n // Waiting column\n html += '<td class=\"status-cell\">';\n if (stats.waiting.count > 0) {\n const avgRuntime = stats.waiting.totalRuntime / stats.waiting.count;\n html += `\n <span class=\"status-badge waiting\">⏳ ${stats.waiting.count}</span>\n <span class=\"runtime\">Avg: ${formatRuntime(avgRuntime)}</span>\n <span class=\"runtime\">Total: ${formatRuntime(stats.waiting.totalRuntime)}</span>\n `;\n } else {\n html += '<span class=\"no-data\">-</span>';\n }\n html += '</td>';\n \n html += '</tr>';\n}\n\nhtml += `\n </tbody>\n </table>\n</body>\n</html>\n`;\n\nreturn [{ json: { html: html, subject: subject } }];"
},
"typeVersion": 2
},
{
"id": "4b1154e2-76bc-4b8c-a2b6-f4338a3c3f10",
"name": "Send a message gmail",
"type": "n8n-nodes-base.gmail",
"position": [
3792,
-176
],
"webhookId": "c0581cd3-0b50-4ed9-844d-2e4c7af1b30a",
"parameters": {
"message": "={{ $json.html }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"typeVersion": 2.1
},
{
"id": "2946c6b2-f93f-4e31-bca1-14995de72e7d",
"name": "Send a message outlook",
"type": "n8n-nodes-base.microsoftOutlook",
"position": [
3792,
96
],
"webhookId": "87fa1111-29bb-471d-b68f-ae35f785dc6f",
"parameters": {
"subject": "={{ $json.subject }}",
"bodyContent": "={{ $json.html }}",
"additionalFields": {
"bodyContentType": "html"
}
},
"typeVersion": 2
},
{
"id": "0faa8265-c32e-479f-873d-c603722afe12",
"name": "메모 - Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
224,
-160
],
"parameters": {
"color": 3,
"width": 600,
"height": 1020,
"content": "## Workflow Overview for Documenting n8n Executions\n\n### Goal:\nThis workflow automates the process of documenting all previous workflow executions within n8n. By fetching data on past executions and workflows, it generates a comprehensive report that can be sent via email. This helps users keep track of their automation tasks and assess performance efficiently.\n\n### How it works:\n- 🕑 **Schedule Trigger**: Initiates the workflow at defined intervals.\n- 🔄 **Get All Previous Executions**: Fetches logs of past executions from n8n.\n- 📄 **Get All Workflows**: Retrieves current workflows set up in the environment.\n- 🔗 **Merge**: Combines data from previous executions and workflows for comprehensive analysis.\n- 🏷️ **Edit Field ID to workflowId**: Updates specific identifiers to ensure correct mapping.\n- 🔎 **Filter Executions Last Week**: Filters data to only include executions from the last week.\n- 📝 **Prepare HTML Report**: Formats the filtered data into a structured HTML report.\n- 📧 **Send a Message via Gmail & Outlook**: Delivers the report to users' email accounts for easy access.\n\n### Parameters to configure:\n- 🕑 **Schedule settings**: Specify the frequency of the trigger.\n- ✉️ **Email configurations**: Set Gmail and Outlook authentication details for message delivery.\n\n### Limitations / Gotchas:\n- 📅 Ensure the schedule does not overlap with high load times.\n- 🔒 Check permissions for accessing previous executions data.\n\n### Expected result:\nUsers receive an HTML report in their inbox summarizing workflow executions from the past week, facilitating performance tracking and documentation.\n"
},
"typeVersion": 1
},
{
"id": "595171e1-c6b0-48b8-bf86-86ffb155e118",
"name": "Sticky Note - Send a message gmail",
"type": "n8n-nodes-base.stickyNote",
"position": [
3664,
-1056
],
"parameters": {
"color": 7,
"width": 380,
"height": 860,
"content": "## 📧 Send a message Gmail \n\n### Purpose\nSend an email using Gmail service with specified subject and message content.\n\n### Inputs / Outputs\n- **Inputs:** \n - Subject: The title of the email.\n - Message: The main body content of the email in HTML format.\n- **Outputs:** \n - Confirmation of the email sent or error details if the process fails.\n\n### Key Fields to Configure\n- **Subject:** \n - Set using the expression `={{ $json.subject }}`, allowing dynamic subject lines based on input data.\n- **Message:** \n - Set using the expression `={{ $json.html }}`, allowing HTML formatted content for the email body.\n \n### Tip / Validation\n- Ensure that Gmail OAuth2 credentials are correctly configured and authorized for sending emails.\n- Check the formatting of the HTML content to ensure proper rendering in the recipient's email client.\n- This node is currently **disabled**; enable it for functionality.\n- Remember to handle potential API errors and response codes from Gmail when sending messages."
},
"typeVersion": 1
},
{
"id": "7a12b760-b67c-47ff-995c-6ac53194a036",
"name": "메모 - Send a message outlook",
"type": "n8n-nodes-base.stickyNote",
"position": [
3680,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## 📩 Send a message outlook \n\n### Purpose\nSend an email through Microsoft Outlook to specified recipients, integrating with workflows for communication purposes.\n\n### Inputs / Outputs\n- **Inputs:** \n - Recipients' email address (e.g., `wessel@bulte.org`).\n - Email subject and body content (HTML format).\n- **Outputs:**\n - Confirmation that the message was sent successfully.\n\n### Key Fields to Configure\n- **toRecipients:** \n - Email addresses of the recipients. \n- **subject:** \n - Subject line of the email. Can use dynamic values (e.g., `\"={{ $json.subject }}\"`).\n- **bodyContent:** \n - Main content of the email, formatted as HTML (e.g., `\"={{ $json.html }}\"`).\n- **bodyContentType:** \n - Default is set to `\"html\"` to ensure proper formatting.\n\n### Tip / Validation\n- Verify that the email address provided in `toRecipients` is valid to avoid delivery failures.\n- Ensure the subject and body contain meaningful content for better communication.\n- Check that the OAuth credentials for Microsoft Outlook are correctly configured to avoid authentication errors."
},
"typeVersion": 1
},
{
"id": "a85a215d-c1ef-4695-b965-9d3a56cfd9b1",
"name": "Sticky Note - Prepare html report",
"type": "n8n-nodes-base.stickyNote",
"position": [
3248,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## 📁 Prepare HTML Report \n\n### Purpose\nGenerate an HTML report summarizing workflow execution statistics over the past 7 days, including counts of errors, successes, and waiting workflows.\n\n### Inputs / Outputs\n- **Inputs:** \n - Data from previous nodes containing execution records with fields like `workflowId`, `name`, `status`, `startedAt`, and `stoppedAt`.\n- **Outputs:** \n - An HTML string containing the formatted report and an email subject line for reference.\n\n### Key Operations\n- **Date Range Calculation:**\n - Retrieves execution data from the last 7 days.\n \n- **Statistics Grouping:**\n - Aggregates execution counts and total runtimes by workflow status (error, success, waiting).\n\n- **HTML Report Construction:**\n - Builds a styled HTML document that visually represents workflow execution statistics, including a summary and detailed table format."
},
"typeVersion": 1
},
{
"id": "d134b4f0-1fbc-404c-9edc-9f2884824226",
"name": "Sticky Note - 필터 executions last week",
"type": "n8n-nodes-base.stickyNote",
"position": [
2848,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## Filter Executions Last Week\n\n### Purpose\nFilter out executions that were started in the last week, allowing for targeted analysis and documentation of recent workflow activities.\n\n### Inputs / Outputs\n- **Inputs:** \n - Workflow execution data including start date (`startedAt`).\n- **Outputs:** \n - Filtered data of executions that occurred within the past week.\n\n### Key Fields to Configure\n- **Conditions:** \n - Uses a single condition to check if the `startedAt` date is after the date that was exactly 7 days prior to the current date.\n - **Operator:** \n - Type: `dateTime`\n - Operation: `after`\n - **Left Value:** \n - `={{ $json.startedAt }}`\n - **Right Value:**\n - `={{ DateTime.now().minus({ days: 7 }) }}`\n\n### Tip / Validation\n- Ensure the `startedAt` date formatted correctly (ISO 8601 is recommended) for accurate filtering.\n- Remember that the comparison is case-sensitive due to the option `caseSensitive: true`. Adjust if necessary for your context.\n- This node does not always output data; ensure downstream nodes handle the absence of expected data gracefully."
},
"typeVersion": 1
},
{
"id": "d6d8301c-b2f7-4e8b-b3ed-f32edd84c92b",
"name": "Sticky Note - 병합",
"type": "n8n-nodes-base.stickyNote",
"position": [
2448,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## Merge \n\n### Purpose\nCombine two data sets based on specified fields to enrich the input with additional information.\n\n### Inputs / Outputs\n- **Inputs:** \n - Two data sets to be merged, identified by the `workflowId` field.\n- **Outputs:** \n - A single data set that merges the attributes of both inputs according to the defined merging strategy.\n"
},
"typeVersion": 1
},
{
"id": "95f22f9d-86fa-4cc3-aeba-38d90320ca29",
"name": "메모 - Edit Field ID to workflowId",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## Edit Field ID to workflowId \n\n### Purpose\nThis node updates the field ID in the provided JSON data to a new key named `workflowId`, streamlining the data structure for easier identification and reference.\n\n### Inputs / Outputs\n- **Inputs:** \n - JSON data containing an `id` field to be transformed into `workflowId`.\n- **Outputs:** \n - Modified JSON data with the `workflowId` field instead of the original `id`.\n\n### Key Fields to Configure\n- **Assignments:**\n - **ID:** Unique identifier for the newly created field.\n - **Name:** Set to `workflowId` to reflect the new key.\n - **Value:** Expression `={{ $json.id }}` to extract the original `id` value.\n\n### Tip / Validation\n- Ensure the original JSON contains the `id` field for successful transformation; otherwise, the output may not reflect the desired structure.\n- Use the `includeOtherFields` option to retain additional fields during the transformation process."
},
"typeVersion": 1
},
{
"id": "9be4bac7-d68a-47d8-87c5-99df34830f13",
"name": "메모 - Get all previous executions",
"type": "n8n-nodes-base.stickyNote",
"position": [
1664,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## Get All Previous Executions \n\n### Purpose\nRetrieve all previous executions of a specified resource, enabling users to track and document the history of actions performed in workflows.\n\n### Inputs / Outputs\n- **Inputs:** \n - None required; the node automatically fetches all previous executions.\n- **Outputs:** \n - A list of previous execution records, which can be used for analysis or logging purposes.\n\n### Key Fields to Configure\n- **Resource:**\n - Set to `execution` to specify that the node is fetching execution records.\n- **Return All:**\n - Set to `true` to ensure all previous executions are retrieved.\n- **Filters:** \n - Can be customized to narrow down results based on specific criteria (currently empty).\n- **Options & Request Options:** \n - Additional configurations can be added if necessary (currently empty).\n"
},
"typeVersion": 1
},
{
"id": "9946f889-e6c4-46e0-bd6e-b5fe41a6e991",
"name": "메모 - Get all Workflows",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## Get all Workflows \n\n### Purpose\nFetch all workflows stored in n8n to facilitate documentation and management of automation processes.\n\n### Inputs / Outputs\n- **Inputs:** \n - None (The node retrieves all workflows without needing specific parameters).\n- **Outputs:** \n - A list of all available workflows, including their metadata (IDs, names, etc.).\n\n### Key Fields to Configure\n- **Filters:** \n - Currently configured as empty (no specific filters are set).\n- **Request Options:** \n - Also currently empty, allowing for default request behavior.\n\n### Tip / Validation\n- Make sure you have the appropriate permissions set in your n8n account to access workflow data.\n- This node may return a large dataset if numerous workflows exist, so consider handling the response efficiently to avoid performance issues."
},
"typeVersion": 1
},
{
"id": "27a53d26-b49c-41f9-9cde-49c81e3a5454",
"name": "Sticky Note - 일정 트리거",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
304
],
"parameters": {
"color": 7,
"width": 380,
"height": 1020,
"content": "## 🗓️ Schedule Trigger \n\n### Purpose\nThis node initiates a scheduled trigger, allowing workflows to run at specified intervals."
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Merge": {
"main": [
[
{
"node": "Filter executions last week",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "ea56ce13-5b66-439c-8241-3c8eecb06eb8",
"type": "main",
"index": 0
},
{
"node": "22cefb90-bce7-402d-a996-6489bda7c136",
"type": "main",
"index": 0
}
]
]
},
"22cefb90-bce7-402d-a996-6489bda7c136": {
"main": [
[
{
"node": "8e131881-f7ab-46cf-9ebc-f006a819d66d",
"type": "main",
"index": 0
}
]
]
},
"2e18c677-62ae-4228-9aeb-ba665f8d05c8": {
"main": [
[
{
"node": "2946c6b2-f93f-4e31-bca1-14995de72e7d",
"type": "main",
"index": 0
},
{
"node": "4b1154e2-76bc-4b8c-a2b6-f4338a3c3f10",
"type": "main",
"index": 0
}
]
]
},
"8e131881-f7ab-46cf-9ebc-f006a819d66d": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Filter executions last week": {
"main": [
[
{
"node": "2e18c677-62ae-4228-9aeb-ba665f8d05c8",
"type": "main",
"index": 0
}
]
]
},
"ea56ce13-5b66-439c-8241-3c8eecb06eb8": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 데브옵스
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
n8n 워크플로우를 OneDrive에 백업
정리 및 이메일 알림 기능을 포함한 OneDrive에 n8n 워크플로 자동 백업
N8n
Code
Merge
+
N8n
Code
Merge
29 노드Wessel Bulte
데브옵스
귀하의 워크플로우를 GitHub 저장소에 저장
매일 워크플로우 백업을 GitHub에 저장하고 Slack 알림 전송
If
N8n
Set
+
If
N8n
Set
18 노드Andrew
데브옵스
GitHub 동기화 대시보드 - V2
提交 기록과 롤백 기능을 갖춘 GitHub 워크플로우 버전 관리 대시보드
If
N8n
Set
+
If
N8n
Set
94 노드Eduard
데브옵스
TenderNed를 사용한 네덜란드 공공 조달 데이터 수집 자동화
TenderNed를 사용한 네덜란드 공공 조달 데이터 수집 자동화
Xml
Code
Merge
+
Xml
Code
Merge
28 노드Wessel Bulte
시장 조사
고급 n8n 워크플로우와 GitHub 동기화
GitHub를 활용한 지능형 변경 감지 자동화 워크플로우 백업
If
N8n
Set
+
If
N8n
Set
38 노드Maksym Brashenko
데브옵스
자동화된 n8n 워크플로우 백업至 GitHub 및 삭제 추적
삭제 추적이 포함된 GitHub 자동화 n8n 워크플로우 백업
If
N8n
Set
+
If
N8n
Set
31 노드Marcial Ambriz
데브옵스
워크플로우 정보
난이도
고급
노드 수19
카테고리1
노드 유형9
저자
Wessel Bulte
@uuesselCybersecurity and automation consultant specializing in n8n workflows for GDPR compliance, process optimization, and business integration. Helping teams streamline operations with secure, scalable automation solutions.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유