This workflow follows the Chainllm → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Excel\u6570\u636e\u81ea\u52a8\u6e05\u6d17\u4e0e\u6821\u9a8c",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-240,
-260
],
"id": "b3b60d87-0501-4e9c-9633-37f0a169ba42",
"name": "When clicking \u2018Test workflow\u2019"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg",
"mode": "list",
"cachedResultName": "\u5546\u54c1\u8ba2\u5355\u8868",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1483902731,
"mode": "list",
"cachedResultName": "\u5de5\u4f5c\u88681\uff08\u526f\u672c\uff09 2",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg/edit#gid=1483902731"
},
"combineFilters": "OR",
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
-20,
-260
],
"id": "8cfb6055-d841-4ad7-ad2e-3a4ad90470ee",
"name": "Google Sheets",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// \u589e\u5f3a\u7684\u683c\u5f0f\u5316\u65e5\u671f\u51fd\u6570\nfunction formatDate(dateInput) {\n if (!dateInput) return dateInput;\n \n let dateStr = String(dateInput).trim();\n \n // \u5904\u74068\u4f4d\u6570\u5b57\u683c\u5f0f (\u5982 20240501)\n if (/^\\d{8}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 6);\n const day = dateStr.substring(6, 8);\n return `${year}-${month}-${day}`;\n }\n \n // \u5904\u74067\u4f4d\u6570\u5b57\u683c\u5f0f (\u5982 2025529 \u8868\u793a 2025-05-29)\n if (/^\\d{7}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 5).padStart(2, '0');\n const day = dateStr.substring(5, 7).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n \n // \u5904\u74066\u4f4d\u6570\u5b57\u683c\u5f0f (\u5982 202453 \u8868\u793a 2024-05-03)\n if (/^\\d{6}$/.test(dateStr)) {\n const year = dateStr.substring(0, 4);\n const month = dateStr.substring(4, 5).padStart(2, '0');\n const day = dateStr.substring(5, 6).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n \n // \u5904\u74065\u4f4d\u6570\u5b57\u683c\u5f0f (\u5982 24529 \u8868\u793a 2024-05-29)\n if (/^\\d{5}$/.test(dateStr)) {\n const year = '20' + dateStr.substring(0, 2);\n const month = dateStr.substring(2, 3).padStart(2, '0');\n const day = dateStr.substring(3, 5).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n \n // \u5904\u7406\u5e26\u659c\u6760\u7684\u65e5\u671f\u683c\u5f0f (\u5982 2025/05/29 \u6216 2025/5/29)\n const slashRegex = /^(\\d{4})[\\/\\\\](\\d{1,2})[\\/\\\\](\\d{1,2})$/;\n if (slashRegex.test(dateStr)) {\n const [_, year, month, day] = dateStr.match(slashRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406\u5e26\u70b9\u7684\u65e5\u671f\u683c\u5f0f (\u5982 2025.05.29 \u6216 2025.5.29)\n const dotRegex = /^(\\d{4})\\.(\\d{1,2})\\.(\\d{1,2})$/;\n if (dotRegex.test(dateStr)) {\n const [_, year, month, day] = dateStr.match(dotRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406 MM-DD-YYYY \u683c\u5f0f\n const mmddyyyyRegex = /^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/;\n if (mmddyyyyRegex.test(dateStr)) {\n const [_, month, day, year] = dateStr.match(mmddyyyyRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406 DD/MM/YYYY \u683c\u5f0f\n const ddmmyyyyRegex = /^(\\d{1,2})[\\/\\\\](\\d{1,2})[\\/\\\\](\\d{4})$/;\n if (ddmmyyyyRegex.test(dateStr)) {\n const [_, day, month, year] = dateStr.match(ddmmyyyyRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406 YYYY-MM-DD \u683c\u5f0f (\u5df2\u7ecf\u662f\u76ee\u6807\u683c\u5f0f\uff0c\u4f46\u786e\u4fdd\u6708\u548c\u65e5\u662f\u4e24\u4f4d\u6570)\n const yyyymmddRegex = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/;\n if (yyyymmddRegex.test(dateStr)) {\n const [_, year, month, day] = dateStr.match(yyyymmddRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406\u4e2d\u6587\u65e5\u671f\u683c\u5f0f (\u5982 2025\u5e7405\u670829\u65e5 \u6216 2025\u5e745\u670829\u65e5)\n const chineseRegex = /^(\\d{4})\u5e74(\\d{1,2})\u6708(\\d{1,2})\u65e5?$/;\n if (chineseRegex.test(dateStr)) {\n const [_, year, month, day] = dateStr.match(chineseRegex);\n return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;\n }\n \n // \u5904\u7406\u6708\u4efd\u540d\u79f0\u7684\u65e5\u671f\u683c\u5f0f (\u5982 29 May 2025 \u6216 May 29, 2025)\n const monthNames = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\n const monthNamesShort = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];\n \n // \u5c1d\u8bd5\u5339\u914d \"29 May 2025\" \u683c\u5f0f\n const dayMonthYearRegex = new RegExp(`^(\\\\d{1,2})\\\\s+(${monthNames.join('|')}|${monthNamesShort.join('|')})\\\\s+(\\\\d{4})$`, 'i');\n if (dayMonthYearRegex.test(dateStr)) {\n const [_, day, monthStr, year] = dateStr.match(dayMonthYearRegex);\n const monthLower = monthStr.toLowerCase();\n let month;\n if (monthNames.includes(monthLower)) {\n month = (monthNames.indexOf(monthLower) + 1).toString().padStart(2, '0');\n } else {\n month = (monthNamesShort.indexOf(monthLower) + 1).toString().padStart(2, '0');\n }\n return `${year}-${month}-${day.padStart(2, '0')}`;\n }\n \n // \u5c1d\u8bd5\u5339\u914d \"May 29, 2025\" \u683c\u5f0f\n const monthDayYearRegex = new RegExp(`^(${monthNames.join('|')}|${monthNamesShort.join('|')})\\\\s+(\\\\d{1,2})(?:,|\\\\s)\\\\s*(\\\\d{4})$`, 'i');\n if (monthDayYearRegex.test(dateStr)) {\n const [_, monthStr, day, year] = dateStr.match(monthDayYearRegex);\n const monthLower = monthStr.toLowerCase();\n let month;\n if (monthNames.includes(monthLower)) {\n month = (monthNames.indexOf(monthLower) + 1).toString().padStart(2, '0');\n } else {\n month = (monthNamesShort.indexOf(monthLower) + 1).toString().padStart(2, '0');\n }\n return `${year}-${month}-${day.padStart(2, '0')}`;\n }\n \n // \u5982\u679c\u4ee5\u4e0a\u683c\u5f0f\u90fd\u4e0d\u5339\u914d\uff0c\u5c1d\u8bd5\u4f7f\u7528Date\u5bf9\u8c61\u89e3\u6790\n // \u4f46\u8981\u5c0f\u5fc3\u5904\u7406\uff0c\u907f\u514d\u610f\u5916\u7684\u89e3\u6790\u7ed3\u679c\n try {\n const date = new Date(dateStr);\n if (!isNaN(date.getTime())) {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n // \u9a8c\u8bc1\u89e3\u6790\u7ed3\u679c\u662f\u5426\u5408\u7406\n if (year >= 1900 && year <= 2100) {\n return `${year}-${month}-${day}`;\n }\n }\n } catch (e) {\n // \u89e3\u6790\u5931\u8d25\uff0c\u7ee7\u7eed\u4f7f\u7528\u539f\u59cb\u503c\n }\n \n // \u5982\u679c\u6240\u6709\u5c1d\u8bd5\u90fd\u5931\u8d25\uff0c\u8fd4\u56de\u539f\u59cb\u503c\n return dateStr;\n}\n\n// \u4e3b\u5904\u7406\u51fd\u6570\nfunction processData(items) {\n return items.map(item => {\n const data = item.json;\n const anomalies = [];\n \n // 1. \u5904\u7406\u6570\u91cf\u3001\u5355\u4ef7\u3001\u603b\u91d1\u989d\n const quantity = data.\u6570\u91cf;\n const unitPrice = data.\u5355\u4ef7;\n let totalAmount = data.\u603b\u91d1\u989d;\n \n // \u5982\u679c\u603b\u91d1\u989d\u4e3a\u7a7a\u4f46\u6709\u6570\u91cf\u548c\u5355\u4ef7\n if ((totalAmount === \"\" || totalAmount === null || totalAmount === undefined) && quantity && unitPrice) {\n totalAmount = quantity * unitPrice;\n data.\u603b\u91d1\u989d = totalAmount;\n anomalies.push(`\u603b\u91d1\u989d\u8865\u5168`);\n }\n // \u5982\u679c\u6570\u91cf\u4e3a\u7a7a\u4f46\u6709\u5355\u4ef7\u548c\u603b\u91d1\u989d\n else if ((quantity === \"\" || quantity === null || quantity === undefined) && unitPrice && totalAmount) {\n const calculatedQuantity = totalAmount / unitPrice;\n data.\u6570\u91cf = calculatedQuantity;\n anomalies.push(`\u6570\u91cf\u8865\u5168`);\n }\n // \u5982\u679c\u5355\u4ef7\u4e3a\u7a7a\u4f46\u6709\u6570\u91cf\u548c\u603b\u91d1\u989d\n else if ((unitPrice === \"\" || unitPrice === null || unitPrice === undefined) && quantity && totalAmount) {\n const calculatedUnitPrice = totalAmount / quantity;\n data.\u5355\u4ef7 = calculatedUnitPrice;\n anomalies.push(`\u5355\u4ef7\u8865\u5168`);\n }\n \n // 2. \u683c\u5f0f\u5316\u65e5\u671f\n const originalDate = data.\u4e0b\u5355\u65e5\u671f;\n const formattedDate = formatDate(data.\u4e0b\u5355\u65e5\u671f);\n if (String(originalDate) !== formattedDate) {\n anomalies.push(`\u4e0b\u5355\u65e5\u671f\u8865\u5168`);\n data.\u4e0b\u5355\u65e5\u671f = formattedDate;\n }\n \n // 3. \u6dfb\u52a0\u6570\u636e\u5f02\u5e38\u5b57\u6bb5\n data.\u6570\u636e\u5f02\u5e38 = anomalies.length > 0 ? anomalies.join('; ') : '\u65e0';\n \n return {\n json: data,\n pairedItem: item.pairedItem\n };\n });\n}\n\n// \u5904\u7406\u8f93\u5165\u6570\u636e\nreturn processData($input.all());\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
-260
],
"id": "34e158d3-de28-4423-8262-00a19d02f246",
"name": "Code"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg",
"mode": "list",
"cachedResultName": "\u5546\u54c1\u8ba2\u5355\u8868",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1483902731,
"mode": "list",
"cachedResultName": "\u5de5\u4f5c\u88681\uff08\u526f\u672c\uff09 2",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eAwxlsPHp_wlMjyibUpm-Z6U-BIfF9lnvQQv4JaCefg/edit#gid=1483902731"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"\u6536\u8d27\u5730\u5740": "={{ $json.output.address }}",
"\u8ba2\u5355ID": "={{ $json[\"\u8ba2\u5355ID\"] }}",
"\u6570\u91cf": "={{ $json[\"\u6570\u91cf\"] }}",
"\u5355\u4ef7": "={{ $json[\"\u5355\u4ef7\"] }}",
"\u4e0b\u5355\u65e5\u671f": "={{ $json[\"\u4e0b\u5355\u65e5\u671f\"] }}",
"\u603b\u91d1\u989d": "={{ $json[\"\u603b\u91d1\u989d\"] }}",
"\u5f02\u5e38\u8865\u5168": "={{ $json[\"\u6570\u636e\u5f02\u5e38\"] }}"
},
"matchingColumns": [
"\u8ba2\u5355ID"
],
"schema": [
{
"id": "\u8ba2\u5355ID",
"displayName": "\u8ba2\u5355ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "\u5ba2\u6237\u59d3\u540d",
"displayName": "\u5ba2\u6237\u59d3\u540d",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "\u8054\u7cfb\u7535\u8bdd",
"displayName": "\u8054\u7cfb\u7535\u8bdd",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "\u6536\u8d27\u5730\u5740",
"displayName": "\u6536\u8d27\u5730\u5740",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "\u5546\u54c1ID",
"displayName": "\u5546\u54c1ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "\u6570\u91cf",
"displayName": "\u6570\u91cf",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "\u5355\u4ef7",
"displayName": "\u5355\u4ef7",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "\u603b\u91d1\u989d",
"displayName": "\u603b\u91d1\u989d",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "\u4e0b\u5355\u65e5\u671f",
"displayName": "\u4e0b\u5355\u65e5\u671f",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "\u9500\u552e\u5458",
"displayName": "\u9500\u552e\u5458",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "\u8054\u7cfb\u65b9\u5f0f",
"displayName": "\u8054\u7cfb\u65b9\u5f0f",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "\u5f02\u5e38\u8865\u5168",
"displayName": "\u5f02\u5e38\u8865\u5168",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.6,
"position": [
1016,
-260
],
"id": "62211a47-e18c-455d-a1be-70d903fa06a5",
"name": "Google Sheets1",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=\u8ba2\u5355ID:{{ $json[\"\u8ba2\u5355ID\"] }}\n\u6536\u8d27\u5730\u5740\uff1a{{ $json[\"\u6536\u8d27\u5730\u5740\"] }}",
"hasOutputParser": true,
"messages": {
"messageValues": [
{
"message": "\u4f60\u662f\u4e00\u4e2a\u6570\u636e\u6e05\u6d17\u4e13\u5bb6\uff0c\u5e2e\u52a9\u6211\u4f18\u5316\u6536\u8d27\u5730\u5740\uff0c\u628a\u7528\u6237\u7684\u5730\u5740\u4fe1\u606f\u4fee\u6539\u6210\u6807\u51c6\u5316\u7684\u7701\u5e02\u533a\u683c\u5f0f\u663e\u793a"
}
]
}
},
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.6,
"position": [
200,
-140
],
"id": "c117237a-10fb-42d7-a908-1486a82be81a",
"name": "Basic LLM Chain"
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
"typeVersion": 1,
"position": [
180,
100
],
"id": "07a61a28-33ec-453f-be81-2f2614163da5",
"name": "DeepSeek Chat Model",
"credentials": {
"deepSeekApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"orderid\": \"\u8ba2\u5355ID\",\n\t\"address\": \"\u6536\u8d27\u5730\u5740\"\n}"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.2,
"position": [
380,
100
],
"id": "066926df-f473-4cf9-9aa2-7c3ce5c74eea",
"name": "Structured Output Parser"
},
{
"parameters": {
"mode": "combine",
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "\u8ba2\u5355ID",
"field2": "output.orderid"
}
]
},
"joinMode": "enrichInput1",
"options": {}
},
"type": "n8n-nodes-base.merge",
"typeVersion": 3.1,
"position": [
576,
-260
],
"id": "354a20ab-d96d-4342-9612-39400fa7a59c",
"name": "Merge"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "f6f39899-7d3b-409b-88a1-894cfb76b955",
"leftValue": "={{ $('Google Sheets').item.json[\"\u8054\u7cfb\u7535\u8bdd\"].toString() }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
},
{
"id": "0b90fe67-8d84-4197-9ff3-3c959e8b627a",
"leftValue": "={{ $('Google Sheets').item.json[\"\u8054\u7cfb\u7535\u8bdd\"].toString().match(/^1[3-9]\\d{9}$/) !== null }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1236,
-260
],
"id": "4f18b9c2-2da7-43b5-a68b-e306a3456e19",
"name": "If"
},
{
"parameters": {
"content": "## \u89e6\u53d1\u6761\u4ef6\n- \u53ef\u4ee5\u8bbe\u7f6e\u4e3a\u5b9a\u65f6\u89e6\u53d1\n- \u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u4e3a \u8868\u683c\u6570\u636e\u53d8\u52a8\u89e6\u53d1\u3002\u5f53\u65b0\u6570\u636e\u5199\u5165\uff0c\u81ea\u52a8\u89e6\u53d1\u6570\u636e\u683c\u5f0f\u5316\u5de5\u4f5c\u6d41\u7a0b\n\n## \u8868\u683c\u6570\u636e\n- \u53ef\u4ee5\u662f\u4e91\u8868\u683c\uff0c\u6216\u8005\u672c\u5730\u7684excel\u8868\u683c\uff0c\u6216\u8005notion\u8868\u683c\u90fd\u53ef\u4ee5\n\n## \u6536\u83b7\u5730\u5740\u5904\u7406\n- \u5982\u679c\u6570\u636e\u6761\u6570\u975e\u5e38\u591a\uff0c\u53ef\u4ee5\u5206\u6279\u6267\u884c\uff0c\u4f7f\u7528\u62c6\u5206\u8282\u70b9+loop\u5faa\u73af\u8282\u70b9+\u5408\u5e76\u8282\u70b9\u5b9e\u73b0\u6bcf\u6b21\u53ea\u5904\u7406\u4e00\u90e8\u5206\u5185\u5bb9\u3002\n\n",
"height": 380,
"width": 340,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"position": [
-300,
-20
],
"typeVersion": 1,
"id": "ea5062a7-e6d5-45e7-a24d-8d2896260300",
"name": "Sticky Note"
},
{
"parameters": {
"chatId": "={{ $('Google Sheets').item.json[\"\u8054\u7cfb\u65b9\u5f0f\"] }}",
"text": "=***\u8ba2\u5355\u53d1\u8d27\u901a\u77e5***\n\u8ba2\u5355\u7f16\u53f7\uff1a***{{ $('Google Sheets').item.json[\"\u8ba2\u5355ID\"] }}***\n\u5ba2\u6237\u59d3\u540d\uff1a***{{ $('Google Sheets').item.json[\"\u5ba2\u6237\u59d3\u540d\"] }}***\n\u8ba2\u5355\u6570\u636e\u6838\u5b9e\u65e0\u8bef\uff0c\u7b49\u5f85\u53d1\u8d27\uff01\n",
"additionalFields": {
"appendAttribution": false,
"parse_mode": "Markdown"
}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
1460,
-400
],
"id": "7d83cbf0-8577-4a78-b2a9-6728eb0f5a6f",
"name": "\u8ba2\u5355\u65e0\u8bef\u901a\u77e5",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"chatId": "={{ $('Google Sheets').item.json[\"\u8054\u7cfb\u65b9\u5f0f\"] }}",
"text": "=***\u8ba2\u5355\u6570\u636e\u5f02\u5e38\u901a\u77e5***\n\n\u4f60\u7684\u8ba2ID\uff1a***{{ $('Google Sheets').item.json[\"\u8ba2\u5355ID\"] }}***\uff0c\u5ba2\u6237\u540d\uff1a***{{ $('Google Sheets').item.json[\"\u5ba2\u6237\u59d3\u540d\"] }}***\uff1b\n\u8054\u7cfb\u65b9\u5f0f\u5b58\u5728\u5f02\u5e38\uff1b\u8bf7\u53ca\u65f6\u68c0\u67e5\u8ba2\u5355\u6570\u636e\uff0c\u4ee5\u514d\u53d1\u8d27\u5931\u8d25\uff01\n",
"additionalFields": {
"appendAttribution": false,
"parse_mode": "Markdown"
}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
1460,
-160
],
"id": "a6b99a5e-90b0-484f-888b-104fcde578b3",
"name": "\u8ba2\u5355\u5f02\u5e38\u901a\u77e5",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"content": "## \u901a\u77e5\n- \u53ef\u4ee5\u8bbe\u5b9a\u4e0d\u540c\u7684\u901a\u77e5\u65b9\u5f0f\uff0c\u5982\uff1a\u77ed\u4fe1\u3001AI\u7535\u8bdd\u3001\u9489\u9489\u3001telegram\u3001slack\u3001whatsapp\u7b49",
"width": 340,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"position": [
1420,
80
],
"typeVersion": 1,
"id": "f1d9de59-f6ab-4261-a67e-983589624a3a",
"name": "Sticky Note1"
}
],
"connections": {
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Google Sheets1",
"type": "main",
"index": 0
}
]
]
},
"Basic LLM Chain": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"DeepSeek Chat Model": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Basic LLM Chain",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets1": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"If": {
"main": [
[
{
"node": "\u8ba2\u5355\u65e0\u8bef\u901a\u77e5",
"type": "main",
"index": 0
}
],
[
{
"node": "\u8ba2\u5355\u5f02\u5e38\u901a\u77e5",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "080a5ca7-140e-4a44-a285-24f18fba6a4a",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "j79EIWruCtJxrvjE",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
deepSeekApigoogleSheetsOAuth2ApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Excel数据自动清洗与校验. Uses googleSheets, chainLlm, lmChatDeepSeek, outputParserStructured. Event-driven trigger; 13 nodes.
Source: https://github.com/soluckysummer/n8n_workflows/blob/46aac817454c783de8f17975d5fa0379b8b6acf3/workflows/ExcelAutoCleaning.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
End-to-End Video Creation from user idea or transcript AI-Powered Scriptwriting using LLMs (e.g., DeepSeek via OpenRouter) Voiceover Generation with customizable TTS voices Image Scene Generation usin
This comprehensive N8N automation template revolutionizes content creation by delivering a complete end-to-end solution for AI-powered blog generation. Transform simple ideas into fully SEO-optimized,
AI-Driven WooCommerce Product Importer with SEO. Uses manualTrigger, lmChatOpenRouter, chainLlm, googleSheets. Event-driven trigger; 16 nodes.
This workflow streamlines your WooCommerce product creation process by integrating directly with Google Sheets. Simply input product details into your spreadsheet, and the workflow takes care of the r
Send any URL to your Telegram bot and get an AI summary instantly.