Hướng dẫn

Google Sheets Cơ Bản Bài 7: Google Apps Script — Tự Động Hóa Lặp Đi Lặp Lại

Tuân HoangTuân Hoang
27 tháng 10, 2026
9 phút đọc
Google Sheets Cơ Bản Bài 7: Google Apps Script — Tự Động Hóa Lặp Đi Lặp Lại

📚 Series: Google Sheets Cơ Bản

Bài 7 (Cuối Series): Google Apps Script — Tự Động Hóa Mọi Thứ

Không cần kinh nghiệm lập trình. Bài này hướng dẫn viết script đầu tiên, cung cấp 5 script copy-paste ngay vào công việc: gửi email nhắc deadline, highlight hàng quá hạn, tạo PDF tự động, ghi log thay đổi và tạo custom menu.

1. Apps Script Là Gì — Không Cần Biết Code Vẫn Dùng Được

Google Apps Script là ngôn ngữ lập trình JavaScript đơn giản hóa, chạy trực tiếp trên Google Sheets (và các sản phẩm Google khác). Nó cho phép bạn tự động hóa những việc lặp đi lặp lại mà bạn đang làm thủ công mỗi ngày.

Apps Script có thể làm gì?

  • ✓ Gửi email/SMS tự động theo lịch hoặc điều kiện
  • ✓ Tạo và gửi file PDF báo cáo
  • ✓ Đọc/ghi dữ liệu Google Sheets, Docs, Calendar
  • ✓ Tạo custom menu và nút bấm trong Sheet
  • ✓ Kết nối với API bên ngoài (webhook, REST API)
  • ✓ Tự động format, highlight, sort dữ liệu

Ai nên học Apps Script?

  • ✓ Người dùng Google Sheets hàng ngày
  • ✓ Muốn tiết kiệm 1–2 giờ/ngày làm việc thủ công
  • ✓ Không muốn (hoặc không thể) mua phần mềm tự động hóa đắt tiền
  • ✓ Muốn tùy chỉnh Google Sheets theo đúng quy trình doanh nghiệp

Apps Script MIỄN PHÍ hoàn toàn:

Không cần trả thêm tiền nào. Chỉ cần có tài khoản Google là dùng được. Giới hạn hàng ngày rất cao (6 giờ chạy script/ngày cho tài khoản thường).

2. Mở Script Editor Và Viết Hello World Đầu Tiên

1

Mở Script Editor

Trong Google Sheets: menu Extensions → Apps Script. Tab mới mở ra với giao diện code editor.

2

Xóa code mặc định, paste Hello World

function helloWorld() {
  // Hiển thị hộp thoại thông báo
  SpreadsheetApp.getUi().alert('Xin chào! Apps Script hoạt động rồi!');
}
3

Lưu và chạy

Nhấn Ctrl+S để lưu → Click nút Run ▶ → Lần đầu cần cấp quyền (Allow) → Hộp thoại xuất hiện trong Sheet

Lần đầu chạy cần cấp quyền:

Google sẽ hiện cảnh báo "This app isn't verified". Đây là bình thường với script tự viết. Click "Advanced" → "Go to [tên script] (unsafe)" → Allow. Chỉ cần làm 1 lần.

3. 5 Script Copy-Paste Ngay Vào Công Việc

Script 1: Gửi Email Nhắc Deadline

Mỗi sáng 8h, tự động gửi email nhắc các task sắp đến hạn trong 3 ngày tới.

function nhacDeadline() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('CongViec'); // Tên sheet của bạn
  const data = sheet.getDataRange().getValues();
  const homNay = new Date();
  const nguoiNhan = 'ban@email.com'; // Email nhận thông báo

  let danhSachNhac = [];

  // Bỏ qua hàng tiêu đề (hàng 0), duyệt từ hàng 1
  for (let i = 1; i < data.length; i++) {
    const tenTask = data[i][0];   // Cột A: Tên task
    const deadline = new Date(data[i][1]); // Cột B: Ngày deadline
    const trangThai = data[i][2]; // Cột C: Trạng thái

    // Tính số ngày còn lại
    const soNgay = Math.ceil((deadline - homNay) / (1000 * 60 * 60 * 24));

    // Nhắc nếu còn 1-3 ngày và chưa hoàn thành
    if (soNgay >= 0 && soNgay <= 3 && trangThai !== 'Hoàn thành') {
      danhSachNhac.push(`- ${tenTask}: còn ${soNgay} ngày (hạn ${deadline.toLocaleDateString('vi-VN')})`);
    }
  }

  if (danhSachNhac.length > 0) {
    const tieuDe = `[Nhắc Việc] ${danhSachNhac.length} task sắp đến hạn`;
    const noiDung = 'Các công việc cần hoàn thành sớm:

' + danhSachNhac.join('
');
    GmailApp.sendEmail(nguoiNhan, tieuDe, noiDung);
    Logger.log('Đã gửi email nhắc ' + danhSachNhac.length + ' task');
  }
}

Script 2: Highlight Hàng Quá Hạn

Tự động tô màu đỏ các hàng có deadline đã qua mà chưa hoàn thành.

function highlightQuaHan() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('CongViec');
  const data = sheet.getDataRange().getValues();
  const homNay = new Date();
  homNay.setHours(0, 0, 0, 0); // Reset về 00:00:00

  for (let i = 1; i < data.length; i++) {
    const deadline = new Date(data[i][1]);
    const trangThai = data[i][2];
    const hangHienTai = sheet.getRange(i + 1, 1, 1, data[0].length);

    if (deadline < homNay && trangThai !== 'Hoàn thành') {
      // Tô màu đỏ nhạt cho hàng quá hạn
      hangHienTai.setBackground('#FEE2E2');
    } else if (trangThai === 'Hoàn thành') {
      // Tô màu xanh nhạt cho hàng đã xong
      hangHienTai.setBackground('#DCFCE7');
    } else {
      // Xóa màu cho hàng bình thường
      hangHienTai.setBackground(null);
    }
  }
  Logger.log('Đã cập nhật màu cho ' + (data.length - 1) + ' hàng');
}

Script 3: Tạo PDF Báo Cáo Tự Động

Xuất sheet thành PDF và gửi email cho sếp mỗi thứ Hai.

function xuatPdfGuiEmail() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('BaoCaoTuan');
  const spreadsheetId = spreadsheet.getId();
  const sheetId = sheet.getSheetId();

  // URL xuất PDF
  const urlPdf = `https://docs.google.com/spreadsheets/d/${spreadsheetId}/export?`
    + `format=pdf&gid=${sheetId}&size=A4&portrait=true&fitw=true`;

  // Lấy PDF dưới dạng blob
  const token = ScriptApp.getOAuthToken();
  const response = UrlFetchApp.fetch(urlPdf, {
    headers: { Authorization: 'Bearer ' + token }
  });
  const pdfBlob = response.getBlob().setName('BaoCaoTuan_' + new Date().toLocaleDateString('vi-VN') + '.pdf');

  // Gửi email kèm file PDF
  GmailApp.sendEmail(
    'sep@congty.com',
    'Báo Cáo Tuần - ' + new Date().toLocaleDateString('vi-VN'),
    'Kính gửi Anh/Chị,

Vui lòng xem báo cáo tuần đính kèm.

Trân trọng.',
    { attachments: [pdfBlob] }
  );
  Logger.log('Đã gửi báo cáo PDF thành công');
}

Script 4: Ghi Log Thay Đổi

Mỗi khi ai đó sửa dữ liệu, tự động ghi lại ai sửa, ô nào, lúc mấy giờ.

// Hàm này chạy tự động khi có ai chỉnh sửa sheet (trigger onEdit)
function ghiLogThayDoi(e) {
  const sheetLog = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('LichSuSua'); // Sheet ghi log
  if (!sheetLog) return; // Bỏ qua nếu không có sheet Log

  const nguoiSua = Session.getActiveUser().getEmail();
  const thoiGian = new Date().toLocaleString('vi-VN');
  const viTri = e.range.getA1Notation(); // VD: "B5"
  const giaTriCu = e.oldValue || '(trống)';
  const giaTriMoi = e.value || '(trống)';
  const tenSheet = e.source.getActiveSheet().getName();

  // Thêm hàng mới vào sheet log
  sheetLog.appendRow([thoiGian, nguoiSua, tenSheet, viTri, giaTriCu, giaTriMoi]);
}

// Tạo trigger onEdit cho hàm trên:
// Apps Script Editor → Triggers (đồng hồ) → Add Trigger
// Function: ghiLogThayDoi | Event: From spreadsheet | On edit

Script 5: Tạo Custom Menu

Thêm menu tùy chỉnh vào thanh menu của Google Sheets để chạy script bằng 1 click.

// Hàm onOpen chạy tự động mỗi khi mở spreadsheet
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('🚀 Công Cụ') // Tên menu hiện trên thanh menu
    .addItem('Nhắc Deadline', 'nhacDeadline')
    .addItem('Highlight Quá Hạn', 'highlightQuaHan')
    .addSeparator() // Đường ngăn cách
    .addItem('Xuất PDF & Gửi Email', 'xuatPdfGuiEmail')
    .addItem('Xem Log Thay Đổi', 'xemLog')
    .addToUi();
}

function xemLog() {
  const url = SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName('LichSuSua').getParent().getUrl();
  SpreadsheetApp.getUi().alert('Xem log tại sheet "LichSuSua"');
}

// Sau khi paste code này và Save:
// Chạy hàm onOpen một lần để tạo menu
// Từ lần mở file sau, menu xuất hiện tự động

4. Triggers: Time-Driven Và onEdit

Trigger là cơ chế giúp script tự chạy mà không cần bạn nhấn nút.

Loại Trigger Khi Nào Chạy Dùng Cho
onOpen Mỗi khi mở spreadsheet Tạo custom menu, khởi tạo sheet
onEdit Mỗi khi có ô được sửa Ghi log, tự động tính toán, validate dữ liệu
Time-driven Theo lịch (mỗi giờ/ngày/tuần) Gửi báo cáo định kỳ, nhắc deadline, sync dữ liệu
onFormSubmit Khi có người nộp Google Form Gửi email xác nhận, tạo tài liệu từ form

Cách Tạo Time-Driven Trigger

1

Trong Script Editor: Click biểu tượng đồng hồ ⏰ Triggers ở thanh bên trái

2

Click + Add Trigger (góc dưới phải)

3

Chọn Function: nhacDeadline | Event source: Time-driven | Type: Day timer | Time: 8am–9am

4

Click Save → Từ giờ mỗi sáng 8h, hàm nhacDeadline tự chạy không cần bạn làm gì

5. Giới Hạn Apps Script Cần Biết

Giới Hạn Tài Khoản Thường (@gmail) Google Workspace
Thời gian chạy/ngày6 giờ6 giờ
Email gửi/ngày100 email1,500 email
Thời gian mỗi lần chạy6 phút30 phút
Triggers đồng thời20 triggers20 triggers
URL Fetch/ngày20,000 lần100,000 lần

Giới hạn quan trọng nhất với người mới:

  • ✓ 100 email/ngày đủ cho hầu hết doanh nghiệp nhỏ
  • ✓ Nếu script chạy quá 6 phút → cần tách nhỏ hoặc dùng batch processing
  • ✓ Script không chạy được nếu Google account bị tạm khóa

6. Tài Nguyên Học Apps Script Thêm

Tài Liệu Chính Thức

  • 📘 developers.google.com/apps-script
  • 📘 SpreadsheetApp Reference — tra cứu tất cả method
  • 📘 Google Apps Script Samples — ví dụ có sẵn

Cộng Đồng & Hỏi Đáp

  • 💬 Stack Overflow: tag "google-apps-script"
  • 💬 Reddit: r/googlesheets
  • 💬 Google Workspace Developer Community

Mẹo Debug Nhanh

  • 🔍 Dùng Logger.log() để in giá trị ra console
  • 🔍 View → Logs trong Script Editor để xem output
  • 🔍 Dùng try/catch để bắt lỗi gracefully

Công Cụ Hỗ Trợ

  • 🤖 ChatGPT/Gemini: "Viết Apps Script để..." — cực kỳ hiệu quả
  • 🤖 Clasp: Deploy script từ local IDE
  • 🤖 AppsScript.info: snippets và tutorials

7. Quiz + Tổng Kết Khóa Học Google Sheets Cơ Bản

Câu 1: Trigger nào tự chạy mỗi khi ai chỉnh sửa ô trong Sheet?

  • A. onOpen
  • B. onEdit ✓
  • C. Time-driven
  • D. onFormSubmit

Câu 2: Muốn gửi email tự động mỗi sáng thứ Hai, dùng trigger nào?

  • A. onOpen
  • B. onEdit
  • C. Time-driven ✓
  • D. onFormSubmit

Câu 3: Apps Script có phải trả phí không?

  • A. Miễn phí hoàn toàn với tài khoản Google ✓
  • B. Chỉ miễn phí 14 ngày
  • C. Cần Google Workspace Business trở lên
  • D. Tính phí theo số lần chạy

Câu 4: Logger.log() trong Apps Script dùng để làm gì?

  • A. Ghi log vào Google Sheets
  • B. In giá trị ra console để debug ✓
  • C. Tạo file log trên Google Drive
  • D. Gửi log qua email

Câu 5: Hàm nào tự chạy khi mở spreadsheet để tạo custom menu?

  • A. onOpen() ✓
  • B. onLoad()
  • C. onStart()
  • D. createMenu()

🎓 Chúc Mừng Hoàn Thành Series Google Sheets Cơ Bản!

Bạn đã học xong 7 bài của series Google Sheets Cơ Bản. Từ giao diện cơ bản đến tự động hóa với Apps Script — đây là nền tảng vững chắc để làm chủ công cụ mạnh nhất cho quản lý doanh nghiệp chi phí thấp.

7

Bài học hoàn thành

50+

Kỹ năng thực tế

5

Script copy-paste ngay

Ứng dụng thực tiễn

Bước tiếp theo: Áp dụng tất cả kiến thức đã học vào template SheetStore — hệ thống quản lý doanh nghiệp hoàn chỉnh xây dựng trên Google Sheets.

Nâng Cấp Lên SheetStore — Google Sheets Cho Doanh Nghiệp

SheetStore tích hợp tất cả: VLOOKUP, Pivot Table, biểu đồ, Apps Script tự động hóa — trong một hệ thống quản lý bán hàng, kho, nhân sự hoàn chỉnh. Chỉ 699.000đ/năm.

Chia sẻ bài viết:

Tuân Hoang

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.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận