GODRICH

Tự động hóa Excel bằng n8n, 9 ví dụ không cần code

Bạn tìm tự động hóa Excel vì chán chuyển tay từng dòng dữ liệu giữa bảng tính và hệ thống khác. n8n là công cụ no-code tự động nối app.

Tự chạy · bấm ô để tới mục đó · cả 9 trong một zip

9 cái được xếp theo đúng thứ tự mà dữ liệu thường vướng phải. Đầu tiên là 2 cái đổi định dạng file (01 JSON sang CSV, 02 CSV sang JSON), rồi đến 3 cái sắp lại cấu trúc (03 làm phẳng, 04 tách, 05 gộp), tiếp theo là 2 cái dọn tên và giá trị (06 tên field, 07 chuỗi và ngày tháng), cuối cùng là 2 cái lọc và tổng hợp (08 lọc trùng, 09 gộp nhóm). Xử lý bảng tính ngoài đời cũng hay rối theo đúng thứ tự này — sai dạng, rồi sai cấu trúc, rồi dữ liệu bẩn, cuối cùng bạn chỉ cần một con số tổng.

01Dòng JSON thành file CSV

Node Code tạo 6 dòng sản phẩm, rồi Convert to File gói chúng thành file CSV nhị phân thật. Node này chỉ để kết quả vào binary chứ không vào json, nên một node Code thứ hai đọc lại tên file và dung lượng để xác nhận việc chuyển đổi thật sự xảy ra. Dùng khi cần báo cáo để tải về hoặc làm file đính kèm email.

Code → Convert to FileCSV 바이너리V2 실행 확인
{
  "name": "Build CSV File",
  "type": "n8n-nodes-base.convertToFile",
  "typeVersion": 1.1,
  "parameters": {
    "operation": "csv",
    "binaryPropertyName": "data",
    "options": {
      "fileName": "products.csv",
      "headerRow": true
    }
  }
}

02File CSV thành dòng JSON

HTTP Request tải một file CSV công khai về dưới dạng nhị phân, rồi Extract from File tách từng dòng thành một item JSON riêng. Limit chỉ giữ lại 5 dòng đầu. Dùng khi cần biến CSV nhận từ bên ngoài thành dữ liệu workflow, hoặc để import spreadsheet ai đó gửi qua email.

HTTP Request(file)Extract from File csvV2 실행 확인
{
  "name": "Parse CSV Rows",
  "type": "n8n-nodes-base.extractFromFile",
  "typeVersion": 1.1,
  "parameters": {
    "operation": "csv",
    "binaryPropertyName": "data",
    "options": {
      "headerRow": true
    }
  }
}

03Làm phẳng JSON lồng nhau

Node Code tạo một bản ghi khách hàng có địa chỉ và tọa độ lồng nhau hai tầng, rồi node Code thứ hai dùng hàm đệ quy bung bản ghi đó thành object phẳng với key kiểu dot-notation như address.city. Dùng để dọn response API lồng nhau trước khi đưa vào spreadsheet, hoặc làm phẳng dữ liệu form từ webhook.

Code 재귀 평탄화Object.entriesV2 실행 확인
{
  "name": "Flatten Record",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "function flatten(obj, prefix, out) {\n  prefix = prefix || '';\n  out = out || {};\n  for (const [k, v] of Object.entries(obj)) {\n    const key = prefix ? prefix + '.' + k : k;\n    if (v && typeof v === 'object' && !Array.isArray(v)) {\n      flatten(v, key, out);\n    } else {\n      out[key] = v;\n    }\n  }\n  return out;\n}\nconst record = $input.first().json;\nreturn [{ json: flatten(record) }];"
  }
}

04Tách field mảng thành nhiều dòng

Node Code tạo một đơn hàng có mảng dòng hàng bên trong, rồi Split Out bung mảng đó ra để mỗi dòng hàng trở thành một item riêng. Dùng khi cần xử lý riêng từng dòng hàng của một đơn, hoặc tách dòng hóa đơn trước khi tính tổng.

Split OutfieldToSplitOutV2 실행 확인
{
  "name": "Split Line Items",
  "type": "n8n-nodes-base.splitOut",
  "typeVersion": 1,
  "parameters": {
    "fieldToSplitOut": "lineItems",
    "include": "noOtherFields",
    "options": {}
  }
}

05Gộp nhiều item thành một mảng

Node Code tạo ra 8 dòng log, mỗi dòng là một item riêng, rồi tùy chọn Aggregate All Item Data của Aggregate gộp tất cả vào một mảng duy nhất dưới field logs. Dùng khi cần gộp log thành một file để gửi đi, hoặc tạo mảng gốc cho báo cáo tổng hợp.

Aggregate aggregateAllItemDatadestinationFieldNameV2 실행 확인
{
  "name": "Combine Into List",
  "type": "n8n-nodes-base.aggregate",
  "typeVersion": 1,
  "parameters": {
    "aggregate": "aggregateAllItemData",
    "destinationFieldName": "logs",
    "options": {}
  }
}

06Đổi tên nhiều field cùng lúc

Node Code tạo một dòng dùng tên field kiểu cũ như usr_nm, usr_em, ord_amt, rồi Rename Keys đổi cả ba sang name, email, amount trong một lần. Dùng khi cần map tên field của API cũ sang tên mình dùng, hoặc thống nhất tên cột spreadsheet giữa nhiều nguồn.

Rename KeyscurrentKey → newKeyV2 실행 확인
{
  "name": "Rename To Our Schema",
  "type": "n8n-nodes-base.renameKeys",
  "typeVersion": 1,
  "parameters": {
    "keys": {
      "key": [
        { "currentKey": "usr_nm", "newKey": "name" },
        { "currentKey": "usr_em", "newKey": "email" },
        { "currentKey": "ord_amt", "newKey": "amount" }
      ]
    }
  }
}

07Dọn chuỗi và ngày tháng

Node Code tạo các dòng có khoảng trắng thừa, chữ hoa thường lẫn lộn, và ba định dạng ngày khác nhau trộn vào nhau, rồi node Code thứ hai chỉnh tên cho gọn và chuẩn hóa mọi ngày về YYYY-MM-DD. Dùng để dọn dữ liệu form nhập vào, hoặc thống nhất các định dạng ngày khác nhau trước khi lưu.

Code trim·대소문자날짜 → YYYY-MM-DDV2 실행 확인
{
  "name": "Clean Records",
  "type": "n8n-nodes-base.code",
  "typeVersion": 2,
  "parameters": {
    "jsCode": "function toTitleCase(s) {\n  return s.trim().replace(/\\s+/g, ' ').toLowerCase().replace(/\\b\\w/g, c => c.toUpperCase());\n}\nfunction toDateOnly(raw) {\n  const d = new Date(raw);\n  return d.toISOString().slice(0, 10);\n}\nreturn $input.all().map(item => ({\n  json: {\n    name: toTitleCase(item.json.name),\n    email: item.json.email.trim().toLowerCase(),\n    date: toDateOnly(item.json.raw_date)\n  }\n}));"
  }
}

08Lọc trùng nhưng bỏ qua một field

Node Code tạo ra các dòng trùng customer và product nhưng khác thời điểm seenAt, rồi Remove Duplicates loại seenAt khỏi phép so sánh để xóa trùng theo mọi field còn lại. Đây đúng là tình huống khi cùng một sự kiện đến nhiều lần chỉ khác giờ, ví dụ dọn log bị trùng từ webhook gọi lại nhiều lần.

Remove Duplicates allFieldsExceptfieldsToExcludeV2 실행 확인
{
  "name": "Dedupe Ignoring seenAt",
  "type": "n8n-nodes-base.removeDuplicates",
  "typeVersion": 2,
  "parameters": {
    "compare": "allFieldsExcept",
    "fieldsToExclude": "seenAt"
  }
}

09Gộp nhóm và tính tổng theo danh mục

Node Code tạo 12 đơn hàng, rồi Summarize gộp nhóm theo category, tính tổng amount và đếm số đơn, trả về một item cho mỗi category. Dùng khi cần tổng hợp doanh thu theo danh mục, hoặc tổng theo nhóm cho dashboard.

Summarizegroup by + sum/countV2 실행 확인
{
  "name": "Group By Category",
  "type": "n8n-nodes-base.summarize",
  "typeVersion": 1.1,
  "parameters": {
    "fieldsToSplitBy": "category",
    "fieldsToSummarize": {
      "values": [
        { "aggregation": "sum", "field": "amount" },
        { "aggregation": "count", "field": "category" }
      ]
    }
  }
}

Cần chuẩn bị gì — tài khoản, quyền, phiên bản

Cột cần chuẩn bị của cả 9 mục đều là "không có", nhưng bảng này vẫn cần thiết vì hạng và phiên bản n8n dùng để kiểm chứng khác nhau ở từng mục. Bài này cả 9 mục đều đạt V2 (đã xác minh chạy thật) — không mục nào cần URL webhook đang sống, nên tất cả chạy được mà không cần tài khoản nào.

Mục Hạng Cần chuẩn bị Phiên bản n8n
01 Dòng JSON thành file CSV V2 Không có 2.38.5
02 File CSV thành dòng JSON V2 Không có 2.38.5
03 Làm phẳng JSON lồng nhau V2 Không có 2.38.5
04 Tách field mảng thành nhiều dòng V2 Không có 2.38.5
05 Gộp nhiều item thành một mảng V2 Không có 2.38.5
06 Đổi tên nhiều field cùng lúc V2 Không có 2.38.5
07 Dọn chuỗi và ngày tháng V2 Không có 2.38.5
08 Lọc trùng nhưng bỏ qua một field V2 Không có 2.38.5
09 Gộp nhóm và tính tổng theo danh mục V2 Không có 2.38.5

Đưa các workflow này vào n8n có vài cách. Dán JSON thẳng lên canvas bằng Ctrl/Cmd+V, dùng menu Import from File để chọn file trong zip, hoặc chạy n8n import:workflow --input=file.json nếu bạn dùng CLI. Sau khi nạp xong, bấm nút Test workflow ở góc trên bên trái (hoặc icon play trên node Manual Trigger) là chạy ngay tại chỗ.

Chỗ dễ vỡ

Chỗ dễ gây nhầm nhất là việc node Convert to File để kết quả ở đâu — như mục 01, node đổi dữ liệu sang CSV chỉ đặt mọi thứ vào binary chứ không vào json, nên nếu đặt node này ở cuối workflow, bước tiếp theo sẽ chẳng có gì để đọc. Mật khẩu file zip là 497s6r8z, giải nén ra là có ngay 9 file trong thư mục workflows/. Node Summarize cũng có bẫy tương tự: giá trị tổng của field amount không nằm ở key amount mà ở key sum_amount, không kiểm tra thật kỹ điều này thì node tiếp theo sẽ không tìm thấy field và lại gãy tiếp.

FAQ

n8n là gì? Khác gì so với macro trong Excel?

n8n là công cụ no-code nối các app và API lại thành workflow tự chạy. Macro chỉ hoạt động trong một file Excel, còn n8n có thể nối bảng tính, email, và API của hệ thống khác lại thành một luồng duy nhất.

Các ví dụ này có cần tài khoản để thử không?

Không. Cả 9 cái chạy ngay khi bạn nhấn Manual Trigger, không cần đăng nhập hay API key. Mục 02, cái tải file công khai, cũng đã được kiểm tra trả về đúng 200 thật.

Dữ liệu của mình không giống hệt các ví dụ thì đổi gì?

Thường chỉ cần đổi tên field. Ví dụ node Rename Keys ở mục 06 chỉ cần đổi cặp currentKey/newKey là dùng được cho bất kỳ bộ tên field nào của bạn.

Mới làm quen n8n? Danh mục automation9 n8n workflow examples có thêm nhiều ví dụ cùng hướng, còn trang giới thiệu ghi rõ trang này xác minh mọi thứ theo tiêu chuẩn nào trước khi đăng.

Nhập mật khẩu file nén

Mật khẩu nằm ngay trong bài viết này. Đọc tới đó bạn sẽ thấy.