使用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)可能需要您自行付费。
相关工作流推荐
为 HubSpot 联系人和 SharePoint 生成 AI 撰写的新闻稿和素材
使用 GPT-4o、AI 图像和视频为 HubSpot 和 SharePoint 创建双语新闻稿
If
Set
Code
+
If
Set
Code
49 节点plemeo
社交媒体
使用AI将PDF采购订单自动化转换为Adobe Commerce销售订单
使用AI将PDF采购订单自动化转换为Adobe Commerce销售订单
If
Set
Code
+
If
Set
Code
96 节点JKingma
文档提取
备份n8n工作流到OneDrive
自动备份n8n工作流到OneDrive,包含清理和邮件通知功能
N8n
Code
Merge
+
N8n
Code
Merge
29 节点Wessel Bulte
开发运维
从趋势电子表格生成SEO内容到存储(SharePoint/Drive/Dropbox)
使用GPT-4o、FAL AI和多存储支持从趋势自动生成SEO内容
If
Set
Code
+
If
Set
Code
47 节点plemeo
内容创作
使用n8n API和邮件发送生成周度工作流分析报告
使用n8n API和邮件发送生成周度工作流分析报告
N8n
Set
Code
+
N8n
Set
Code
19 节点Wessel Bulte
开发运维
AI-Deepseek-R1t 会议差旅审批与费用授权申请
通过Deepseek AI、Gmail和Google Sheets自动化会议差旅审批
If
Set
Code
+
If
Set
Code
24 节点Cheng Siong Chin
文档提取
工作流信息
难度等级
高级
节点数量18
分类2
节点类型8
作者
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 查看 →
分享此工作流