Mục lục bài viết
- Workflow này hoạt động như thế nào?
- Tổng quan kiến trúc workflow
- Điểm quan trọng về luồng dữ liệu
- Vì sao cần bước lọc người gửi trước khi gọi AI?
- Giới hạn cần biết
- Kết quả đầu ra ghi vào Google Sheets
- Hướng dẫn thiết lập ban đầu trước khi triển khai
- Hướng dẫn triển khai cấu hình Workflow
- Xử lý lỗi thường gặp
Workflow này hoạt động như thế nào?
Workflow này tự động theo dõi hộp thư Gmail của bạn mỗi phút, khi có email mới thuộc danh mục Personal, hệ thống sẽ bóc tách thông tin người gửi, làm sạch nội dung, lọc theo địa chỉ email hợp lệ, đưa nội dung qua Gemini AI để tóm tắt ngắn gọn bằng tiếng Việt, rồi ghi toàn bộ kết quả vào Google Sheets. Toàn bộ quá trình diễn ra hoàn toàn tự động, giúp bạn có ngay một bảng tổng hợp email quan trọng mà không cần mở từng email để đọc thủ công.
Tổng quan kiến trúc workflow
Luồng hoạt động: Gmail nhận thư ➔ Xử lý & lọc ➔ Gemini AI tóm tắt ➔ Tự động lưu báo cáo vào Google Sheets.
Workflow chạy theo mô hình pipeline tuần tự gồm 6 node chính, mỗi email mới được xử lý lần lượt qua từng bước từ trên xuống dưới:
|
Thứ tự |
Tên Node |
Vai trò |
|
1 |
Kích hoạt Gmail |
Quét hộp thư mỗi phút, phát hiện email mới thuộc nhãn Personal |
|
2 |
Xử lý & Định dạng Email |
Bóc tách người gửi, làm sạch nội dung, định dạng ngày giờ Việt Nam |
|
3 |
Lọc Người gửi Hợp lệ |
Chỉ cho email từ địa chỉ đáp ứng điều kiện đi tiếp |
|
4 |
Tóm tắt Email (AI Agent) |
Gọi Gemini AI để viết bản tóm tắt tiếng Việt |
|
5 |
Mô hình Gemini Chat |
Cung cấp mô hình ngôn ngữ Gemini cho AI Agent |
|
6 |
Ghi dữ liệu vào Google Sheets |
Ghi kết quả tóm tắt cùng thông tin email vào Sheet |

Điểm quan trọng về luồng dữ liệu
Vì n8n xử lý tuần tự từng item, nếu có 3 email mới cùng lúc thỏa điều kiện nhãn Personal, toàn bộ pipeline từ Xử lý & Định dạng Email đến Ghi dữ liệu vào Google Sheets sẽ chạy 3 lần liên tiếp, mỗi lần xử lý trọn vẹn một email. Không có bước gộp dữ liệu ở cuối như một số workflow báo cáo tổng hợp khác, mỗi email luôn tạo ra đúng một dòng (hoặc cập nhật một dòng) tương ứng trong Google Sheets.
Một điểm cần lưu ý về node Xử lý & Định dạng Email : node này dùng đoạn code JavaScript để bóc tách cả hai định dạng from.value (chuẩn) lẫn from.text (dự phòng bằng regex), đảm bảo vẫn lấy đúng tên và địa chỉ người gửi ngay cả khi Gmail trả về dữ liệu ở định dạng khác nhau tùy loại email. Nội dung email cũng được xử lý thông minh: nếu có bản text thuần thì ưu tiên dùng bản đó, nếu không sẽ dùng bản HTML rồi tự động loại bỏ toàn bộ thẻ style và tag HTML để chỉ giữ lại văn bản thuần túy. Nếu nội dung dài hơn 5.000 ký tự, hệ thống sẽ tự cắt bớt và thêm chú thích "Đã cắt bớt nội dung dài" để tránh vượt quá giới hạn token khi gửi cho AI.
Vì sao cần bước lọc người gửi trước khi gọi AI?
Node Lọc Người gửi Hợp lệ đóng vai trò như một cánh cổng kiểm soát chi phí và độ chính xác, đặt ngay trước bước gọi AI. Lý do thiết kế này rất thực tế: mỗi lần gọi Gemini để tóm tắt đều tốn tài nguyên API, nếu để mọi email thuộc nhãn Personal đều được tóm tắt vô điều kiện, bạn sẽ nhanh chóng lãng phí hạn mức API cho những email không thực sự cần theo dõi, ví dụ email quảng cáo vô tình rơi vào nhãn Personal hoặc email từ các địa chỉ không liên quan.
Trong file workflow gốc, điều kiện lọc mặc định đang kiểm tra xem địa chỉ người gửi có chứa @gmail.com hay không, nghĩa là chấp nhận mọi email gửi từ bất kỳ địa chỉ Gmail cá nhân nào. Tuy nhiên, đúng như mục đích thiết kế ban đầu của workflow, bạn nên thay giá trị này thành một địa chỉ email cụ thể mà bạn thực sự muốn theo dõi, ví dụ địa chỉ của sếp, đối tác quan trọng hay khách hàng VIP, thay vì để điều kiện lỏng lẻo chấp nhận mọi email Gmail. Cách chỉnh sửa cụ thể sẽ được hướng dẫn ở phần cấu hình Node bên dưới.
Giới hạn cần biết
Gemini API có hạn mức miễn phí giới hạn theo số lượt gọi mỗi phút và mỗi ngày tùy theo model đang dùng, workflow mặc định dùng model gemini-3.6-flash , đây là model tốc độ nhanh và tiết kiệm token nhất trong dòng Gemini, phù hợp cho tác vụ tóm tắt ngắn như thế này. Nếu khối lượng email lớn, bạn nên theo dõi mục Usage trong Google AI Studio để tránh vượt hạn mức.
Gmail Trigger quét hộp thư mỗi phút, nghĩa là độ trễ tối đa giữa lúc email đến và lúc được xử lý là khoảng 60 giây, không phải tức thời hoàn toàn.
Nội dung email bị giới hạn tối đa 5.000 ký tự trước khi đưa vào AI tóm tắt, với các email rất dài như bản tin hoặc email marketing nhiều hình ảnh kèm văn bản, phần bị cắt bớt có thể khiến bản tóm tắt thiếu sót một phần thông tin cuối email.
Cơ chế ghi Google Sheets dùng chế độ appendOrUpdate với cột khớp là sender email , nghĩa là nếu cùng một địa chỉ email gửi tới nhiều lần, dòng dữ liệu cũ của địa chỉ đó sẽ bị ghi đè bằng thông tin email mới nhất, chứ không tự động thêm dòng mới. Đây là điểm khác biệt quan trọng cần hiểu rõ trước khi dùng, nếu bạn muốn lưu lại lịch sử toàn bộ email từ cùng một người gửi thay vì chỉ giữ email mới nhất, cần điều chỉnh lại cột khớp này.
Kết quả đầu ra ghi vào Google Sheets
Sau khi workflow chạy xong với một email mẫu, dữ liệu trong Google Sheets sẽ có dạng như sau:
|
Date |
sender name |
sender email |
subject |
summary |
|
26/06/2026 20:14 |
Nguyễn Văn A |
Xác nhận lịch họp tuần sau |
Anh A xác nhận cuộc họp vào 14h thứ Ba tuần sau, đề nghị chuẩn bị sẵn báo cáo doanh thu quý 2 trước buổi họp. |
|
|
26/06/2026 20:16 |
Công ty XYZ |
Hóa đơn thanh toán tháng 6 |
Thông báo hóa đơn tháng 6 đã được xuất, tổng số tiền cần thanh toán trước ngày 05/07/2026. |
Mỗi dòng tương ứng với một người gửi duy nhất, cột summary chứa bản tóm tắt do Gemini viết bằng tiếng Việt, ngắn gọn và chỉ giữ lại thông tin quan trọng cùng các mốc thời gian hay yêu cầu hành động nếu có, đúng như chỉ dẫn trong prompt mặc định của node AI Agent.
Hướng dẫn thiết lập ban đầu trước khi triển khai
Yêu cầu trước khi bắt đầu
- Tài khoản n8n (self-hosted hoặc cloud)
- Tài khoản Gmail để kết nối và nhận email
- Tài khoản Google để dùng Google Sheets
- API Key Google Gemini để tóm tắt nội dung bằng AI
Bước 1: Kết nối Gmail credential
Tạo credential Gmail trong n8n
- Vào Credentials → Add credential
- Tìm Gmail OAuth2 API
- Đăng nhập tài khoản Google chứa hộp thư bạn muốn theo dõi, cấp quyền đọc email cho n8n
- Đặt tên credential (ví dụ: Gmail account )
- Save
Lưu ý: Cần cấp đủ quyền đọc email (scope gmail.readonly hoặc rộng hơn) khi màn hình xác thực Google hiện ra, nếu từ chối bớt quyền, node Kích hoạt Gmail có thể không đọc được nội dung email.
Xem thêm tại: Hướng dẫn kết nối Gmail với n8n qua Google Cloud Console
Bước 2: Chuẩn bị Google Sheets
- Tạo file Google Sheets mới
- Tạo một file Google Sheets mới, đặt tên tùy ý (ví dụ: Tom-tat-Email ). Lấy Sheet ID từ URL:
- https://docs.google.com/spreadsheets/d/[SHEET_ID_Ở_ĐÂY]/edit
- Tạo header đúng chuẩn ở hàng 1
Nhập chính xác các cột sau vào hàng đầu tiên của sheet:
|
sender name |
sender email |
subject |
summary |
Date |
Lưu ý quan trọng: Trong file workflow gốc, cột subject có kèm một khoảng trắng phía sau tên ( "subject " ), đây là chi tiết nhỏ nhưng dễ gây lỗi khớp cột nếu bạn tự gõ lại tên cột trong Google Sheets mà không để ý.
Cách an toàn nhất là để n8n tự tạo header dựa theo mapping có sẵn trong node Ghi dữ liệu vào Google Sheets thay vì tự gõ tay, hoặc nếu tự tạo thủ công, hãy kiểm tra kỹ không có khoảng trắng thừa ở bất kỳ tên cột nào.
Bước 3: Lấy Gemini API Key và cài credential trong n8n
Lấy API Key từ Google AI Studio
- Truy cập google.com , đăng nhập bằng tài khoản Google
- Nhấp biểu tượng chìa khóa để mở Get API key
- Nhấn Create API key , đặt tên gợi nhớ, chọn hoặc tạo project Google Cloud
- Sao chép API Key vừa tạo, lưu lại cẩn thận vì chỉ hiển thị một lần
Tạo credential Gemini trong n8n
- Vào Credentials → Add credential
- Tìm Google Gemini(PaLM) Api
- Dán API Key vừa sao chép vào trường API Key , giữ nguyên Host mặc định
- Đặt tên credential → Save
Hướng dẫn triển khai cấu hình Workflow
Bước 1: Thêm Gmail Credentials (Kích hoạt Gmail)
- Credential: Chọn tài khoản Gmail của bạn (Gmail account).
- Poll Times: Chọn Every Minute (Hệ thống tự động quét mail 1 phút/lần).
- Event: Message Received (Kích hoạt khi nhận được thư mới).
- Simplify: false.
- Label Names or IDs: Chọn CATEGORY_PERSONAL (Chỉ lọc các email nằm trong tab Hòm thư chính/Primary).
- Download Attachments: false.

Bước 2: Xử lý & Làm sạch Email (Xử lý & Định dạng Email)
- Mode: Run Once for All Items.
- Language: JavaScript.
- Mục đích: Bóc tách tên/email người gửi, quy đổi thời gian nhận sang múi giờ Việt Nam (Asia/Ho_Chi_Minh), làm sạch các thẻ HTML và giới hạn tối đa 5,000 ký tự để tránh tràn token AI.

Code JavaScript trong Node:
const items = [];
for (const item of $input.all()) {
const emailData = item.json;
let senderEmail = '';
let senderName = '';
if (emailData.from?.value?.[0]) {
senderEmail = emailData.from.value[0].address || '';
senderName = emailData.from.value[0].name || senderEmail;
} else if (emailData.from?.text) {
const emailMatch = emailData.from.text.match(/<([^>]+)>/) ||
emailData.from.text.match(/([^\s]+@[^\s]+)/);
senderEmail = emailMatch ? emailMatch[1] : emailData.from.text;
const nameMatch = emailData.from.text.match(/^([^<]+)/);
senderName = nameMatch ? nameMatch[1].trim().replace(/"/g, '') : senderEmail;
}
// Định dạng ngày giờ chuẩn Việt Nam (vi-VN)
const receivedDate = new Date(emailData.date || emailData.receivedTime);
const formattedDate = receivedDate.toLocaleString('vi-VN', {
timeZone: 'Asia/Ho_Chi_Minh',
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit'
});
// Xử lý bóc tách và làm sạch nội dung Email
let emailContent = '';
if (emailData.text) {
emailContent = emailData.text;
} else if (emailData.html) {
emailContent = emailData.html
.replace(/<style[^>]*>.*?<\/style>/gs, '')
.replace(/<[^>]*>/g, ' ')
.replace(/\s+/g, ' ')
.trim();
} else if (emailData.body || emailData.textPlain || emailData.textHtml) {
emailContent = emailData.body || emailData.textPlain || emailData.textHtml;
}
// Cắt ngắn nếu nội dung quá dài để tránh quá tải token
const maxContentLength = 5000;
if (emailContent.length > maxContentLength) {
emailContent = emailContent.substring(0, maxContentLength) + '... [Đã cắt bớt nội dung dài]';
}
const rowData = {
'Date': formattedDate,
'Sender Name': senderName,
'Sender Email': senderEmail,
'Subject': emailData.subject || 'Không có tiêu đề',
'Content': emailContent,
'Has Attachments': emailData.attachments?.length > 0 ? 'Có' : 'Không'
};
items.push({ json: rowData });
}
return items;
Bước 3: Bộ lọc Email (Lọc Người gửi Hợp lệ)
- Conditions:
- Left Value: ={{ $json["Sender Email"] }}
- Operator: contains
Right Value - có 2 trường hợp thiết lập người dùng cần biết:
Để giá trị là @ (Mặc định - Nhận tất cả):
- Mục đích: Phù hợp cho việc test workflow hoặc khi người dùng thực sự muốn tóm tắt mọi thư gửi đến.
- Rủi ro: Các mail rác, thông báo tự động, quảng cáo đều sẽ bị đẩy sang AI. Điều này gây tốn API Key Gemini và làm ngập bảng Google Sheets.
- Thay bằng Email / Tên miền cụ thể (Khuyên dùng khi vận hành thật):
Cách chỉnh: Điền địa chỉ email cụ thể (ví dụ: boss@gmail.com) hoặc đuôi tên miền (ví dụ: @company.com, @x.ai).
- Lợi ích: Chỉ lọc và tóm tắt những thư quan trọng, tối ưu chi phí AI và giữ bảng tính gọn gàng.
- Lưu ý: Ô điều kiện hiện để mặc định là @ để cho phép mọi email đi qua (dùng khi test). Khi đi vào vận hành thực tế, bạn nên thay @ bằng email hoặc tên miền cụ thể (ví dụ: @gmail.com, @company.com) để tránh lãng phí API Gemini vào các email rác/quảng cáo.

Bước 4: Tùy chỉnh AI Prompt (Tóm tắt Email (AI Agent))

Prompt Type: Define below
Prompt (User Message):
Đọc email sau đây: "{{ $json.Content }}"
Hãy viết một bản tóm tắt thật ngắn gọn, súc tích bằng tiếng Việt. Chỉ giữ lại những thông tin quan trọng nhất, các yêu cầu hành động hoặc mốc thời gian (nếu có). Tránh lan man.
Phần node kết nối ở đây bạn có thể chọn bất kỳ AI nào ngoài Gemini.
Bước 5: Cấu hình Google Sheets (Ghi dữ liệu vào Google Sheets)
1. Cấu hình cơ bản (Parameters):
- Credential: Chọn hoặc kết nối tài khoản Google Sheets của bạn (Google Sheets account).
- Resource: Sheet Within Document.
- Operation: Append Row (Tự động chèn thêm dòng mới vào cuối bảng).
- Document: Chọn By URL -> Dán link Google Sheets của bạn vào ô nhập liệu bên cạnh.
- Sheet: Chọn By URL -> Dán lại link Google Sheets (hoặc chọn theo tên sheet mục tiêu).
- Mapping Column Mode: Map Each Column Manually.
2. Khớp dữ liệu vào từng cột (Values to Send):
- Ngày nhận:
{{ $('Lọc Người gửi Hợp lệ').item.json.Date }} - Người gửi:
{{ $('Lọc Người gửi Hợp lệ').item.json['Sender Name'] }} - Email người gửi:
{{ $('Lọc Người gửi Hợp lệ').item.json['Sender Email'] }} - Tiêu đề:
{{ $('Lọc Người gửi Hợp lệ').item.json.Subject }} - Nội dung tóm tắt:
{{ $json.output }} - File đính kèm:
{{ $('Lọc Người gửi Hợp lệ').item.json['Has Attachments'] }}
Phân loại / Ưu tiên / Hành động cần làm: Để trống (đây là các cột mở rộng, bạn có thể bổ sung prompt ở AI Agent để bóc tách thêm sau).
Lưu ý: Các tên trường (Ngày nhận, Người gửi, Tiêu đề...) sẽ tự động xuất hiện trên n8n dựa theo dòng tiêu đề (Header row) ở hàng đầu tiên trong file Google Sheet của bạn. Sau khi dán xong các biểu thức Expression, bấm nút màu cam Execute step ở góc trên bên phải để ghi dữ liệu thử nghiệm trực tiếp vào Google Sheets.
Xử lý lỗi thường gặp
Lỗi "No output data" ở node Lọc Người gửi Hợp lệ
- Lý do: Điều kiện lọc chưa khớp với địa chỉ email thực tế bạn nhận, thường do gõ sai chính tả địa chỉ email hoặc dùng sai operator so sánh.
- Cách sửa: Mở lại node, kiểm tra chính xác giá trị đang so sánh, đối chiếu với địa chỉ email thật của người gửi thử nghiệm.
Lỗi Gemini trả về nội dung trống hoặc lỗi quota
- Lý do: Đã vượt hạn mức miễn phí của API Key Gemini trong ngày, hoặc gọi quá nhiều request trong thời gian ngắn.
- Cách sửa: Kiểm tra mục Usage và Rate Limit trong Google AI Studio, chờ hạn mức reset hoặc nâng cấp gói trả phí nếu cần dùng thường xuyên với khối lượng lớn.
Lỗi "Column names were updated" ở node Ghi dữ liệu vào Google Sheets
- Lý do: Tên cột trong Google Sheets không khớp chính xác với mapping trong node, thường do gõ thiếu hoặc thừa khoảng trắng, đặc biệt ở cột subject .
- Cách sửa: Kiểm tra lại từng tên cột trong sheet, đảm bảo khớp chính xác từng ký tự kể cả khoảng trắng với phần cấu hình Columns trong node.
Email cũ bị mất, chỉ còn thấy bản tóm tắt mới nhất
- Lý do: Đây không phải lỗi mà là hành vi mặc định của chế độ appendOrUpdate với cột khớp là sender email, mỗi người gửi chỉ giữ lại đúng một dòng dữ liệu mới nhất.
- Cách sửa: Nếu muốn lưu lại lịch sử toàn bộ email thay vì chỉ bản mới nhất, đổi Matching Columns sang một giá trị định danh riêng biệt cho từng email, ví dụ kết hợp thêm cột thời gian nhận hoặc Message-ID làm cột khớp.
Không thấy Gmail Trigger bắt được email mới
- Lý do: Email không nằm trong nhãn CATEGORY_PERSONAL mà Gmail tự phân loại, nên node không quét thấy.
- Cách sửa: Kiểm tra trong hộp thư xem email thử nghiệm đang nằm ở tab nào (Primary, Social, Promotions, Updates hay Personal), điều chỉnh lại giá trị labelIds trong node Kích hoạt Gmail cho khớp đúng nhãn thực tế email đang rơi vào.
Hướng dẫn AI
AI Tools
Học IT
Hàm Excel