Apps Script Cho Người Mới: Tự Động Hóa Google Sheets Từ Zero
Apps Script Google Sheets cho người mới bắt đầu — học tự động hóa từ zero: gửi email tự động, tạo báo cáo, nhắc nhở deadline mà không cần kinh nghiệm lập trình.
Chỉ cần biết công thức Excel cơ bản, bạn có thể học Apps Script trong 1 tuần và tiết kiệm hàng giờ làm việc thủ công mỗi ngày.
Mục lục:
1. Apps Script Là Gì?
Google Apps Script là ngôn ngữ lập trình dựa trên JavaScript, được tích hợp sẵn trong Google Workspace (Sheets, Docs, Gmail, Calendar...). Điều đặc biệt: bạn không cần cài đặt gì, chạy hoàn toàn trên cloud — miễn phí.
Với Apps Script, bạn có thể:
- Tự động hóa tác vụ lặp lại: Sao chép dữ liệu, định dạng, tính toán hàng loạt
- Gửi email tự động: Báo cáo cuối ngày, nhắc nhở deadline, thông báo đơn hàng
- Kết nối API: Pull dữ liệu từ dịch vụ ngoài vào Sheets
- Tạo form xử lý phức tạp: Validation, routing, gửi dữ liệu đến nhiều sheet
- Xây dựng ứng dụng web nhỏ: Web App đơn giản từ Google Sheets
Apps Script vs VBA
VBA (Excel) chạy cục bộ trên máy tính. Apps Script chạy trên cloud — không phụ thuộc hệ điều hành, có thể lên lịch chạy tự động 24/7 kể cả khi tắt máy, và kết nối được với mọi dịch vụ Google.
2. Cách Mở Apps Script Editor
- Mở Google Sheets
- Menu: Extensions → Apps Script
- Trình soạn thảo mở ra trong tab mới — đây là IDE của Apps Script
- File mặc định:
Code.gsvới hàmmyFunction()rỗng
Lưu ý về giới hạn
Apps Script miễn phí có giới hạn: 6 phút/lần chạy, 90 phút/ngày tổng cộng, 100 email/ngày. Google Workspace Business không giới hạn chặt như vậy.
3. Script Đầu Tiên — Hiểu Cấu Trúc Cơ Bản
// Script đơn giản nhất — hiển thị thông báo
function xin_chao() {
// SpreadsheetApp là object truy cập Google Sheets
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Đọc giá trị ô A1
const tenKhachHang = sheet.getRange('A1').getValue();
// Hiển thị thông báo popup
SpreadsheetApp.getUi().alert('Xin chào, ' + tenKhachHang + '!');
// Ghi giá trị vào ô B1
sheet.getRange('B1').setValue('Đã xử lý lúc: ' + new Date());
}
Chạy script: Click nút ▶ Run (hoặc Ctrl+R). Lần đầu chạy sẽ yêu cầu cấp quyền — click "Allow" để cho phép script truy cập Sheets và Gmail.
4. Đọc Và Ghi Dữ Liệu Vào Sheet
function xuLyDuLieu() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheetNguon = ss.getSheetByName('DonHang');
const sheetKetQua = ss.getSheetByName('BaoCao');
// Đọc toàn bộ dữ liệu (nhanh hơn đọc từng ô)
const duLieu = sheetNguon.getDataRange().getValues();
// Dòng đầu là header, bỏ qua
const header = duLieu[0];
const rows = duLieu.slice(1);
// Lọc đơn hàng hoàn thành
const donHoanThanh = rows.filter(row => row[4] === 'Hoàn thành');
// Tính tổng doanh thu
const tongDoanhThu = donHoanThanh.reduce((sum, row) => sum + row[5], 0);
// Ghi kết quả vào sheet BaoCao
sheetKetQua.getRange('B2').setValue(donHoanThanh.length);
sheetKetQua.getRange('B3').setValue(tongDoanhThu);
sheetKetQua.getRange('B4').setValue(new Date());
Logger.log('Xong! Tổng: ' + tongDoanhThu);
}
Best Practice: Đọc theo batch
Luôn dùng getValues() để đọc cả vùng một lần thay vì lặp qua từng ô với getValue(). Nhanh hơn 10-100 lần khi có nhiều dòng.
5. Gửi Email Tự Động
function guiBaoCaoNgay() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('BaoCao');
// Đọc số liệu
const sodon = sheet.getRange('B2').getValue();
const doanhThu = sheet.getRange('B3').getValue();
const ngay = Utilities.formatDate(new Date(), 'Asia/Ho_Chi_Minh', 'dd/MM/yyyy');
// Định dạng tiền Việt
const doanhThuFormat = doanhThu.toLocaleString('vi-VN') + ' VNĐ';
// Nội dung email HTML
const noiDung = `
<h2>Báo Cáo Ngày ${ngay}</h2>
<table border="1" cellpadding="8">
<tr><td><b>Số đơn hàng</b></td><td>${sodon}</td></tr>
<tr><td><b>Doanh thu</b></td><td>${doanhThuFormat}</td></tr>
</table>
<p>Trân trọng,<br/>Hệ thống báo cáo tự động</p>
`;
// Gửi email
GmailApp.sendEmail(
'giamdoc@congty.com',
'Báo Cáo Doanh Thu Ngày ' + ngay,
'', // plain text (để trống khi dùng htmlBody)
{ htmlBody: noiDung }
);
Logger.log('Email đã gửi thành công!');
}
6. Triggers — Chạy Script Tự Động Theo Lịch
Trigger cho phép script chạy tự động mà không cần bạn click Run. Có 2 loại:
| Loại Trigger | Khi nào chạy | Ví dụ dùng |
|---|---|---|
| Time-driven | Theo lịch (mỗi giờ, mỗi ngày, mỗi tuần) | Gửi báo cáo 8h sáng mỗi ngày |
| onEdit | Khi có người chỉnh sửa sheet | Validate dữ liệu nhập vào |
| onFormSubmit | Khi form được submit | Gửi email xác nhận đặt hàng |
| onOpen | Khi mở file Sheets | Hiển thị thông báo, cập nhật dữ liệu |
// Tạo Time Trigger bằng code (chạy một lần để thiết lập)
function taoTrigger() {
// Xóa trigger cũ để tránh trùng
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(t => ScriptApp.deleteTrigger(t));
// Tạo trigger chạy mỗi ngày lúc 8-9 giờ sáng
ScriptApp.newTrigger('guiBaoCaoNgay')
.timeBased()
.everyDays(1)
.atHour(8)
.create();
Logger.log('Trigger đã được tạo!');
}
7. Tạo Menu Tùy Chỉnh Trong Sheets
// Chạy tự động khi mở file
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('🔧 Công Cụ')
.addItem('📊 Tạo Báo Cáo', 'xuLyDuLieu')
.addItem('📧 Gửi Email Báo Cáo', 'guiBaoCaoNgay')
.addSeparator()
.addItem('🔄 Cập Nhật Dữ Liệu', 'capNhatDuLieu')
.addToUi();
}
Menu tùy chỉnh xuất hiện trên thanh menu của Sheets — người dùng không cần biết lập trình, chỉ cần click menu là thực hiện tác vụ phức tạp.
8. Bài Tập Thực Tế — Hệ Thống Nhắc Nhở Deadline
// Kiểm tra deadline và gửi email nhắc nhở
function nhacNhoDeadline() {
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('CongViec');
const data = sheet.getDataRange().getValues();
const homNay = new Date();
homNay.setHours(0, 0, 0, 0);
const ngayMai = new Date(homNay);
ngayMai.setDate(ngayMai.getDate() + 1);
const canhBao = [];
// Bỏ qua header (dòng 0)
for (let i = 1; i < data.length; i++) {
const tenCV = data[i][0];
const nguoiPhuTrach = data[i][1];
const emailPT = data[i][2];
const deadline = new Date(data[i][3]);
const trangThai = data[i][4];
// Bỏ qua công việc đã hoàn thành
if (trangThai === 'Hoàn thành') continue;
deadline.setHours(0, 0, 0, 0);
const soNgay = Math.ceil((deadline - homNay) / (1000 * 60 * 60 * 24));
if (soNgay <= 1) {
// Gửi email nhắc nhở cá nhân
GmailApp.sendEmail(emailPT,
'⚠️ Nhắc nhở: Deadline sắp đến — ' + tenCV,
`Xin chào ${nguoiPhuTrach},
Công việc "${tenCV}" có deadline vào ngày ${Utilities.formatDate(deadline, 'Asia/Ho_Chi_Minh', 'dd/MM/yyyy')}.
Vui lòng cập nhật tiến độ.`
);
canhBao.push(tenCV);
}
}
if (canhBao.length > 0) {
Logger.log('Đã nhắc nhở ' + canhBao.length + ' công việc: ' + canhBao.join(', '));
}
}
Template Google Sheets Quản Lý Công Việc Với Apps Script
Tại SheetStore.vn, nhiều template đã tích hợp sẵn Apps Script để tự động hóa — nhắc deadline, gửi báo cáo, cập nhật dữ liệu. Không cần tự code từ đầu.
Xem Template Có Apps Script →9. FAQ
Apps Script có miễn phí không?
Có — miễn phí với giới hạn 6 phút/lần chạy, 90 phút tổng/ngày, 100 email/ngày. Google Workspace Business có giới hạn cao hơn nhiều.
Cần biết lập trình để học Apps Script không?
Không cần lập trình sâu — biết kiến thức JavaScript cơ bản (biến, vòng lặp, hàm) là đủ. Nhiều tác vụ có thể copy script mẫu và chỉnh sửa.
Apps Script kết nối được với phần mềm khác không?
Có — gọi bất kỳ API HTTP nào qua UrlFetchApp.fetch(). Kết nối được Zalo OA, Telegram, Slack, CRM, ERP... miễn là có API.
Bài Tiếp Theo: ARRAYFORMULA & LAMBDA
Học thêm hai hàm mảng mạnh nhất giúp xử lý dữ liệu hàng loạt mà không cần Apps Script hay VBA.
Đọc bài: ARRAYFORMULA & LAMBDA →Chia sẻ bài viết:
Tuân Hoang
Đội ngũ SheetStore
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.