自动化 Jira 与 Monday.com 之间的跨项目依赖跟踪
高级
这是一个自动化工作流,包含 21 个节点。主要使用 If, Code, Cron, Jira, Gmail 等节点。 自动化Jira和Monday.com之间的跨项目依赖关系跟踪
前置要求
- •Google 账号和 Gmail API 凭证
- •Slack Bot Token 或 Webhook URL
分类
-
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "hXfojMGA8g8QnEdF",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "自动化 Jira 与 Monday.com 之间的跨项目依赖跟踪",
"tags": [],
"nodes": [
{
"id": "b7490099-ba71-42e9-b2cc-0ce23060a602",
"name": "工作流描述",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1360,
-400
],
"parameters": {
"color": 4,
"width": 389,
"height": 560,
"content": "## 🎯 工作流概览"
},
"typeVersion": 1
},
{
"id": "185308d0-69ba-44f1-bdbe-a93ce06a5209",
"name": "触发器(夜间运行)",
"type": "n8n-nodes-base.cron",
"position": [
-736,
-144
],
"parameters": {
"triggerTimes": {
"item": [
{}
]
}
},
"typeVersion": 1
},
{
"id": "1bd430b2-9823-4650-af57-a7870851d9d2",
"name": "注释 - 触发器",
"type": "n8n-nodes-base.stickyNote",
"position": [
-944,
-448
],
"parameters": {
"width": 262,
"height": 306,
"content": "## ⏰ 计划触发器"
},
"typeVersion": 1
},
{
"id": "b7cf7c45-aa71-4369-9d8b-3bc7a612a285",
"name": "注释 - 获取",
"type": "n8n-nodes-base.stickyNote",
"position": [
-592,
32
],
"parameters": {
"width": 262,
"height": 357,
"content": "## 📋 获取未解决问题"
},
"typeVersion": 1
},
{
"id": "6d07db03-aa56-43ec-bad8-ba089d2b973a",
"name": "过滤依赖关系",
"type": "n8n-nodes-base.if",
"position": [
-304,
-144
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.fields.issuelinks }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "9686f647-dafd-4597-842b-ff35aab99c23",
"name": "注释 - 过滤器",
"type": "n8n-nodes-base.stickyNote",
"position": [
-384,
-448
],
"parameters": {
"width": 262,
"height": 290,
"content": "## 🔍 过滤依赖关系"
},
"typeVersion": 1
},
{
"id": "1ad0a222-37d2-4529-baf7-46fdcf31a704",
"name": "提取依赖关系详情",
"type": "n8n-nodes-base.function",
"position": [
-80,
-144
],
"parameters": {
"functionCode": "const items = [];\n\nfor (const item of $input.all()) {\n const issue = item.json;\n const issueKey = issue.key;\n const summary = issue.fields.summary;\n const dueDate = issue.fields.duedate || 'No due date';\n const assignee = issue.fields.assignee?.displayName || 'Unassigned';\n const assigneeEmail = issue.fields.assignee?.emailAddress || '';\n const issueLinks = issue.fields.issuelinks || [];\n \n // Process each issue link\n for (const link of issueLinks) {\n const linkTypeName = link.type.name;\n let dependencyType = '';\n let linkedIssueKey = '';\n let linkedIssueSummary = '';\n let linkedIssueStatus = '';\n let linkedIssuePriority = '';\n \n // Check if this issue is blocked by another issue (inwardIssue)\n if (link.inwardIssue) {\n dependencyType = link.type.inward; // \"is blocked by\"\n linkedIssueKey = link.inwardIssue.key;\n linkedIssueSummary = link.inwardIssue.fields?.summary || '';\n linkedIssueStatus = link.inwardIssue.fields?.status?.name || '';\n linkedIssuePriority = link.inwardIssue.fields?.priority?.name || '';\n }\n // Check if this issue blocks another issue (outwardIssue)\n else if (link.outwardIssue) {\n dependencyType = link.type.outward; // \"blocks\"\n linkedIssueKey = link.outwardIssue.key;\n linkedIssueSummary = link.outwardIssue.fields?.summary || '';\n linkedIssueStatus = link.outwardIssue.fields?.status?.name || '';\n linkedIssuePriority = link.outwardIssue.fields?.priority?.name || '';\n }\n \n // Only add items where we found a linked issue\n if (linkedIssueKey) {\n items.push({\n json: {\n issueKey,\n summary,\n dueDate,\n assignee,\n assigneeEmail,\n linkType: linkTypeName,\n dependencyType,\n linkedIssueKey,\n linkedIssueSummary,\n linkedIssueStatus,\n linkedIssuePriority\n }\n });\n }\n }\n}\n\nreturn items;"
},
"typeVersion": 1
},
{
"id": "094d3001-f935-493a-b59e-bef2d0ca431e",
"name": "注释 - 提取",
"type": "n8n-nodes-base.stickyNote",
"position": [
-160,
32
],
"parameters": {
"width": 262,
"height": 274,
"content": "## 🔗 提取依赖关系"
},
"typeVersion": 1
},
{
"id": "03f0b995-e4d5-45d4-90ec-fd987ae34833",
"name": "计算影响评分",
"type": "n8n-nodes-base.function",
"position": [
144,
-48
],
"parameters": {
"functionCode": "const items = [];\n\nfor (const item of $input.all()) {\n const jiraData = item.json;\n const issueKey = jiraData.issueKey;\n const dueDate = jiraData.dueDate;\n const linkedIssueKey = jiraData.linkedIssueKey;\n \n let daysTillDue = 999;\n let riskFlag = 'Low';\n \n if (dueDate && dueDate !== 'No due date') {\n const today = new Date();\n const due = new Date(dueDate);\n daysTillDue = Math.ceil((due - today) / (1000 * 60 * 60 * 24));\n \n if (daysTillDue < 7) {\n riskFlag = 'High';\n } else if (daysTillDue < 14) {\n riskFlag = 'Medium';\n }\n }\n \n const blockerCount = jiraData.dependencyType === 'is blocked by' ? 1 : 0.5;\n const impactScore = Math.round(blockerCount * Math.max(1, 30 - daysTillDue));\n \n items.push({\n json: {\n ...jiraData,\n daysTillDue,\n riskFlag,\n impactScore\n }\n });\n}\n\nreturn items;"
},
"typeVersion": 1
},
{
"id": "5b2ad399-43f0-43dd-a248-312191e77080",
"name": "注释 - 计算",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
96
],
"parameters": {
"width": 262,
"height": 285,
"content": "## 📊 风险计算"
},
"typeVersion": 1
},
{
"id": "11f3c704-bca8-4273-9a2d-bb6cf551f47d",
"name": "创建 Monday.com 项目",
"type": "n8n-nodes-base.mondayCom",
"position": [
144,
-240
],
"parameters": {
"name": "={{ $json.summary }}",
"boardId": "YOUR_BOARD_ID",
"groupId": "topics",
"resource": "boardItem",
"additionalFields": {}
},
"credentials": {
"mondayComApi": {
"id": "Kxmnf2TltEtJLxDA",
"name": "Monday.com account"
}
},
"typeVersion": 1
},
{
"id": "3bc54dd5-633e-4669-b8de-48bb5f93a848",
"name": "注释 - Monday",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-512
],
"parameters": {
"width": 262,
"height": 258,
"content": "## 📋 Monday.com 同步"
},
"typeVersion": 1
},
{
"id": "791ada1e-1556-4972-9cb5-fbd473f8abaa",
"name": "注释 - 邮件格式",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-528
],
"parameters": {
"width": 262,
"height": 285,
"content": "## 📧 邮件格式化器"
},
"typeVersion": 1
},
{
"id": "e3f85e5e-2552-4ffc-a05b-e204e65955d1",
"name": "发送邮件报告",
"type": "n8n-nodes-base.gmail",
"position": [
592,
-240
],
"webhookId": "cbf02576-4560-431f-831c-885fdd29da1d",
"parameters": {
"sendTo": "YOUR_EMAIL@example.com",
"message": "={{ $json.html }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"id": "70f5n8rPahCANHs7",
"name": "jyothi"
}
},
"typeVersion": 2
},
{
"id": "ac63b00c-f50e-4a7d-a7c1-b3f2a42c7733",
"name": "注释 - Gmail",
"type": "n8n-nodes-base.stickyNote",
"position": [
656,
-496
],
"parameters": {
"width": 262,
"height": 285,
"content": "## 📬 Gmail 发送器"
},
"typeVersion": 1
},
{
"id": "cd553b4f-2e1b-42c8-9db2-13ccc0c5b2ed",
"name": "创建协调任务",
"type": "n8n-nodes-base.jira",
"position": [
368,
-48
],
"parameters": {
"project": {
"__rl": true,
"mode": "list",
"value": "YOUR_PROJECT_ID",
"cachedResultName": "Coordination Project"
},
"summary": "=Dependency Coordination: {{ $json.issueKey }} → {{ $json.linkedIssueKey }}",
"issueType": {
"__rl": true,
"mode": "list",
"value": "10006",
"cachedResultName": "Task"
},
"additionalFields": {
"description": "=Impact Score: {{ $json.impactScore }}\\nRisk Level: {{ $json.riskFlag }}\\nDays Till Due: {{ $json.daysTillDue }}\\n\\nSource Issue: {{ $json.issueKey }} - {{ $json.summary }}\\nBlocked By: {{ $json.linkedIssueKey }} - {{ $json.linkedIssueSummary }}\\n\\nAction Required: Coordinate with dependency owner to resolve blocker."
}
},
"credentials": {
"jiraSoftwareCloudApi": {
"id": "AnaUUmFzt0vUQADt",
"name": "jyothi"
}
},
"typeVersion": 1
},
{
"id": "75ed5b66-ec43-43d0-954d-cc5a4dfbea02",
"name": "注释 - 协调",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-80
],
"parameters": {
"width": 262,
"height": 285,
"content": "## 📝 创建 Jira 任务"
},
"typeVersion": 1
},
{
"id": "27003e76-5b0b-4ff5-928a-9d3d9a062c1f",
"name": "发布到Slack",
"type": "n8n-nodes-base.slack",
"position": [
368,
160
],
"webhookId": "d9341fdd-659e-41b0-b494-74870fb11494",
"parameters": {
"text": "=*Dependency Radar Alert*\n\n{{ $json.riskFlag === 'High' ? '🔴' : ($json.riskFlag === 'Medium' ? '🟠' : '🟢') }} *{{ $json.issueKey }}* is {{ $json.dependencyType }} *{{ $json.linkedIssueKey }}*\n\n*Impact Score:* {{ $json.impactScore }}\n*Days Till Due:* {{ $json.daysTillDue }}\n*Risk Level:* {{ $json.riskFlag }}\n\nCoordination task created in Jira.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_CHANNEL_ID",
"cachedResultName": "project-alerts"
},
"otherOptions": {}
},
"typeVersion": 2
},
{
"id": "350fe417-1e8b-4451-9228-a64087d75a61",
"name": "注释 - Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
480,
272
],
"parameters": {
"width": 262,
"height": 285,
"content": "## 💬 Slack 提醒"
},
"typeVersion": 1
},
{
"id": "27dcf4a8-02ad-4ee5-b599-0675c696e34e",
"name": "获取未解决的 Jira 问题",
"type": "n8n-nodes-base.jira",
"position": [
-528,
-144
],
"parameters": {
"options": {
"jql": "project = YOUR_PROJECT_KEY AND statusCategory != Done"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"jiraSoftwareCloudApi": {
"id": "AnaUUmFzt0vUQADt",
"name": "jyothi"
}
},
"typeVersion": 1
},
{
"id": "0914ca57-8aeb-474b-bb51-473854353e4f",
"name": "邮件格式化器",
"type": "n8n-nodes-base.code",
"position": [
368,
-240
],
"parameters": {
"jsCode": "// HTML Email Formatter for Dependency Risk Report\nlet data;\n\nif ($input.all().length > 0 && Array.isArray($input.all()[0].json)) {\n data = $input.all()[0].json;\n} else if ($input.all().length > 0 && $input.all()[0].json.data) {\n data = $input.all()[0].json.data;\n} else if (Array.isArray($input.all())) {\n data = $input.all().map(item => item.json);\n} else {\n data = $input.all();\n}\n\nif (!Array.isArray(data)) {\n data = [data];\n}\n\nfunction generateHTMLEmail(data) {\n const today = new Date().toLocaleDateString('en-US', { \n year: 'numeric', \n month: 'long', \n day: 'numeric' \n });\n \n const blockingIssues = data.filter(item => item.dependencyType === 'blocks');\n const blockedIssues = data.filter(item => item.dependencyType === 'is blocked by');\n \n const blockingRows = blockingIssues.map(item => `\n <tr>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">\n <strong style=\"color: #1f2937;\">${item.issueKey}</strong>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">${item.summary}</td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">${item.assignee}</td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n ${item.dueDate !== 'No due date' ? item.dueDate : '<span style=\"color: #6b7280;\">-</span>'}\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n ${item.daysTillDue !== 999 ? `<span style=\"color: ${item.daysTillDue <= 2 ? '#dc2626' : '#f59e0b'}; font-weight: 600;\">${item.daysTillDue} days</span>` : '<span style=\"color: #6b7280;\">-</span>'}\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">\n <strong>${item.linkedIssueKey}</strong><br/>\n <span style=\"color: #6b7280; font-size: 13px;\">${item.linkedIssueSummary}</span>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n <span style=\"padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: 600; background-color: ${item.riskFlag === 'High' ? '#fee2e2' : '#fef3c7'}; color: ${item.riskFlag === 'High' ? '#dc2626' : '#f59e0b'};\">\n ${item.riskFlag}\n </span>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n <span style=\"font-weight: 600; color: ${item.impactScore >= 20 ? '#dc2626' : '#f59e0b'};\">${item.impactScore}</span>\n </td>\n </tr>\n `).join('');\n \n const blockedRows = blockedIssues.map(item => `\n <tr>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">\n <strong style=\"color: #1f2937;\">${item.issueKey}</strong>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">${item.summary}</td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">${item.assignee}</td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n ${item.dueDate !== 'No due date' ? item.dueDate : '<span style=\"color: #6b7280;\">-</span>'}\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n ${item.daysTillDue !== 999 ? `<span style=\"color: ${item.daysTillDue <= 2 ? '#dc2626' : '#f59e0b'}; font-weight: 600;\">${item.daysTillDue} days</span>` : '<span style=\"color: #6b7280;\">-</span>'}\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb;\">\n <strong>${item.linkedIssueKey}</strong><br/>\n <span style=\"color: #6b7280; font-size: 13px;\">${item.linkedIssueSummary}</span>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n <span style=\"padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: 600; background-color: ${item.riskFlag === 'High' ? '#fee2e2' : '#fef3c7'}; color: ${item.riskFlag === 'High' ? '#dc2626' : '#f59e0b'};\">\n ${item.riskFlag}\n </span>\n </td>\n <td style=\"padding: 12px; border-bottom: 1px solid #e5e7eb; text-align: center;\">\n <span style=\"font-weight: 600; color: ${item.impactScore >= 20 ? '#dc2626' : '#f59e0b'};\">${item.impactScore}</span>\n </td>\n </tr>\n `).join('');\n \n const htmlEmail = `\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Issue Dependency Risk Report</title>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f3f4f6;\">\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"background-color: #f3f4f6; padding: 20px;\">\n <tr>\n <td align=\"center\">\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width: 1200px; background-color: #ffffff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\">\n <tr>\n <td style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 30px; border-radius: 8px 8px 0 0;\">\n <h1 style=\"margin: 0; color: #ffffff; font-size: 28px; font-weight: 700;\">🚨 Issue Dependency Risk Report</h1>\n <p style=\"margin: 8px 0 0 0; color: #e0e7ff; font-size: 14px;\">Generated on ${today}</p>\n </td>\n </tr>\n <tr>\n <td style=\"padding: 30px;\">\n <div style=\"background-color: #fef3c7; border-left: 4px solid #f59e0b; padding: 16px; border-radius: 4px; margin-bottom: 24px;\">\n <p style=\"margin: 0; color: #92400e; font-size: 14px; line-height: 1.6;\"><strong>⚠️ Attention Required:</strong> This report identifies critical dependencies that may impact project timelines.</p>\n </div>\n <div style=\"display: flex; gap: 16px; margin-bottom: 30px;\">\n <div style=\"flex: 1; background-color: #fef2f2; padding: 20px; border-radius: 8px; border: 1px solid #fecaca;\">\n <div style=\"font-size: 32px; font-weight: 700; color: #dc2626; margin-bottom: 4px;\">${blockingIssues.length}</div>\n <div style=\"color: #991b1b; font-size: 14px; font-weight: 500;\">Blocking Issues</div>\n </div>\n <div style=\"flex: 1; background-color: #fef3c7; padding: 20px; border-radius: 8px; border: 1px solid #fde68a;\">\n <div style=\"font-size: 32px; font-weight: 700; color: #f59e0b; margin-bottom: 4px;\">${blockedIssues.length}</div>\n <div style=\"color: #92400e; font-size: 14px; font-weight: 500;\">Blocked Issues</div>\n </div>\n <div style=\"flex: 1; background-color: #fee2e2; padding: 20px; border-radius: 8px; border: 1px solid #fecaca;\">\n <div style=\"font-size: 32px; font-weight: 700; color: #dc2626; margin-bottom: 4px;\">${data.filter(i => i.riskFlag === 'High').length}</div>\n <div style=\"color: #991b1b; font-size: 14px; font-weight: 500;\">High Risk Items</div>\n </div>\n </div>\n <h2 style=\"color: #1f2937; font-size: 20px; margin: 0 0 16px 0; padding-bottom: 8px; border-bottom: 2px solid #e5e7eb;\">🔴 Issues Blocking Others</h2>\n <div style=\"overflow-x: auto; margin-bottom: 32px;\">\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse; border: 1px solid #e5e7eb; border-radius: 6px; overflow: hidden;\">\n <thead>\n <tr style=\"background-color: #f9fafb;\">\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Issue Key</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Summary</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Assignee</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Due Date</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Days Left</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Blocking</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Risk</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Impact</th>\n </tr>\n </thead>\n <tbody style=\"background-color: #ffffff;\">\n ${blockingRows || '<tr><td colspan=\"8\" style=\"padding: 20px; text-align: center; color: #6b7280;\">No blocking issues found</td></tr>'}\n </tbody>\n </table>\n </div>\n <h2 style=\"color: #1f2937; font-size: 20px; margin: 0 0 16px 0; padding-bottom: 8px; border-bottom: 2px solid #e5e7eb;\">🔒 Issues Being Blocked</h2>\n <div style=\"overflow-x: auto;\">\n <table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse: collapse; border: 1px solid #e5e7eb; border-radius: 6px; overflow: hidden;\">\n <thead>\n <tr style=\"background-color: #f9fafb;\">\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Issue Key</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Summary</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Assignee</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Due Date</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Days Left</th>\n <th style=\"padding: 12px; text-align: left; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Blocked By</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Risk</th>\n <th style=\"padding: 12px; text-align: center; font-size: 13px; font-weight: 600; color: #374151; border-bottom: 2px solid #e5e7eb;\">Impact</th>\n </tr>\n </thead>\n <tbody style=\"background-color: #ffffff;\">\n ${blockedRows || '<tr><td colspan=\"8\" style=\"padding: 20px; text-align: center; color: #6b7280;\">No blocked issues found</td></tr>'}\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n <tr>\n <td style=\"background-color: #f9fafb; padding: 20px; border-radius: 0 0 8px 8px; border-top: 1px solid #e5e7eb;\">\n <p style=\"margin: 0; color: #6b7280; font-size: 13px; text-align: center;\">This is an automated report generated by n8n workflow.</p>\n <p style=\"margin: 8px 0 0 0; color: #6b7280; font-size: 12px; text-align: center;\">© 2025 Project Management System</p>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n</body>\n</html>\n `;\n \n return htmlEmail;\n}\n\nconst htmlContent = generateHTMLEmail(data);\n\nreturn [{\n json: {\n html: htmlContent,\n subject: `🚨 Issue Dependency Risk Report - ${new Date().toLocaleDateString()}`,\n text: `Issue Dependency Risk Report generated on ${new Date().toLocaleDateString()}`\n }\n}];"
},
"typeVersion": 2
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "f9fd04b0-abca-463d-ad7d-9666c73d3c22",
"connections": {
"Email Formatter": {
"main": [
[
{
"node": "Send Email Report",
"type": "main",
"index": 0
}
]
]
},
"Filter Dependencies": {
"main": [
[
{
"node": "Extract Dependency Details",
"type": "main",
"index": 0
}
]
]
},
"Compute Impact Score": {
"main": [
[
{
"node": "Create Coordination Task",
"type": "main",
"index": 0
},
{
"node": "Email Formatter",
"type": "main",
"index": 0
},
{
"node": "Post to Slack",
"type": "main",
"index": 0
}
]
]
},
"Trigger (Nightly Run)": {
"main": [
[
{
"node": "Fetch Open Jira Issues",
"type": "main",
"index": 0
}
]
]
},
"Fetch Open Jira Issues": {
"main": [
[
{
"node": "Filter Dependencies",
"type": "main",
"index": 0
}
]
]
},
"Extract Dependency Details": {
"main": [
[
{
"node": "Compute Impact Score",
"type": "main",
"index": 0
},
{
"node": "Create Monday.com Item",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
Jira Epic健康评分与风险仪表板
通过Slack、Monday和Sheets自动风险提醒追踪Jira Epic健康状况
If
Cron
Jira
+5
20 节点Rahul Joshi
使用 Monday.com、Jira、Slack 和 Google Sheets 自动化变更请求审批
使用Monday.com、Jira、Slack和Google Sheets自动化变更请求审批
If
Set
Jira
+6
25 节点Rahul Joshi
项目管理
从 Monday.com 到 Jira、Slack 和 Google Sheets 的简化变更请求审查
自动化变更请求工作流:从Monday.com到Jira,集成Slack和Sheets
If
Set
Jira
+6
25 节点Rahul Joshi
退信与无效检测 (Gmail 触发器)
使用 Gmail、Google Sheets 和 Slack 自动化邮件退信与无效检测
Code
Cron
Gmail
+6
26 节点Rahul Joshi
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
客户入职帮助请求(Typeform 到 Gmail 和 Sheets)
If
Code
Gmail
+10
28 节点Rahul Joshi
内容创作
统一支持团队绩效仪表板(Zendesk & Freshdesk → Google Sheets + Slack + Gmail)
使用Sheets、Slack和Gmail跨Zendesk和Freshdesk跟踪支持绩效指标
If
Code
Cron
+7
24 节点Rahul Joshi
内容创作
工作流信息
难度等级
高级
节点数量21
分类-
节点类型9
作者
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
外部链接
在 n8n.io 查看 →
分享此工作流