8
n8n 中文网amn8n.com

使用SharePoint、Word、Excel和Outlook自动化会议文档记录

高级

这是一个Document Extraction, Multimodal AI领域的自动化工作流,包含 18 个节点。主要使用 Code, Merge, Webhook, MicrosoftExcel, MicrosoftOutlook 等节点。 使用SharePoint、Word、Excel和Outlook自动化会议文档记录

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "gn82CROXOk8D0PnF",
  "meta": {
    "instanceId": "89249a8a187ba6e01e16112a0d334a3aa01d510ad8f88d223e12cc0a2a8beb6b"
  },
  "name": "会议注册",
  "tags": [],
  "nodes": [
    {
      "id": "cd1f0b4f-94c5-41da-b80f-b83c3c61c8b4",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -2032,
        -16
      ],
      "webhookId": "34aa798e-6c25-4cbd-bc04-10193438ad33",
      "parameters": {
        "path": "34ff798e-6c25-4cbd-bc04-10103438a111",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "6ba067bd-8be7-4742-9b32-771623780513",
      "name": "合并",
      "type": "n8n-nodes-base.merge",
      "position": [
        -448,
        -64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "7a38e270-ec62-4231-bd31-fee7b8836f74",
      "name": "DocxTemplater",
      "type": "n8n-nodes-docxtemplater.docxTemplater",
      "position": [
        -64,
        -64
      ],
      "parameters": {
        "context": "={{ $json }}",
        "options": {
          "outputFileName": "=meeting_{{$now.format(\"yyyy-MM-dd\")}}.docx"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e12dfc53-0c38-4261-854f-7561765c4c89",
      "name": "发送消息",
      "type": "n8n-nodes-base.microsoftOutlook",
      "position": [
        736,
        -208
      ],
      "webhookId": "23406a8b-feb7-4324-8784-d7ba492e12ee",
      "parameters": {
        "subject": "Meeting summery ",
        "additionalFields": {
          "attachments": {
            "attachments": [
              {
                "binaryPropertyName": "data"
              }
            ]
          }
        }
      },
      "credentials": {},
      "typeVersion": 2
    },
    {
      "id": "0909e1b5-3278-491c-abae-db025a81b69f",
      "name": "解析会议数据",
      "type": "n8n-nodes-base.code",
      "position": [
        -1248,
        64
      ],
      "parameters": {
        "jsCode": "// Extract and structure meeting minutes data from webhook\n// Parse the JSON body if it's a string, otherwise use the object directly\nlet inputData;\ntry {\n  const rawInput = $input.first().json;\n  \n  // Check if body exists and is a string that needs parsing\n  if (rawInput.body && typeof rawInput.body === 'string') {\n    inputData = JSON.parse(rawInput.body);\n  } else if (rawInput.body && typeof rawInput.body === 'object') {\n    inputData = rawInput.body;\n  } else {\n    // Fall back to the raw input data\n    inputData = rawInput;\n  }\n} catch (error) {\n  // If parsing fails, use the original data\n  inputData = $input.first().json.body || $input.first().json;\n}\n\n// Basic meeting information\nconst meetingInfo = {\n  date: inputData.date || '',\n  time: inputData.time || '',\n  location: inputData.location || '',\n  submittedAt: inputData.submitted_at || '',\n  userAgent: inputData.user_agent || ''\n};\n\n// Text cleaning function\nconst cleanText = (text) => {\n  if (typeof text !== 'string') return text;\n  return text\n    .replace(/\\r\\n/g, ' ')  // Replace Windows line breaks\n    .replace(/\\n/g, ' ')    // Replace line breaks\n    .replace(/\\r/g, ' ')    // Replace carriage returns  \n    .replace(/\\t/g, ' ')    // Replace tabs\n    .trim();\n};\n\n// Format participants with semicolon separators\nconst attendeesFormatted = inputData.attendees \n  ? inputData.attendees.split('\\n')\n      .map(name => name.trim())\n      .filter(name => name.length > 0)\n      .join(';')\n  : '';\n\nconst absenteesFormatted = inputData.absentees \n  ? inputData.absentees.split('\\n')\n      .map(name => name.trim())\n      .filter(name => name.length > 0)\n      .join(';')\n  : '';\n\n// Format discussion points with titles and comma separators\nconst discussionPointsFormatted = (inputData.dps || [])\n  .filter(dp => dp.title || dp.decision || dp.notes)\n  .map((dp, index) => {\n    const parts = [];\n    if (dp.title) parts.push(`Title: ${dp.title}`);\n    if (dp.decision) parts.push(`Decision: ${dp.decision}`);\n    if (dp.notes) parts.push(`Notes: ${dp.notes}`);\n    return parts.join(', ');\n  })\n  .join(';');\n\n// Format action items with titles and comma separators\nconst actionItemsFormatted = (inputData.ais || [])\n  .filter(ai => ai.action || ai.owner || ai.deadline)\n  .map((ai, index) => {\n    const parts = [];\n    if (ai.action) parts.push(`Action: ${ai.action}`);\n    if (ai.owner) parts.push(`Owner: ${ai.owner}`);\n    if (ai.deadline) parts.push(`Deadline: ${ai.deadline}`);\n    return parts.join(', ');\n  })\n  .join(';');\n\n// Statistics\nconst statistics = {\n  totalAttendees: inputData.attendees ? inputData.attendees.split('\\n').filter(n => n.trim()).length : 0,\n  totalAbsentees: inputData.absentees ? inputData.absentees.split('\\n').filter(n => n.trim()).length : 0,\n  totalDiscussionPoints: (inputData.dps || []).filter(dp => dp.title || dp.decision || dp.notes).length,\n  totalActionItems: (inputData.ais || []).filter(ai => ai.action || ai.owner || ai.deadline).length\n};\n\n// Add debug logging to help troubleshoot\nconsole.log('Input Data Keys:', Object.keys(inputData || {}));\nconsole.log('Attendees raw:', inputData.attendees);\nconsole.log('Discussion Points:', inputData.dps);\nconsole.log('Action Items:', inputData.ais);\n\n// Return formatted data with cleaned text\nreturn [{\n  json: {\n    // Basic info\n    date: meetingInfo.date,\n    time: meetingInfo.time,\n    location: cleanText(meetingInfo.location),\n    \n    // Formatted participants (semicolon separated)\n    attendees: attendeesFormatted,\n    absentees: absenteesFormatted,\n    \n    // Meeting content (cleaned)\n    opening: cleanText(inputData.opening || ''),\n    aob: cleanText(inputData.aob || ''),\n    closing: cleanText(inputData.closing || ''),\n    \n    // Formatted discussion points (semicolon separated, comma within each point)\n    discussionPoints: discussionPointsFormatted,\n    \n    // Formatted action items (semicolon separated, comma within each item)\n    actionItems: actionItemsFormatted,\n    \n    // Statistics\n    statistics: statistics,\n    \n    // Metadata\n    submittedAt: meetingInfo.submittedAt,\n    userAgent: meetingInfo.userAgent,\n    \n    // Debug info (remove in production)\n    _debug: {\n      inputType: typeof inputData,\n      hasBody: !!$input.first().json.body,\n      bodyType: typeof $input.first().json.body,\n      inputKeys: Object.keys(inputData || {})\n    }\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "fdcd059e-b167-43d5-84ca-5a06652bff83",
      "name": "将数据追加到 Excel 表格",
      "type": "n8n-nodes-base.microsoftExcel",
      "position": [
        -848,
        176
      ],
      "parameters": {
        "options": {},
        "fieldsUi": {
          "values": [
            {
              "column": "Date",
              "fieldValue": "={{ $json.date }}"
            },
            {
              "column": "Time",
              "fieldValue": "={{ $json.time }}"
            },
            {
              "column": "Attendees",
              "fieldValue": "={{ $json.attendees }}"
            },
            {
              "column": "Absentees",
              "fieldValue": "={{ $json.absentees }}"
            },
            {
              "column": "Opening & Agenda Approval",
              "fieldValue": "={{ $json.opening }}"
            },
            {
              "column": "Discussion Points",
              "fieldValue": "={{ $json.discussionPoints }}"
            },
            {
              "column": " Action Items",
              "fieldValue": "={{ $json.actionItems }}"
            },
            {
              "column": "Any Other Business",
              "fieldValue": "={{ $json.aob }}"
            },
            {
              "column": " Closing",
              "fieldValue": "={{ $json.closing }}"
            },
            {
              "column": "Location",
              "fieldValue": "={{ $json.location }}"
            }
          ]
        },
        "resource": "worksheet",
        "workbook": {
          "__rl": true,
          "mode": "list",
          "value": "01VJX45VW77SMOI764LVBJPDS4VXR4SEMM",
          "cachedResultName": "meeting"
        },
        "operation": "append",
        "worksheet": {
          "__rl": true,
          "mode": "list",
          "value": "{00000000-0001-0000-0000-000000000000}",
          "cachedResultName": "Sheet1"
        }
      },
      "credentials": {},
      "typeVersion": 2.1
    },
    {
      "id": "209ad73a-c876-41e8-a21f-59a000840c7b",
      "name": "下载 Word 模板",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        -1648,
        -128
      ],
      "parameters": {
        "file": {
          "__rl": true,
          "mode": "list",
          "value": "01MT5H3G2HACJOUV2AV5B2HPMSUE5IEH73",
          "cachedResultName": "meeting_minutes_template.docx"
        },
        "site": {
          "__rl": true,
          "mode": "list"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01MT5H3G7JU7CVVI34RFAJ56ZW5GCBKBGI",
          "cachedResultName": "General"
        },
        "requestOptions": {}
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "39e407c6-0dec-4176-9669-42a95df24cec",
      "name": "上传 DOCX",
      "type": "n8n-nodes-base.microsoftSharePoint",
      "position": [
        352,
        48
      ],
      "parameters": {
        "site": {
          "__rl": true,
          "mode": "list"
        },
        "folder": {
          "__rl": true,
          "mode": "list",
          "value": "01MT5H3G65QP3YC64BOVD37VQBTHMJQWHT",
          "cachedResultName": "Meetings"
        },
        "fileName": "=meeting_{{$now.format(\"yyyy-MM-dd\")}}.docx",
        "operation": "upload",
        "fileContents": "data",
        "requestOptions": {}
      },
      "credentials": {},
      "typeVersion": 1
    },
    {
      "id": "a903b4dc-7321-4fba-99f0-50d16604007d",
      "name": "便签 - 概述",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2784,
        -224
      ],
      "parameters": {
        "color": 3,
        "width": 600,
        "height": 812,
        "content": "## 该工作流将根据您的会议数据生成结构良好的文档文件,并通过电子邮件发送,同时将详细信息记录在 Excel 表格中以供将来参考。"
      },
      "typeVersion": 1
    },
    {
      "id": "ea8ae3b8-8568-4e97-bccd-56ad4b360052",
      "name": "便签 - 发送消息",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        704,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📩 发送消息"
      },
      "typeVersion": 1
    },
    {
      "id": "92343917-0f4b-4f41-bfaf-14da21606e6a",
      "name": "便签 - 上传 DOCX",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 上传 DOCX"
      },
      "typeVersion": 1
    },
    {
      "id": "0788528f-8bbf-453d-b05e-69a91838d859",
      "name": "便签 - DocxTemplater",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📄 DocxTemplater"
      },
      "typeVersion": 1
    },
    {
      "id": "811bc994-614d-43e6-85df-f81be08a6a2a",
      "name": "便签 - 合并",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 合并"
      },
      "typeVersion": 1
    },
    {
      "id": "8dde6bc4-a444-47e7-aaed-162e45321bbf",
      "name": "便签 - 将数据追加到 Excel 表格",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -896,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 将数据追加到 Excel 表格"
      },
      "typeVersion": 1
    },
    {
      "id": "2c41fa1a-f564-4543-87ed-31107684336e",
      "name": "便签 - 解析会议数据",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1280,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📁 解析会议数据"
      },
      "typeVersion": 1
    },
    {
      "id": "c60f3c7f-5721-4247-b94b-be219c26c6bf",
      "name": "便签 - 下载 Word 模板",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 📄 下载 Word 模板"
      },
      "typeVersion": 1
    },
    {
      "id": "ccfef0b5-4ebf-4eb9-a973-fd0721c40375",
      "name": "便签 - Webhook",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2080,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 1020,
        "content": "## 🌐 Webhook"
      },
      "typeVersion": 1
    },
    {
      "id": "7417b3a7-ccab-446d-b875-343fd2e76036",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2784,
        608
      ],
      "parameters": {
        "width": 640,
        "height": 768,
        "content": "<!DOCTYPE html>"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c9f9d45c-cc23-4bab-879e-15192721d783",
  "connections": {
    "6ba067bd-8be7-4742-9b32-771623780513": {
      "main": [
        [
          {
            "node": "7a38e270-ec62-4231-bd31-fee7b8836f74",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cd1f0b4f-94c5-41da-b80f-b83c3c61c8b4": {
      "main": [
        [
          {
            "node": "0909e1b5-3278-491c-abae-db025a81b69f",
            "type": "main",
            "index": 0
          },
          {
            "node": "209ad73a-c876-41e8-a21f-59a000840c7b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7a38e270-ec62-4231-bd31-fee7b8836f74": {
      "main": [
        [
          {
            "node": "39e407c6-0dec-4176-9669-42a95df24cec",
            "type": "main",
            "index": 0
          },
          {
            "node": "e12dfc53-0c38-4261-854f-7561765c4c89",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0909e1b5-3278-491c-abae-db025a81b69f": {
      "main": [
        [
          {
            "node": "fdcd059e-b167-43d5-84ca-5a06652bff83",
            "type": "main",
            "index": 0
          },
          {
            "node": "6ba067bd-8be7-4742-9b32-771623780513",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "209ad73a-c876-41e8-a21f-59a000840c7b": {
      "main": [
        [
          {
            "node": "6ba067bd-8be7-4742-9b32-771623780513",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

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

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

高级 - 文档提取, 多模态 AI

需要付费吗?

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

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

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

作者
Wessel Bulte

Wessel Bulte

@uuessel

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

分享此工作流

分类

分类: 34