8
n8n 中文网amn8n.com

自动化 Zendesk 中待处理工单的跟进

高级

这是一个Content Creation, Multimodal AI领域的自动化工作流,包含 16 个节点。主要使用 If, Code, Cron, Gmail, ClickUp 等节点。 Zendesk 待处理工单跟进系统,集成 Gmail、Google Sheets 和 ClickUp

前置要求
  • Google 账号和 Gmail API 凭证
  • Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "zBLlqGzoj4ODSM0v",
  "meta": {
    "instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
    "templateCredsSetupCompleted": true
  },
  "name": "自动化 Zendesk 中待处理工单的跟进",
  "tags": [],
  "nodes": [
    {
      "id": "616e5acf-cab7-4ef6-a01a-68f158495148",
      "name": "工作流概述",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        -80
      ],
      "parameters": {
        "width": 300,
        "height": 304,
        "content": "## 🎯 工作流概览"
      },
      "typeVersion": 1
    },
    {
      "id": "4023e848-11cd-4b1e-aa2c-591c83a337cb",
      "name": "计划触发器",
      "type": "n8n-nodes-base.cron",
      "position": [
        -576,
        -16
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "mode": "custom",
              "cronExpression": "0 0 20 * * 1-5"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8033211b-22c8-4cc8-89cf-863df591cbfc",
      "name": "数据检索信息",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        144
      ],
      "parameters": {
        "width": 280,
        "height": 240,
        "content": "## 📊 数据检索"
      },
      "typeVersion": 1
    },
    {
      "id": "59b8a5f0-f5be-4e72-b06e-db5eb64d2047",
      "name": "获取待处理工单",
      "type": "n8n-nodes-base.zendesk",
      "position": [
        -352,
        -16
      ],
      "parameters": {
        "options": {
          "status": "pending"
        },
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "zendeskApi": {
          "id": "gyKfBorFigBI1uj8",
          "name": "Zendesk account vivek"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "39631916-8779-4cf8-b25b-28d0a6aec0ff",
      "name": "过滤逻辑",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -288
      ],
      "parameters": {
        "width": 280,
        "height": 256,
        "content": "## 🔍 智能过滤"
      },
      "typeVersion": 1
    },
    {
      "id": "47f63b74-86d7-4548-80ce-dedacbe5c2e8",
      "name": "过滤待处理工单",
      "type": "n8n-nodes-base.if",
      "position": [
        -128,
        -16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "pending"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d536f781-1ad8-45e5-a935-76bf15893c32",
      "name": "数据处理",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        128
      ],
      "parameters": {
        "width": 280,
        "height": 256,
        "content": "## 🛠️ 数据处理"
      },
      "typeVersion": 1
    },
    {
      "id": "41703a6c-69a3-4b5b-ad23-8c3355a4dee1",
      "name": "格式化工单数据",
      "type": "n8n-nodes-base.code",
      "position": [
        96,
        -16
      ],
      "parameters": {
        "jsCode": "// N8N Code Node - Zendesk Ticket Formatter\n// This code processes Zendesk ticket data and formats it into clean JSON structure\n\n// Function to format individual ticket data\nfunction formatTicketData(ticketData) {\n  const createdAt = new Date(ticketData.created_at);\n  const updatedAt = new Date(ticketData.updated_at);\n  const now = new Date();\n  \n  return {\n    ticket_id: ticketData.id,\n    ticket_url: `https://your-domain.zendesk.com/agent/tickets/${ticketData.id}`,\n    subject: ticketData.subject || \"No Subject\",\n    priority: ticketData.priority || \"normal\",\n    status: ticketData.status,\n    created_timestamp: createdAt.toISOString(),\n    zendesk_created_at: ticketData.created_at,\n    description_preview: cleanDescription(ticketData.description),\n    tags: Array.isArray(ticketData.tags) ? ticketData.tags.join(', ') : '',\n    requester_id: ticketData.requester_id,\n    assignee_id: ticketData.assignee_id || 'Unassigned',\n    channel: ticketData.via?.channel || \"unknown\",\n    ticket_age_hours: Math.round((now - createdAt) / (1000 * 60 * 60)),\n    priority_level: getPriorityLevel(ticketData.priority),\n    needs_attention: checkNeedsAttention(ticketData, now, createdAt),\n    description: ticketData.description || \"No Description\"\n  };\n}\n\n// Helper function to get priority level\nfunction getPriorityLevel(priority) {\n  const levels = {\n    'low': 1,\n    'normal': 2,\n    'high': 3,\n    'urgent': 4\n  };\n  return levels[priority] || 2;\n}\n\n// Helper function to clean description for preview\nfunction cleanDescription(description) {\n  if (!description) return \"No description available\";\n  \n  const cleaned = description\n    .replace(/<[^>]*>/g, '')\n    .replace(/\\s+/g, ' ')\n    .trim();\n  \n  return cleaned.length > 100 ? cleaned.substring(0, 100) + '...' : cleaned;\n}\n\n// Helper function to check if ticket needs attention\nfunction checkNeedsAttention(ticketData, now, createdAt) {\n  const ageHours = Math.round((now - createdAt) / (1000 * 60 * 60));\n  const hasUrgentTag = (ticketData.tags || []).includes('urgent');\n  const isHighPriority = ['high', 'urgent'].includes(ticketData.priority);\n  \n  return ageHours > 24 || hasUrgentTag || isHighPriority;\n}\n\n// Process all input items\nconst processedItems = [];\n\nfor (const item of $input.all()) {\n  const originalTicket = item.json;\n  const formattedTicket = formatTicketData(originalTicket);\n  \n  processedItems.push({\n    json: formattedTicket\n  });\n}\n\nreturn processedItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "2525d374-d35a-4c26-8cb0-8b73dcb5c26c",
      "name": "数据记录",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        -368
      ],
      "parameters": {
        "width": 280,
        "height": 240,
        "content": "## 📊 数据记录"
      },
      "typeVersion": 1
    },
    {
      "id": "9a884edc-ba8b-43db-954b-3af4a9787af9",
      "name": "记录到 Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        320,
        -112
      ],
      "parameters": {
        "columns": {
          "value": {
            "Tags": "={{ $json.tags }}",
            "Status": "={{ $json.status }}",
            "Subject": "={{ $json.subject }}",
            "Priority": "={{ $json.priority }}",
            "Ticket ID": "={{ $json.ticket_id }}",
            "Ticket URL": "={{ $json.ticket_url }}",
            "Age (Hours)": "={{ $json.ticket_age_hours }}",
            "Needs Attention": "={{ $json.needs_attention }}",
            "Created Timestamp": "={{ $json.created_timestamp }}",
            "Zendesk Created At": "={{ $json.zendesk_created_at }}",
            "Description Preview": "={{ $json.description_preview }}"
          },
          "schema": [
            {
              "id": "Ticket ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": true,
              "displayName": "Ticket ID",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "Ticket URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Ticket URL",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Subject",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Subject",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Priority",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Priority",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Created Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Created Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Zendesk Created At",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Zendesk Created At",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Description Preview",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Description Preview",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Tags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Age (Hours)",
              "type": "number",
              "display": true,
              "required": false,
              "displayName": "Age (Hours)",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "Needs Attention",
              "type": "boolean",
              "display": true,
              "required": false,
              "displayName": "Needs Attention",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "Ticket ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultName": "Pending Tickets"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1ctD4fH-PW_h5X4KvnuPWpai_dgaQcedzvdVZN2sKmQY",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1ctD4fH-PW_h5X4KvnuPWpai_dgaQcedzvdVZN2sKmQY/edit?usp=drivesdk",
          "cachedResultName": "Pending Zendesk Tickets"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "kpPEOLCGn963qpoh",
          "name": "automations@techdome.ai"
        }
      },
      "typeVersion": 4
    },
    {
      "id": "5cf6fc3f-4ee4-4819-8b41-1f39281acaa3",
      "name": "任务管理",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -352
      ],
      "parameters": {
        "width": 280,
        "height": 224,
        "content": "## ✅ 任务管理"
      },
      "typeVersion": 1
    },
    {
      "id": "a382eefa-941b-45d1-9936-6ce29cd751cd",
      "name": "创建 ClickUp 任务",
      "type": "n8n-nodes-base.clickUp",
      "position": [
        544,
        -112
      ],
      "parameters": {
        "list": "901412904902",
        "name": "={{ $json.subject }}",
        "team": "9014871666",
        "space": "90143687238",
        "folderless": true,
        "additionalFields": {
          "tags": "={{ $json.tags }}",
          "status": "to do",
          "dueDate": "={{ $json.created_timestamp }}",
          "priority": "={{ $json.priority_level }}"
        }
      },
      "credentials": {
        "clickUpApi": {
          "id": "gDQJASsbW56RbLoy",
          "name": "ClickUp account vivek"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "dbc754e3-990a-430d-b3fc-8b5b5a2dd3c9",
      "name": "邮件生成",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        224
      ],
      "parameters": {
        "width": 280,
        "height": 240,
        "content": "## 📧 邮件生成"
      },
      "typeVersion": 1
    },
    {
      "id": "b2d57a93-f5ec-4058-b2d7-f24d232c2432",
      "name": "生成跟进邮件",
      "type": "n8n-nodes-base.code",
      "position": [
        448,
        80
      ],
      "parameters": {
        "jsCode": "// N8N Code Node - Zendesk Follow-up Email Generator\n// This processes Zendesk ticket data and generates professional follow-up emails\n\n// Input: items[0].json contains the ticket data array\nconst tickets = $input.all();\n\nfunction generateFollowUpEmail(ticketsData) {\n  // Filter only pending tickets\n  const pendingTickets = ticketsData.filter(ticket => ticket.status === 'pending');\n  \n  if (pendingTickets.length === 0) {\n    return null; // No pending tickets to follow up on\n  }\n\n  // Group tickets by requester email for personalized emails\n  const ticketsByRequester = {};\n  pendingTickets.forEach(ticket => {\n    // Extract email from description if not directly available\n    const emailMatch = ticket.description.match(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})/);\n    const email = emailMatch ? emailMatch[0] : 'customer@company.com';\n    \n    if (!ticketsByRequester[email]) {\n      ticketsByRequester[email] = [];\n    }\n    ticketsByRequester[email].push(ticket);\n  });\n\n  const emails = [];\n  \n  Object.entries(ticketsByRequester).forEach(([email, userTickets]) => {\n    const htmlContent = generateEmailHTML(userTickets, email);\n    \n    emails.push({\n      to: email,\n      subject: `Follow-up on Your Support Request${userTickets.length > 1 ? 's' : ''} - Action Required`,\n      html: htmlContent,\n      from: 'support@softwarecompany.com', // Replace with your support email\n      ticketCount: userTickets.length,\n      ticketIds: userTickets.map(t => t.ticket_id)\n    });\n  });\n  \n  return emails;\n}\n\nfunction generateEmailHTML(tickets, customerEmail) {\n  const customerName = extractCustomerName(tickets[0].description);\n  const currentDate = new Date().toLocaleDateString('en-US', { \n    year: 'numeric', \n    month: 'long', \n    day: 'numeric' \n  });\n\n  return `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Follow-up on Your Support Request</title>\n    <!--[if mso]>\n    <xml>\n        <o:OfficeDocumentSettings>\n            <o:PixelsPerInch>96</o:PixelsPerInch>\n            <o:AllowPNG/>\n        </o:OfficeDocumentSettings>\n    </xml>\n    <![endif]-->\n</head>\n<body style=\"margin: 0; padding: 0; font-family: Arial, sans-serif; line-height: 1.4; background-color: #f4f4f4;\">\n    <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #f4f4f4;\">\n        <tr>\n            <td align=\"center\" valign=\"top\" style=\"padding: 20px 10px;\">\n                <!-- Main Container -->\n                <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"600\" style=\"max-width: 600px; background-color: #ffffff;\">\n                    \n                    <!-- Header -->\n                    <tr>\n                        <td align=\"center\" style=\"background-color: #667eea; color: #ffffff; padding: 30px 20px;\">\n                            <h1 style=\"margin: 0; font-size: 24px; font-weight: bold; color: #ffffff;\">Support Team Follow-up</h1>\n                            <p style=\"margin: 10px 0 0 0; font-size: 14px; color: #ffffff;\">We're here to help resolve your issues</p>\n                        </td>\n                    </tr>\n                    \n                    <!-- Content -->\n                    <tr>\n                        <td style=\"padding: 30px 20px;\">\n                            \n                            <!-- Greeting -->\n                            <p style=\"font-size: 16px; color: #333333; margin-bottom: 20px;\">Dear ${customerName},</p>\n                            <p style=\"font-size: 16px; color: #333333; margin-bottom: 30px; line-height: 1.5;\">We hope this email finds you well. We wanted to follow up on your recent support request${tickets.length > 1 ? 's' : ''} that ${tickets.length > 1 ? 'are' : 'is'} currently pending resolution.</p>\n                            \n                            <!-- Tickets -->\n                            ${tickets.map(ticket => `\n                            <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin: 20px 0; background-color: #f8f9fa; border-left: 4px solid #667eea;\">\n                                <tr>\n                                    <td style=\"padding: 20px;\">\n                                        \n                                        <!-- Ticket Header -->\n                                        <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin-bottom: 15px;\">\n                                            <tr>\n                                                <td align=\"left\">\n                                                    <span style=\"background-color: #667eea; color: #ffffff; padding: 6px 12px; font-size: 12px; font-weight: bold; border-radius: 15px; display: inline-block;\">Ticket #${ticket.ticket_id}</span>\n                                                </td>\n                                                <td align=\"right\">\n                                                    <span style=\"background-color: #ffc107; color: #856404; padding: 4px 8px; font-size: 11px; font-weight: bold; text-transform: uppercase; border-radius: 10px; display: inline-block; margin-right: 10px;\">Pending</span>\n                                                    <span style=\"color: #dc3545; font-size: 12px; font-weight: bold;\">${ticket.ticket_age_hours} hours old</span>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                        \n                                        <!-- Ticket Subject -->\n                                        <h3 style=\"margin: 0 0 10px 0; font-size: 16px; font-weight: bold; color: #333333;\">${cleanSubject(ticket.subject)}</h3>\n                                        \n                                        <!-- Ticket Description -->\n                                        <p style=\"margin: 0; color: #666666; font-size: 14px; line-height: 1.5;\">${cleanDescription(ticket.description)}</p>\n                                        \n                                    </td>\n                                </tr>\n                            </table>\n                            `).join('')}\n                            \n                            <!-- CTA Section -->\n                            <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"margin: 30px 0;\">\n                                <tr>\n                                    <td align=\"center\">\n                                        <p style=\"font-size: 16px; font-weight: bold; color: #333333; margin-bottom: 20px;\">Need immediate assistance or want to provide additional information?</p>\n                                        <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n                                            <tr>\n                                                <td align=\"center\" style=\"background-color: #667eea; border-radius: 4px;\">\n                                                    <a href=\"https://softwarecompany-66332.zendesk.com/hc/en-us\" style=\"display: block; padding: 12px 30px; color: #ffffff; text-decoration: none; font-weight: bold; font-size: 14px;\">Visit Support Portal</a>\n                                                </td>\n                                            </tr>\n                                        </table>\n                                    </td>\n                                </tr>\n                            </table>\n                            \n                            <!-- Contact Info Box -->\n                            <table role=\"presentation\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\" style=\"background-color: #e3f2fd; margin: 20px 0;\">\n                                <tr>\n                                    <td align=\"center\" style=\"padding: 20px;\">\n                                        <p style=\"margin: 0 0 10px 0; font-weight: bold; color: #333333;\">Quick Response Options:</p>\n                                        <p style=\"margin: 0; color: #666666; line-height: 1.6;\">\n                                            📧 Reply directly to this email<br>\n                                            📞 Call us at: 1-800-SUPPORT<br>\n                                            💬 Live Chat: Available Mon-Fri, 9 AM - 6 PM EST\n                                        </p>\n                                    </td>\n                                </tr>\n                            </table>\n                            \n                            <!-- Main Content -->\n                            <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 20px 0;\">Our team is actively working on resolving your ${tickets.length > 1 ? 'requests' : 'request'}, and we appreciate your patience. If you have any additional information that might help us resolve ${tickets.length > 1 ? 'these issues' : 'this issue'} faster, please don't hesitate to reply to this email.</p>\n                            \n                            <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 20px 0;\">We value your business and are committed to providing you with the best possible support experience.</p>\n                            \n                            <!-- Signature -->\n                            <p style=\"font-size: 16px; color: #333333; line-height: 1.5; margin: 30px 0 0 0;\">\n                                Best regards,<br>\n                                <strong>Customer Support Team</strong><br>\n                                Software Company\n                            </p>\n                            \n                        </td>\n                    </tr>\n                    \n                    <!-- Footer -->\n                    <tr>\n                        <td align=\"center\" style=\"background-color: #f8f9fa; padding: 20px; border-top: 1px solid #dee2e6;\">\n                            <p style=\"margin: 0 0 10px 0; color: #666666; font-size: 12px;\">This is an automated follow-up email regarding your pending support tickets.</p>\n                            <p style=\"margin: 0 0 10px 0; color: #666666; font-size: 12px;\">Software Company | 123 Business Ave, Suite 100 | City, State 12345</p>\n                            <p style=\"margin: 0; color: #666666; font-size: 12px;\">© ${new Date().getFullYear()} Software Company. All rights reserved.</p>\n                        </td>\n                    </tr>\n                    \n                </table>\n            </td>\n        </tr>\n    </table>\n</body>\n</html>`;\n}\n\nfunction extractCustomerName(description) {\n  // Try to extract name from description\n  const namePatterns = [\n    /Best regards,\\s*([^\\n\\r]+)/i,\n    /Sincerely,\\s*([^\\n\\r]+)/i,\n    /Thanks,\\s*([^\\n\\r]+)/i,\n    /([A-Z][a-z]+ [A-Z][a-z]+)/\n  ];\n  \n  for (const pattern of namePatterns) {\n    const match = description.match(pattern);\n    if (match && match[1]) {\n      return match[1].trim().replace(/[^\\w\\s]/g, '');\n    }\n  }\n  \n  return 'Valued Customer';\n}\n\nfunction cleanSubject(subject) {\n  // Remove HTML tags and clean up subject\n  return subject.replace(/<[^>]*>/g, '').trim() || 'Support Request';\n}\n\nfunction cleanDescription(description) {\n  // Clean HTML and extract first meaningful sentence\n  const cleaned = description.replace(/<[^>]*>/g, '').replace(/\\s+/g, ' ').trim();\n  const firstSentence = cleaned.split('.')[0];\n  return firstSentence.length > 100 ? firstSentence.substring(0, 100) + '...' : firstSentence + '.';\n}\n\n// Process the input data\nconst ticketData = tickets.map(item => item.json).flat();\nconst followUpEmails = generateFollowUpEmail(ticketData);\n\n// Return the generated emails for n8n to process\nif (followUpEmails && followUpEmails.length > 0) {\n  return followUpEmails.map(email => ({ json: email }));\n} else {\n  return [{ json: { message: \"No pending tickets found for follow-up\" } }];\n}"
      },
      "typeVersion": 2
    },
    {
      "id": "69c121ab-d596-4f78-abb3-7f31528400d5",
      "name": "邮件发送",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        864,
        224
      ],
      "parameters": {
        "width": 280,
        "height": 288,
        "content": "## 📤 邮件发送"
      },
      "typeVersion": 1
    },
    {
      "id": "63310af9-28b6-45b7-99ef-638490caf9e1",
      "name": "发送跟进邮件",
      "type": "n8n-nodes-base.gmail",
      "position": [
        800,
        80
      ],
      "parameters": {
        "toList": [
          "={{ $json.to }}"
        ],
        "message": "Follow-up on your pending support request. Please check the detailed information in the HTML version of this email.",
        "subject": "={{ $json.subject }}",
        "resource": "message",
        "htmlMessage": "={{ $json.html }}",
        "includeHtml": true,
        "additionalFields": {}
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "gEIaWCTvGfYjMSb3",
          "name": "Gmail credentials"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "8c857db1-0f63-4cbb-a869-a7eec9bc9d0a",
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Pending Tickets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Ticket Data": {
      "main": [
        [
          {
            "node": "Log to Google Sheets",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Follow-up Emails",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Pending Tickets": {
      "main": [
        [
          {
            "node": "Filter Pending Tickets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Google Sheets": {
      "main": [
        [
          {
            "node": "Create ClickUp Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Pending Tickets": {
      "main": [
        [
          {
            "node": "Format Ticket Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Follow-up Emails": {
      "main": [
        [
          {
            "node": "Send Follow-up Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

高级 - 内容创作, 多模态 AI

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
高级
节点数量16
分类2
节点类型8
难度说明

适合高级用户,包含 16+ 个节点的复杂工作流

作者
Rahul Joshi

Rahul Joshi

@rahul08

Rahul 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 查看

分享此工作流