AutomationFlowsSlack & Telegram › AI-Powered Google Sheets Data Cleaning Workflow

AI-Powered Google Sheets Data Cleaning Workflow

Original n8n title: Excel数据自动清洗与校验

Excel数据自动清洗与校验. Uses googleSheets, chainLlm, lmChatDeepSeek, outputParserStructured. Event-driven trigger; 13 nodes.

Event trigger★★★★☆ complexityAI-powered13 nodesGoogle SheetsChain LlmLm Chat Deep SeekOutput Parser StructuredTelegram
Slack & Telegram Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

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

HTTP Request, Form Trigger, Output Parser Structured +6
Slack & Telegram

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,

Slack Trigger, Telegram Trigger, Gmail Trigger +16
Slack & Telegram

AI-Driven WooCommerce Product Importer with SEO. Uses manualTrigger, lmChatOpenRouter, chainLlm, googleSheets. Event-driven trigger; 16 nodes.

OpenRouter Chat, Chain Llm, Google Sheets +3
Slack & Telegram

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

OpenRouter Chat, Chain Llm, Google Sheets +3
Slack & Telegram

Send any URL to your Telegram bot and get an AI summary instantly.

Telegram Trigger, HTTP Request, Chain Llm +4