Copyright© Mat Bao Company. All Reserved.
Sử dụng nội dung ở trang này và dịch vụ tại Mắt Bão có nghĩa là bạn đồng ý với Thỏa thuận sử dụng và Chính sách bảo mật của chúng tôi.
Công ty cổ phần Mắt Bão - Giấy phép kinh doanh số: 0302712571 cấp ngày 04/09/2002 bởi Sở Kế Hoạch và Đầu Tư Tp. Hồ Chí Minh.
Giấy phép cung cấp dịch vụ Viễn thông số 247/GP-CVT cấp ngày 08 tháng 05 năm 2018.
Workflow đọc danh sách nhân viên từ Excel (OneDrive) lúc 08:00 mỗi ngày, nếu có người sinh nhật sẽ tự động gửi email chúc mừng qua Outlook và đăng lời chúc lên kênh Microsoft Teams.
📢 Lưu ý: Bài viết mang tính chất tham khảo. Quý Khách có thể tùy chỉnh hoặc bổ sung thêm các tính năng theo nhu cầu sử dụng.
1. Import workflow vào n8n
Sao chép đoạn JSON bên dưới → mở n8n → Create Workflow → nhấn Ctrl + V trên vùng làm việc (hoặc lưu thành file .json và chọn … → Import from File).
Quý Khách có thể tham khảo đoạn mã JSON dưới đây. Quý Khách có thể tùy chỉnh hoặc bổ sung thêm các tính năng theo nhu cầu sử dụng.
{
"name": "Tự động chúc mừng sinh nhật nhân viên",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"id": "f96e8f78-f1d4-4e4d-89dc-9d26ed871069",
"name": "Schedule - 08:00 mỗi ngày",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-1024,
128
]
},
{
"parameters": {
"resource": "worksheet",
"operation": "readRows",
"workbook": {
"__rl": true,
"value": "<YOUR_EXCEL_WORKBOOK_ID>",
"mode": "list",
"cachedResultName": "<TEN_FILE_EXCEL>"
},
"worksheet": {
"__rl": true,
"value": "<YOUR_WORKSHEET_ID>",
"mode": "list",
"cachedResultName": "Employees"
},
"options": {}
},
"id": "6fc88970-e1d7-4035-b909-5c94221edf38",
"name": "Excel - Danh sách nhân viên",
"type": "n8n-nodes-base.microsoftExcel",
"typeVersion": 2.2,
"position": [
-768,
128
],
"credentials": {
"microsoftExcelOAuth2Api": {
"id": "<YOUR_EXCEL_CREDENTIAL_ID>",
"name": "Microsoft Excel account"
}
}
},
{
"parameters": {
"jsCode": "const now = new Date();\nconst todayDay = now.getDate();\nconst todayMonth = now.getMonth() + 1;\n\nreturn items.filter(item => {\n const value = item.json['Ngày sinh'] ?? item.json['birthDate'] ?? item.json['BirthDate'];\n if (!value) return false;\n\n const birthDate = new Date(value);\n if (Number.isNaN(birthDate.getTime())) return false;\n\n return birthDate.getDate() === todayDay &&\n birthDate.getMonth() + 1 === todayMonth;\n}).map(item => {\n const name = item.json['Họ tên'] ?? item.json['Ho ten'] ?? item.json['name'] ?? item.json['Name'] ?? 'Nhân viên';\n const email = item.json['Email'] ?? item.json['email'] ?? item.json['Email Address'] ?? '';\n const department = item.json['Phòng ban'] ?? item.json['Phong ban'] ?? item.json['department'] ?? '';\n\n return {\n json: {\n ...item.json,\n employeeName: name,\n employeeEmail: email,\n department\n }\n };\n});"
},
"id": "390281a1-5b3e-417a-932f-3363a52638fb",
"name": "Kiểm tra sinh nhật hôm nay",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-496,
128
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "has-name",
"leftValue": "={{ $json.employeeName }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
},
{
"id": "has-email",
"leftValue": "={{ $json.employeeEmail }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "0a7fbc7b-48a1-4215-8083-1b87d42d0416",
"name": "Có nhân viên sinh nhật?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-256,
128
]
},
{
"parameters": {
"toRecipients": "={{ $json.employeeEmail }}",
"subject": "=🎂 Chúc mừng sinh nhật {{ $json.employeeName }}!",
"bodyContent": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Xin chào <b>{{ $json.employeeName }}</b>,<br><br>Hôm nay là ngày đặc biệt của bạn!<br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>Chúc bạn luôn giữ được năng lượng tích cực và có thật nhiều thành công trong công việc cũng như cuộc sống.<br><br>🥳 <b>Chúc mừng sinh nhật!</b><br><br>Trân trọng,<br>Phòng Nhân sự",
"additionalFields": {
"bodyContentType": "html",
"saveToSentItems": true
}
},
"id": "255739db-aa25-4ce5-959f-238899e29fad",
"name": "Outlook - Gửi Email chúc mừng",
"type": "n8n-nodes-base.microsoftOutlook",
"typeVersion": 2,
"position": [
0,
0
],
"webhookId": "<YOUR_WEBHOOK_ID>",
"credentials": {
"microsoftOutlookOAuth2Api": {
"id": "<YOUR_OUTLOOK_CREDENTIAL_ID>",
"name": "Microsoft Outlook account"
}
}
},
{
"parameters": {
"resource": "channelMessage",
"teamId": {
"__rl": true,
"value": "<YOUR_TEAM_ID>",
"mode": "list",
"cachedResultName": "<TEN_TEAM>"
},
"channelId": {
"__rl": true,
"value": "<YOUR_CHANNEL_ID>",
"mode": "list",
"cachedResultName": "<TEN_CHANNEL>"
},
"contentType": "html",
"message": "=🎂🎉 <b>CHÚC MỪNG SINH NHẬT!</b> 🎉🎂<br><br>Hôm nay là sinh nhật của <b>{{ $json.employeeName }}</b>!<br><br>🏢 Phòng ban: <b>{{ $json.department || 'Chưa cập nhật' }}</b><br><br>🎈 Chúc bạn tuổi mới thật nhiều sức khỏe, niềm vui và thành công.<br><br>🥳 <b>Chúc mừng sinh nhật!</b>",
"options": {
"includeLinkToWorkflow": false
}
},
"id": "65b048a8-30f6-4a27-a4c8-802feda4cfd5",
"name": "Teams - Chúc mừng sinh nhật",
"type": "n8n-nodes-base.microsoftTeams",
"typeVersion": 2,
"position": [
0,
240
],
"webhookId": "<YOUR_WEBHOOK_ID>",
"credentials": {
"microsoftTeamsOAuth2Api": {
"id": "<YOUR_TEAMS_CREDENTIAL_ID>",
"name": "Microsoft Teams account"
}
}
}
],
"pinData": {},
"connections": {
"Schedule - 08:00 mỗi ngày": {
"main": [
[
{
"node": "Excel - Danh sách nhân viên",
"type": "main",
"index": 0
}
]
]
},
"Excel - Danh sách nhân viên": {
"main": [
[
{
"node": "Kiểm tra sinh nhật hôm nay",
"type": "main",
"index": 0
}
]
]
},
"Kiểm tra sinh nhật hôm nay": {
"main": [
[
{
"node": "Có nhân viên sinh nhật?",
"type": "main",
"index": 0
}
]
]
},
"Có nhân viên sinh nhật?": {
"main": [
[
{
"node": "Outlook - Gửi Email chúc mừng",
"type": "main",
"index": 0
},
{
"node": "Teams - Chúc mừng sinh nhật",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false
},
"versionId": "<YOUR_VERSION_ID>",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "<YOUR_INSTANCE_ID>"
},
"id": "<YOUR_WORKFLOW_ID>",
"tags": []
}
Hình 1: Tổng quan 6 node của workflow trong n8n
2. Chuẩn bị file Excel
Tạo file Excel trên OneDrive, sheet tên Employees, dòng đầu có đúng các cột sau:
| Họ tên | Ngày sinh | Phòng ban | |
|---|---|---|---|
| Nguyễn Văn A | nguyenvana@congty.vn | 1995-10-29 | Kỹ thuật |
| Trần Thị B | tranthib@congty.vn | 1998-03-15 | Kinh doanh |
⚠️ Cột “Ngày sinh” nên để định dạng Text và nhập dạng yyyy-MM-dd (ví dụ 1995-10-29) để workflow nhận đúng ngày.
3. Tạo App Registration trên Azure
- App registrations → New registration: đặt tên, chọn Single tenant, Redirect URI chọn Web và dán OAuth Redirect URL lấy từ n8n → Register. Sao chép Client ID.
- Certificates & secrets → New client secret: sao chép ngay Value.
- API permissions → Microsoft Graph → Delegated: thêm
offline_access,User.Read,Files.Read,Mail.Send,Team.ReadBasic.All,Channel.ReadBasic.All,ChannelMessage.Send→ Grant admin consent.
Đã tạo App Registration ở bài nhắc lịch họp thì chỉ cần bổ sung thêm quyền.
Hình 2: Vào App registrations và bấm New registration
Hình 3: Điền thông tin đăng ký ứng dụng và Redirect URI
4. Kết nối Excel
Mở node Excel – Danh sách nhân viên → Set up credential → dán Client ID, Client Secret → Save → Connect my account. Sau đó chọn Workbook (file Excel) và Sheet Employees.
Hình 4: Node Excel – Set up credential, chọn Workbook và Sheet
Hình 5: Sao chép OAuth Redirect URL và dán Client ID (thông tin đã che mờ)
Hình 6: Dán Client Secret, bấm Save rồi Connect my account
5. Kết nối Outlook và Teams
- Outlook – Gửi Email chúc mừng: tạo credential tương tự bước 4. Có thể sửa tiêu đề, nội dung email.
- Teams – Chúc mừng sinh nhật: tạo credential tương tự, chọn Team và Channel đăng lời chúc.
Hình 8: Node Outlook – credential, người nhận, tiêu đề và nội dung email
Hình 9: Node Teams – credential, chọn Team, Channel và nội dung lời chúc
6. Chạy thử và kích hoạt
- Vào … → Settings → Timezone chọn Asia/Ho_Chi_Minh để chạy đúng 08:00 giờ Việt Nam.
- Thêm một dòng thử trong Excel có ngày sinh là hôm nay và email của Quý Khách → bấm Execute workflow để kiểm tra.
- Xóa dòng thử → bấm Publish để workflow tự chạy mỗi ngày.
Hình 10: Execute workflow để chạy thử, Publish để kích hoạt
Mẹo: nếu file Excel dùng tên cột khác, sửa lại tên cột trong node “Kiểm tra sinh nhật hôm nay”.















