Tự động hóa email marketing với Google Sheets và Apps Script
30 tháng 12, 2025
Cập nhật: 25 tháng 3, 2026
14 phút đọc

# Tự động hóa email marketing với Google Sheets và Apps Script
Bạn muốn gửi email hàng loạt mà không cần trả phí cho Mailchimp hay SendGrid? Google Sheets + Apps Script là giải pháp hoàn hảo!
## Tổng quan hệ thống
### Tính năng:
- ✅ Gửi email hàng loạt (tối đa 100 email/ngày với tài khoản miễn phí)
- ✅ Personalize email (Tên, công ty, sản phẩm...)
- ✅ Template HTML đẹp mắt
- ✅ Theo dõi trạng thái gửi
- ✅ Lên lịch gửi tự động
## 1. Thiết kế Google Sheet
### Sheet "Contacts" - Danh sách liên hệ:
| Cột | Tên | Mô tả |
|-----|-----|-------|
| A | Email | Địa chỉ email |
| B | Name | Tên người nhận |
| C | Company | Công ty |
| D | Status | Trạng thái: Active/Unsubscribed |
| E | LastSent | Ngày gửi email gần nhất |
| F | SendResult | Kết quả: Sent/Failed |
### Sheet "Templates" - Mẫu email:
| Cột | Tên |
|-----|-----|
| A | TemplateName |
| B | Subject |
| C | HTMLBody |
## 2. Tạo Template Email HTML
```html
```
## 3. Code Apps Script
### Script gửi email hàng loạt:
```javascript
function sendBulkEmails() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const contactsSheet = ss.getSheetByName('Contacts');
const templatesSheet = ss.getSheetByName('Templates');
// Lấy template
const templateData = templatesSheet.getRange('A2:C2').getValues()[0];
const subject = templateData[1];
const htmlTemplate = templateData[2];
// Lấy danh sách contacts
const contacts = contactsSheet.getRange('A2:F' + contactsSheet.getLastRow()).getValues();
let sentCount = 0;
const maxDaily = 100; // Giới hạn Gmail miễn phí
contacts.forEach((contact, index) => {
const [email, name, company, status, lastSent, result] = contact;
// Chỉ gửi cho contacts active
if (status !== 'Active' || sentCount >= maxDaily) return;
// Personalize email
let personalizedBody = htmlTemplate
.replace(/{{name}}/g, name || 'Bạn')
.replace(/{{company}}/g, company || 'SheetStore')
.replace(/{{unsubscribe_link}}/g, 'https://yoursite.com/unsubscribe?email=' + email);
try {
GmailApp.sendEmail(email, subject, '', {
htmlBody: personalizedBody,
name: 'SheetStore Team'
});
// Cập nhật trạng thái
const row = index + 2;
contactsSheet.getRange(row, 5).setValue(new Date()); // LastSent
contactsSheet.getRange(row, 6).setValue('Sent'); // SendResult
sentCount++;
// Nghỉ 1 giây để tránh rate limit
Utilities.sleep(1000);
} catch (error) {
contactsSheet.getRange(index + 2, 6).setValue('Failed: ' + error.message);
}
});
Logger.log(`Đã gửi ${sentCount} email thành công!`);
// Gửi báo cáo cho admin
GmailApp.sendEmail(
'admin@yourcompany.com',
'Báo cáo gửi email ' + new Date().toLocaleDateString('vi-VN'),
`Đã gửi thành công ${sentCount} email.`
);
}
```
### Lên lịch gửi tự động:
```javascript
function createEmailSchedule() {
// Xóa trigger cũ
ScriptApp.getProjectTriggers().forEach(t => ScriptApp.deleteTrigger(t));
// Tạo trigger gửi mỗi ngày lúc 9h sáng
ScriptApp.newTrigger('sendBulkEmails')
.timeBased()
.everyDays(1)
.atHour(9)
.create();
}
```
## 4. Tạo Menu tùy chỉnh
```javascript
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('📧 Email Marketing')
.addItem('Gửi email ngay', 'sendBulkEmails')
.addItem('Lên lịch gửi hàng ngày', 'createEmailSchedule')
.addSeparator()
.addItem('Xem báo cáo', 'showReport')
.addToUi();
}
function showReport() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Contacts');
const data = sheet.getRange('F2:F' + sheet.getLastRow()).getValues();
const sent = data.filter(r => r[0] === 'Sent').length;
const failed = data.filter(r => r[0] && r[0].startsWith('Failed')).length;
const total = data.filter(r => r[0] !== '').length;
const ui = SpreadsheetApp.getUi();
ui.alert(
'📊 Báo cáo Email Marketing',
`✅ Đã gửi: ${sent}
❌ Thất bại: ${failed}
📧 Tổng: ${total}`,
ui.ButtonSet.OK
);
}
```
## 5. Tips nâng cao
### A/B Testing subject line:
```javascript
function getSubjectLine(variant) {
const subjects = {
A: '🎉 Ưu đãi 30% - Chỉ hôm nay!',
B: 'Giảm giá đặc biệt dành cho bạn'
};
return subjects[variant];
}
```
### Tracking mở email:
Thêm tracking pixel vào HTML:
```html
```
## Lưu ý quan trọng
⚠️ **Giới hạn Gmail:**
- Tài khoản miễn phí: 100 email/ngày
- Google Workspace: 2000 email/ngày
⚠️ **Tránh spam:**
- Luôn có link hủy đăng ký
- Không gửi cho người chưa đồng ý
- Nội dung có giá trị
## Kết luận
Với Google Sheets + Apps Script, bạn có thể xây dựng hệ thống email marketing miễn phí và mạnh mẽ. Hãy bắt đầu với số lượng nhỏ và mở rộng dần!
🎉 Ưu đãi đặc biệt dành cho {{name}}!
Xin chào {{name}},
Cảm ơn bạn đã quan tâm đến {{company}}!
Chúng tôi có ưu đãi đặc biệt dành riêng cho bạn:
- Giảm 30% tất cả sản phẩm
- Miễn phí hỗ trợ cài đặt
- Bảo hành 12 tháng
Chia sẻ bài viết:
Hoàng Mạnh Tuân
Bạn thấy bài viết hữu ích?
Đăng ký nhận thông báo khi có bài viết mới.