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
- 01 Dòng JSON thành file CSV
- 02 File CSV thành dòng JSON
- 03 Làm phẳng JSON lồng nhau
- 04 Tách field mảng thành nhiều dòng
- 05 Gộp nhiều item thành một mảng
- 06 Đổi tên nhiều field cùng lúc
- 07 Dọn chuỗi và ngày tháng
- 08 Lọc trùng nhưng bỏ qua một field
- 09 Gộp nhóm và tính tổng theo danh mục
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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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.
{
"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 automation và 9 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.