基于动态提示与Airtable的AI数据提取
高级
这是一个AI领域的自动化工作流,包含 51 个节点。主要使用 Set, Code, Filter, Switch, Webhook 等节点,结合人工智能技术实现智能自动化。 通过动态提示与Airtable实现AI数据提取
前置要求
- •HTTP Webhook 端点(n8n 会自动生成)
- •Airtable API Key
- •可能需要目标 API 的认证凭证
- •OpenAI API Key
使用的节点 (51)
分类
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"nodes": [
{
"id": "36816ae7-414a-482e-8a50-021885237273",
"name": "事件类型",
"type": "n8n-nodes-base.switch",
"position": [
-220,
-140
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "row.updated",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2162daf8-d23d-4b8f-8257-bdfc5400a3a8",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.event_type }}",
"rightValue": "row.updated"
}
]
},
"renameOutput": true
},
{
"outputKey": "field.created",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "48e112f6-afe8-40bf-b673-b37446934a62",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.event_type }}",
"rightValue": "field.created"
}
]
},
"renameOutput": true
},
{
"outputKey": "field.updated",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5aa258cd-15c2-4156-a32d-afeed662a38e",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.event_type }}",
"rightValue": "field.updated"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "920ca6d8-7a6e-4482-b003-fa643f550a85",
"name": "获取提示字段",
"type": "n8n-nodes-base.code",
"position": [
-900,
-140
],
"parameters": {
"jsCode": "const fields = $input.first().json.fields\n .filter(item => item.description)\n .map((item, idx) => ({\n id: item.id,\n order: idx,\n name: item.name,\n type: item.type,\n description: item.description,\n }));\n\nreturn { json: { fields } };"
},
"typeVersion": 2
},
{
"id": "3b73b2f5-9081-4633-911f-ef3041600a00",
"name": "获取文件数据",
"type": "n8n-nodes-base.httpRequest",
"position": [
1220,
320
],
"parameters": {
"url": "={{ $json.File[0].url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "e96edca8-9e8b-4ca4-bef9-dae673d3aba4",
"name": "从文件提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1380,
320
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "b5c2b87b-5756-4810-84c9-34ea420bdcef",
"name": "获取结果",
"type": "n8n-nodes-base.set",
"position": [
2000,
380
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "63d7c52e-d5bf-4f4c-9e37-1d5feaea20f4",
"name": "id",
"type": "string",
"value": "={{ $('Row Reference').item.json.id }}"
},
{
"id": "3ad72567-1d17-4910-b916-4c34a43b1060",
"name": "={{ $('Event Ref').first().json.field.name }}",
"type": "string",
"value": "={{ $json.text.trim() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a5cb0510-620b-469d-bf66-26ab64d6f88f",
"name": "遍历项目",
"type": "n8n-nodes-base.splitInBatches",
"position": [
800,
220
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "20e24946-59d8-4b19-bfab-eebb02f7e46d",
"name": "行引用",
"type": "n8n-nodes-base.noOp",
"position": [
980,
320
],
"parameters": {},
"typeVersion": 1
},
{
"id": "4090c53e-e635-4421-ab2b-475bfc62cea4",
"name": "生成字段值",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1540,
320
],
"parameters": {
"text": "=<file>\n{{ $json.text }}\n</file>\n\nData to extract: {{ $('Event Ref').first().json.field.description }}\noutput format is: {{ $('Event Ref').first().json.field.type }}",
"messages": {
"messageValues": [
{
"message": "=You assist the user in extracting the required data from the given file.\n* Keep you answer short.\n* If you cannot extract the requested data, give you response as \"n/a\"."
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "582d4008-4871-4798-bc24-abf774ad29b5",
"name": "要更新的字段",
"type": "n8n-nodes-base.code",
"position": [
1560,
-300
],
"parameters": {
"jsCode": "const row = $('Row Ref').first().json;\nconst fields = $('Get Prompt Fields').first().json.fields;\nconst missingFields = fields\n .filter(field => field.description && !row[field.name]);\n\nreturn missingFields;"
},
"typeVersion": 2
},
{
"id": "051c6a99-cec3-42df-9de7-47cb69b51682",
"name": "循环遍历项目1",
"type": "n8n-nodes-base.splitInBatches",
"position": [
820,
-420
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "f559c8ff-2ee5-478d-84ee-6b0ca2fe2050",
"name": "行引用",
"type": "n8n-nodes-base.noOp",
"position": [
1000,
-300
],
"parameters": {},
"typeVersion": 1
},
{
"id": "7b82cc73-67cb-46d7-a1d4-19712c86890a",
"name": "获取文件数据1",
"type": "n8n-nodes-base.httpRequest",
"position": [
1240,
-300
],
"parameters": {
"url": "={{ $('Row Ref').item.json.File[0].url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "7ef1556c-96a3-4988-982d-ec8c5fba4601",
"name": "从文件1提取",
"type": "n8n-nodes-base.extractFromFile",
"position": [
1400,
-300
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "9916f1c1-f413-4996-ad45-380a899b4a88",
"name": "获取结果1",
"type": "n8n-nodes-base.set",
"position": [
2120,
-260
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "e376ba60-8692-4962-9af7-466b6a3f44a2",
"name": "={{ $('Fields to Update').item.json.name }}",
"type": "string",
"value": "={{ $json.text.trim() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f62f612d-c288-4062-ab3c-dbc24c9b4b38",
"name": "生成字段值1",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1720,
-300
],
"parameters": {
"text": "=<file>\n{{ $('Extract from File1').first().json.text }}\n</file>\n\nData to extract: {{ $json.description }}\noutput format is: {{ $json.type }}",
"messages": {
"messageValues": [
{
"message": "=You assist the user in extracting the required data from the given file.\n* Keep you answer short.\n* If you cannot extract the requested data, give you response as \"n/a\" followed by \"(reason)\" where reason is replaced with reason why data could not be extracted."
}
]
},
"promptType": "define"
},
"typeVersion": 1.5
},
{
"id": "615f7436-f280-4033-8ec8-a34f1bd78075",
"name": "过滤有效行",
"type": "n8n-nodes-base.filter",
"position": [
520,
-420
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "7ad58f0b-0354-49a9-ab2f-557652d7b416",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.File[0].url }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "281b9fb0-305c-4a0c-b73b-82b6ba876d12",
"name": "过滤有效字段",
"type": "n8n-nodes-base.filter",
"position": [
340,
220
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5b4a7393-788c-42dc-ac1f-e76f833f8534",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.field.description }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "dd0fa792-791f-4d31-a7e8-9b72a25b6a07",
"name": "事件引用",
"type": "n8n-nodes-base.noOp",
"position": [
160,
220
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ca1174b3-da18-4d3c-86ef-3028cd5b12a7",
"name": "事件引用1",
"type": "n8n-nodes-base.noOp",
"position": [
160,
-420
],
"parameters": {},
"typeVersion": 1
},
{
"id": "8800b355-0fa8-4297-b13b-d3da8a01c3b7",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1180,
-340
],
"parameters": {
"color": 7,
"width": 480,
"height": 440,
"content": "### 1. 获取表格架构"
},
"typeVersion": 1
},
{
"id": "a90876d3-8a93-4d90-9e2a-f23de452259d",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-260,
-440
],
"parameters": {
"color": 5,
"width": 330,
"height": 80,
"content": "### 2a. 更新最少行数"
},
"typeVersion": 1
},
{
"id": "319adf97-8b14-4069-b4cc-594a6ea479c1",
"name": "便签2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-320,
140
],
"parameters": {
"color": 5,
"width": 390,
"height": 120,
"content": "### 2b. 更新字段下的每一行"
},
"typeVersion": 1
},
{
"id": "42a60c8c-476f-4930-bac5-4d36a7185f4f",
"name": "便签3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2240,
-1000
],
"parameters": {
"width": 520,
"height": 1120,
"content": "## 试试看!"
},
"typeVersion": 1
},
{
"id": "c6d037e9-1bf7-47a7-9c46-940220e0786b",
"name": "便签4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-680,
-340
],
"parameters": {
"color": 7,
"width": 760,
"height": 440,
"content": "### 2. 事件路由器模式"
},
"typeVersion": 1
},
{
"id": "897cec32-3a4c-4a76-bffe-b1456c287b44",
"name": "便签5",
"type": "n8n-nodes-base.stickyNote",
"position": [
100,
-620
],
"parameters": {
"color": 7,
"width": 620,
"height": 400,
"content": "### 3. 仅过滤具有有效输入的行"
},
"typeVersion": 1
},
{
"id": "a5999ca3-4418-42c5-aa1c-fbdfb1c04fef",
"name": "便签7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2060,
-480
],
"parameters": {
"color": 7,
"width": 600,
"height": 440,
"content": "### 6. 更新 Airtable 记录"
},
"typeVersion": 1
},
{
"id": "38192929-a387-4240-8373-290499b40e5a",
"name": "便签8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1180,
-580
],
"parameters": {
"color": 7,
"width": 860,
"height": 580,
"content": "### 5. PDF、LLM 和动态提示?哦我的!"
},
"typeVersion": 1
},
{
"id": "19a9b93a-d18f-4ffd-ae93-ed41cf398e90",
"name": "便签9",
"type": "n8n-nodes-base.stickyNote",
"position": [
740,
-580
],
"parameters": {
"color": 7,
"width": 420,
"height": 460,
"content": "### 4. 使用项目循环"
},
"typeVersion": 1
},
{
"id": "5407fead-ee7c-47c8-94ed-5b89e74e50e8",
"name": "便签10",
"type": "n8n-nodes-base.stickyNote",
"position": [
100,
40
],
"parameters": {
"color": 7,
"width": 600,
"height": 360,
"content": "### 7. 列出列下的所有适用行"
},
"typeVersion": 1
},
{
"id": "43b0e330-b79a-4577-b4fc-314e8b790cf7",
"name": "便利贴11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1160,
140
],
"parameters": {
"color": 7,
"width": 700,
"height": 500,
"content": "### 9. 使用 LLM 生成值"
},
"typeVersion": 1
},
{
"id": "0665fe56-48d2-4215-8d95-d4c01f9266ed",
"name": "OpenAI 聊天模型",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1720,
-140
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "8gccIjcuf3gvaoEr",
"name": "OpenAi account"
}
},
"typeVersion": 1.1
},
{
"id": "1997fb8b-73eb-4016-bab6-eb8f02fee368",
"name": "便利贴12",
"type": "n8n-nodes-base.stickyNote",
"position": [
720,
40
],
"parameters": {
"color": 7,
"width": 420,
"height": 460,
"content": "### 8. 使用项目循环"
},
"typeVersion": 1
},
{
"id": "c2799ded-b742-43a2-80ce-7a0c8f1df96e",
"name": "OpenAI 聊天模型1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
1540,
500
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "8gccIjcuf3gvaoEr",
"name": "OpenAi account"
}
},
"typeVersion": 1.1
},
{
"id": "e5b42790-fc86-4134-9d04-e6bcad4a5f20",
"name": "便签13",
"type": "n8n-nodes-base.stickyNote",
"position": [
1880,
140
],
"parameters": {
"color": 7,
"width": 500,
"height": 440,
"content": "### 10. 更新 Airtable 记录"
},
"typeVersion": 1
},
{
"id": "b1e98631-a440-4c66-b2d2-8236f6889b65",
"name": "便签6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2240,
-1140
],
"parameters": {
"color": 7,
"width": 300,
"height": 120,
"content": "[](https://airtable.com/invite/r/cKzxFYVc)"
},
"typeVersion": 1
},
{
"id": "9d293b3a-954d-4e3b-8773-b6c3dded9520",
"name": "获取 Webhook 负载",
"type": "n8n-nodes-base.httpRequest",
"position": [
-580,
-140
],
"parameters": {
"url": "=https://api.airtable.com/v0/bases/{{ $('Airtable Webhook').first().json.body.base.id }}/webhooks/{{ $('Airtable Webhook').first().json.body.webhook.id }}/payloads",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "airtableTokenApi"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 4.2
},
{
"id": "5f8d919b-14cd-4cb4-8604-731e56cc9402",
"name": "解析事件",
"type": "n8n-nodes-base.code",
"position": [
-400,
-140
],
"parameters": {
"jsCode": "const webhook = $('Airtable Webhook').first().json;\nconst schema = $('Get Prompt Fields').first().json;\nconst { payloads } = $input.first().json;\nif (!payloads.length) return [];\n\nconst event = payloads[payloads.length - 1];\nconst baseId = webhook.body.base.id;\nconst tableId = Object.keys(event.changedTablesById)[0];\nconst table = event.changedTablesById[tableId];\n\nreturn {\n baseId,\n tableId,\n event_type: getEventType(table),\n fieldId: getFieldId(table),\n field: getField(getFieldId(table)),\n rowId: getRecordId(table),\n}\n\nfunction getEventType(changedTableByIdObject) {\n if (changedTableByIdObject['createdFieldsById']) return 'field.created';\n if (changedTableByIdObject['changedFieldsById']) return 'field.updated'\n if (changedTableByIdObject['changedRecordsById']) return 'row.updated';\n return 'unknown';\n}\n\nfunction getFieldId(changedTableByIdObject) {\n const field = changedTableByIdObject.createdFieldsById\n || changedTableByIdObject.changedFieldsById\n || null;\n\n return field ? Object.keys(field)[0] : null;\n}\n\nfunction getField(id) {\n return schema.fields.find(field => field.id === id);\n}\n\nfunction getRecordId(changedTableByIdObject) {\n const record = changedTableByIdObject.changedRecordsById\n || null;\n\n return record ? Object.keys(record)[0] : null;\n}"
},
"typeVersion": 2
},
{
"id": "9b99d939-94d6-4fef-8b73-58c702503221",
"name": "获取表格架构",
"type": "n8n-nodes-base.airtable",
"position": [
-1080,
-140
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $('Airtable Webhook').item.json.body.base.id }}"
},
"resource": "base",
"operation": "getSchema"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "c29fc911-a852-46f2-bbb1-5092cc1aaa9d",
"name": "获取记录",
"type": "n8n-nodes-base.airtable",
"position": [
520,
220
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $json.baseId }}"
},
"table": {
"__rl": true,
"mode": "id",
"value": "={{ $json.tableId }}"
},
"options": {},
"operation": "search",
"filterByFormula": "NOT({File} = \"\")"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "86d3c8d8-709f-4d9d-99bc-5d1b4aeb8603",
"name": "更新行",
"type": "n8n-nodes-base.airtable",
"position": [
2180,
380
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $('Event Ref').first().json.baseId }}"
},
"table": {
"__rl": true,
"mode": "id",
"value": "={{ $('Event Ref').first().json.tableId }}"
},
"columns": {
"value": {},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "File",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "File",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Created",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Last Modified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Address",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"id"
]
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "95d08439-59a2-4e74-bd5a-b71cf079b621",
"name": "获取行",
"type": "n8n-nodes-base.airtable",
"position": [
340,
-420
],
"parameters": {
"id": "={{ $json.rowId }}",
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $json.baseId }}"
},
"table": {
"__rl": true,
"mode": "id",
"value": "={{ $json.tableId }}"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "50888ac5-30c9-4036-aade-6ccfdf605c3b",
"name": "添加行 ID 到负载",
"type": "n8n-nodes-base.set",
"position": [
2300,
-260
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{\n{\n id: $('Row Ref').item.json.id,\n ...$input.all()\n .map(item => item.json)\n .reduce((acc, item) => ({\n ...acc,\n ...item,\n }), {})\n}\n}}"
},
"executeOnce": true,
"typeVersion": 3.4
},
{
"id": "e3ebeb45-45d9-44a4-a2e6-bde89f5da125",
"name": "更新记录",
"type": "n8n-nodes-base.airtable",
"position": [
2480,
-260
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $('Event Ref1').first().json.baseId }}"
},
"table": {
"__rl": true,
"mode": "id",
"value": "={{ $('Event Ref1').first().json.tableId }}"
},
"columns": {
"value": {},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "File",
"type": "array",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "File",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Address",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Created",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Created",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Modified",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Last Modified",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"id"
]
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "ac01ec4b-e030-4608-af38-64558408832f",
"name": "Airtable Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-1400,
-140
],
"webhookId": "a82f0ae7-678e-49d9-8219-7281e8a2a1b2",
"parameters": {
"path": "a82f0ae7-678e-49d9-8219-7281e8a2a1b2",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "90178da9-2000-474e-ba93-a02d03ec6a1d",
"name": "当点击\"测试工作流\"时",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1600,
-640
],
"parameters": {},
"typeVersion": 1
},
{
"id": "b8b887ce-f891-4a3c-993b-0aaccadf1b52",
"name": "设置 Airtable 变量",
"type": "n8n-nodes-base.set",
"position": [
-1420,
-640
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "012cb420-1455-4796-a2ac-a31e6abf59ba",
"name": "appId",
"type": "string",
"value": "<MY_BASE_ID>"
},
{
"id": "e863b66c-420f-43c6-aee2-43aa5087a0a5",
"name": "tableId",
"type": "string",
"value": "<MY_TABLE_ID>"
},
{
"id": "e470be1a-5833-47ed-9e2f-988ef5479738",
"name": "notificationUrl",
"type": "string",
"value": "<MY_WEBHOOK_URL>"
},
{
"id": "e4b3213b-e3bd-479b-99ec-d1aa31eaa4c8",
"name": "inputField",
"type": "string",
"value": "File"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a3ef1a4a-fd22-4a37-8edb-48037f44fa4b",
"name": "获取表格架构1",
"type": "n8n-nodes-base.airtable",
"position": [
-1240,
-820
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "={{ $json.appId }}"
},
"resource": "base",
"operation": "getSchema"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 2.1
},
{
"id": "2490bbc6-2ea1-4146-b0b8-5a406e89ea2c",
"name": "获取\"输入\"字段",
"type": "n8n-nodes-base.set",
"position": [
-1060,
-820
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{\n$input.all()\n .map(item => item.json)\n .find(item => item.id === $('Set Airtable Vars').first().json.tableId)\n .fields\n .find(field => field.name === $('Set Airtable Vars').first().json.inputField)\n}}"
},
"executeOnce": true,
"typeVersion": 3.4
},
{
"id": "a3de141f-0ce8-4f8e-ae8e-f10f635d14ec",
"name": "记录更改 Webhook",
"type": "n8n-nodes-base.httpRequest",
"position": [
-880,
-820
],
"parameters": {
"url": "=https://api.airtable.com/v0/bases/{{ $('Set Airtable Vars').first().json.appId }}/webhooks",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n \"notificationUrl\": $('Set Airtable Vars').first().json.notificationUrl,\n \"specification\": {\n \"options\": {\n \"filters\": {\n \"fromSources\": [ \"client\" ],\n \"dataTypes\": [ \"tableData\" ],\n \"changeTypes\": [ \"update\" ],\n \"recordChangeScope\": $('Set Airtable Vars').first().json.tableId,\n \"watchDataInFieldIds\": [$json.id]\n }\n }\n }\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "airtableTokenApi"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 4.2
},
{
"id": "21b0fae8-2046-4647-83c4-132d1d63503a",
"name": "字段更改 Webhook",
"type": "n8n-nodes-base.httpRequest",
"position": [
-880,
-640
],
"parameters": {
"url": "=https://api.airtable.com/v0/bases/{{ $('Set Airtable Vars').first().json.appId }}/webhooks",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n \"notificationUrl\": $('Set Airtable Vars').first().json.notificationUrl,\n \"specification\": {\n \"options\": {\n \"filters\": {\n \"fromSources\": [ \"client\" ],\n \"dataTypes\": [ \"tableFields\" ],\n \"changeTypes\": [ \"add\", \"update\" ],\n \"recordChangeScope\": $('Set Airtable Vars').first().json.tableId\n }\n }\n }\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "airtableTokenApi"
},
"credentials": {
"airtableTokenApi": {
"id": "Und0frCQ6SNVX3VV",
"name": "Airtable Personal Access Token account"
}
},
"typeVersion": 4.2
},
{
"id": "f31c36cb-98da-4688-a83a-f06e46d2b8a2",
"name": "便签14",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1680,
-1000
],
"parameters": {
"color": 5,
"width": 1020,
"height": 580,
"content": "## ⭐️ 创建 Airtable Webhooks"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Get Row": {
"main": [
[
{
"node": "Filter Valid Rows",
"type": "main",
"index": 0
}
]
]
},
"Row Ref": {
"main": [
[
{
"node": "Get File Data1",
"type": "main",
"index": 0
}
]
]
},
"Event Ref": {
"main": [
[
{
"node": "Filter Valid Fields",
"type": "main",
"index": 0
}
]
]
},
"Event Ref1": {
"main": [
[
{
"node": "Get Row",
"type": "main",
"index": 0
}
]
]
},
"Event Type": {
"main": [
[
{
"node": "Event Ref1",
"type": "main",
"index": 0
}
],
[
{
"node": "Event Ref",
"type": "main",
"index": 0
}
],
[
{
"node": "Event Ref",
"type": "main",
"index": 0
}
]
]
},
"Get Result": {
"main": [
[
{
"node": "Update Row",
"type": "main",
"index": 0
}
]
]
},
"Update Row": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Get Result1": {
"main": [
[
{
"node": "Add Row ID to Payload",
"type": "main",
"index": 0
}
]
]
},
"Parse Event": {
"main": [
[
{
"node": "Event Type",
"type": "main",
"index": 0
}
]
]
},
"Fetch Records": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Get File Data": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Row Reference": {
"main": [
[
{
"node": "Get File Data",
"type": "main",
"index": 0
}
]
]
},
"Update Record": {
"main": [
[
{
"node": "Loop Over Items1",
"type": "main",
"index": 0
}
]
]
},
"Get File Data1": {
"main": [
[
{
"node": "Extract from File1",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Row Reference",
"type": "main",
"index": 0
}
]
]
},
"Airtable Webhook": {
"main": [
[
{
"node": "Get Table Schema",
"type": "main",
"index": 0
}
]
]
},
"Fields to Update": {
"main": [
[
{
"node": "Generate Field Value1",
"type": "main",
"index": 0
}
]
]
},
"Get Table Schema": {
"main": [
[
{
"node": "Get Prompt Fields",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items1": {
"main": [
[],
[
{
"node": "Row Ref",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "Generate Field Value",
"type": "main",
"index": 0
}
]
]
},
"Filter Valid Rows": {
"main": [
[
{
"node": "Loop Over Items1",
"type": "main",
"index": 0
}
]
]
},
"Get \"Input\" Field": {
"main": [
[
{
"node": "RecordsChanged Webhook",
"type": "main",
"index": 0
}
]
]
},
"Get Prompt Fields": {
"main": [
[
{
"node": "Get Webhook Payload",
"type": "main",
"index": 0
}
]
]
},
"Get Table Schema1": {
"main": [
[
{
"node": "Get \"Input\" Field",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Generate Field Value1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Set Airtable Vars": {
"main": [
[
{
"node": "Get Table Schema1",
"type": "main",
"index": 0
},
{
"node": "FieldsChanged Webhook",
"type": "main",
"index": 0
}
]
]
},
"Extract from File1": {
"main": [
[
{
"node": "Fields to Update",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model1": {
"ai_languageModel": [
[
{
"node": "Generate Field Value",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Filter Valid Fields": {
"main": [
[
{
"node": "Fetch Records",
"type": "main",
"index": 0
}
]
]
},
"Get Webhook Payload": {
"main": [
[
{
"node": "Parse Event",
"type": "main",
"index": 0
}
]
]
},
"Generate Field Value": {
"main": [
[
{
"node": "Get Result",
"type": "main",
"index": 0
}
]
]
},
"Add Row ID to Payload": {
"main": [
[
{
"node": "Update Record",
"type": "main",
"index": 0
}
]
]
},
"FieldsChanged Webhook": {
"main": [
[]
]
},
"Generate Field Value1": {
"main": [
[
{
"node": "Get Result1",
"type": "main",
"index": 0
}
]
]
},
"RecordsChanged Webhook": {
"main": [
[]
]
},
"When clicking ‘Test workflow’": {
"main": [
[
{
"node": "Set Airtable Vars",
"type": "main",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
高级 - 人工智能
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
基于动态提示和Baserow的AI数据提取
基于动态提示和Baserow的AI数据提取
Set
Code
Filter
+10
45 节点Jimleuk
人工智能
使用 n8n、Apify 和 OpenAI o3 自托管 AI 深度研究代理
使用 n8n、Apify 和 OpenAI o3 自托管 AI 深度研究代理
If
Set
Code
+20
87 节点Jimleuk
人工智能
[模板] AI宠物店 v8
🐶 AI宠物店助手 - 集成GPT-4o、Google日历和WhatsApp/Instagram/Facebook
If
N8n
Set
+38
244 节点Amanda Benks
销售
AI 代理餐厅 [模板]
🤖 WhatsApp、Instagram 和 Messenger 的 AI 餐厅助手
If
N8n
Set
+37
239 节点Amanda Benks
其他
使用Qdrant、Mistral.ai和OpenAI构建税法助手
使用Qdrant、Mistral.ai和OpenAI构建税法助手
Set
Wait
Filter
+18
38 节点Jimleuk
财务
YouTube RAG 搜索前端(使用 Apify、Qdrant 和 AI)
基于 Apify、Qdrant 和 AI 的 YouTube RAG 搜索前端
If
Set
Html
+23
62 节点Jimleuk
人工智能
工作流信息
难度等级
高级
节点数量51
分类1
节点类型14
作者
Jimleuk
@jimleukFreelance consultant based in the UK specialising in AI-powered automations. I work with select clients tackling their most challenging projects. For business enquiries, send me an email at hello@jimle.uk LinkedIn: https://www.linkedin.com/in/jimleuk/ X/Twitter: https://x.com/jimle_uk
外部链接
在 n8n.io 查看 →
分享此工作流