Hướng dẫn

Quản Lý Hợp Đồng Và Nhắc Hạn Tự Động Bằng Google Sheets 2026

Tuân HoangTuân Hoang
5 tháng 10, 2026
Cập nhật: 8 tháng 10, 2026
8 phút đọc
Ảnh minh họa bài viết: Quản Lý Hợp Đồng Và Nhắc Hạn Tự Động Bằng Google Sheets 2026

Trả lời nhanh: Cách quản lý hợp đồng và nhắc hạn tự động bằng Google Sheets là dựng một bảng danh sách hợp đồng với cột ngày hết hạn, dùng công thức DATEDIF hoặc trừ ngày trực tiếp để tính số ngày còn lại, tô màu cảnh báo bằng định dạng có điều kiện, rồi gắn Apps Script hoặc add-on để tự gửi email khi hợp đồng còn 30, 15, 7 ngày là hết hạn.

Vì sao bảng Excel chấm ngày hết hạn bằng tay luôn trễ

Thử hình dung một công ty dịch vụ bảo trì có khoảng 40 hợp đồng đang chạy — vài hợp đồng thuê văn phòng, một mớ hợp đồng với khách hàng B2B, vài hợp đồng mua bán vật tư theo năm. Người phụ trách mở file Excel mỗi sáng thứ Hai, lướt qua cột "ngày hết hạn", nhẩm tính còn bao lâu. Vấn đề là việc này phụ thuộc hoàn toàn vào việc có ai mở file đúng ngày hay không. Nếu tuần đó bận, hoặc người phụ trách nghỉ phép, hợp đồng thuê mặt bằng hết hạn mà không ai gia hạn kịp, hoặc hợp đồng với nhà cung cấp tự động chuyển sang điều khoản bất lợi vì không ai lên tiếng trước hạn.

Gốc của vấn đề không phải là thiếu cẩn thận, mà là hệ thống đặt gánh nặng "phải nhớ" lên con người. Google Sheets giải quyết được phần này vì nó có thể tự tính, tự tô màu, và — quan trọng nhất — tự gửi thông báo qua Apps Script mà không cần ai mở file ra xem.

Cấu trúc bảng dữ liệu hợp đồng tối thiểu cần có

Một bảng quản lý hợp đồng chạy được cần ít nhất các cột sau, xếp theo thứ tự từ A đến H trong sheet "DanhSachHopDong":

  • Cột A — Mã hợp đồng: định danh duy nhất, ví dụ HD001
  • Cột B — Tên đối tác: khách hàng hoặc nhà cung cấp
  • Cột C — Loại hợp đồng: thuê mặt bằng, dịch vụ, mua bán, lao động...
  • Cột D — Ngày bắt đầu: định dạng ngày (DATE)
  • Cột E — Ngày hết hạn: định dạng ngày (DATE)
  • Cột F — Giá trị hợp đồng: số tiền, dùng để lọc ưu tiên hợp đồng lớn
  • Cột G — Người phụ trách: email người cần nhận cảnh báo
  • Cột H — Trạng thái: Đang hiệu lực / Đã gia hạn / Đã kết thúc

Thêm cột I để tính số ngày còn lại, dùng công thức trừ trực tiếp: =E2-TODAY() (E2 là ngày hết hạn, TODAY() trả về ngày hiện tại, kết quả là số ngày còn lại — âm nghĩa là đã quá hạn). Nếu muốn chắc chắn công thức luôn ra số nguyên dương/âm chứ không dính định dạng ngày, bọc thêm =DATEDIF(TODAY(),E2,"d") cho các dòng chưa hết hạn, nhưng DATEDIF báo lỗi khi ngày kết thúc nhỏ hơn ngày bắt đầu nên với hợp đồng đã quá hạn công thức trừ trực tiếp vẫn an toàn hơn.

Cách tổ chức cột này gần với cách quản lý hợp đồng tư vấn và thu nhập freelancer vẫn dùng, chỉ khác là ở quy mô doanh nghiệp số hợp đồng nhiều hơn nên cần thêm cột phân loại và người phụ trách để biết cảnh báo gửi cho ai.

Định dạng có điều kiện: nhìn một phát biết hợp đồng nào cần xử lý gấp

Trước khi đụng tới Apps Script, định dạng có điều kiện (Conditional Formatting) đã giải quyết được 80% nhu cầu cảnh báo trực quan. Vào Format → Conditional formatting, áp cho toàn cột E (ngày hết hạn) hoặc cột I (số ngày còn lại) ba quy tắc:

  • Công thức tùy chỉnh =I2<0 → tô đỏ đậm: hợp đồng đã quá hạn
  • Công thức tùy chỉnh =AND(I2>=0,I2<=15) → tô cam: còn 15 ngày hoặc ít hơn
  • Công thức tùy chỉnh =AND(I2>15,I2<=30) → tô vàng: còn trong khoảng 16-30 ngày

Cách này cho người quản lý một bức tranh tổng quan ngay khi mở file, nhưng nó vẫn đòi hỏi có người mở file. Để không phụ thuộc vào việc "có ai mở file hay không", cần chuyển sang bước tiếp theo: gửi email tự động.

Sơ đồ ba mức màu cảnh báo hạn hợp đồng theo số ngày còn lại
Ba quy tắc tô màu theo số ngày còn lại trước khi hợp đồng hết hạn.

Viết Apps Script gửi email nhắc hạn hợp đồng tự động

Vào Extensions → Apps Script trong Google Sheets, xóa code mẫu và dán đoạn sau. Script này quét toàn bộ dòng trong sheet "DanhSachHopDong", tính số ngày còn lại cho mỗi hợp đồng, và gửi email cho người phụ trách nếu còn đúng 30, 15 hoặc 7 ngày:

function nhacHanHopDong() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("DanhSachHopDong");
  const data = sheet.getDataRange().getValues();
  const nguongCanhBao = [30, 15, 7];
  const homNay = new Date();
  homNay.setHours(0, 0, 0, 0);

  for (let i = 1; i < data.length; i++) {
    const maHopDong = data[i][0];
    const tenDoiTac = data[i][1];
    const ngayHetHan = new Date(data[i][4]);
    const emailPhuTrach = data[i][6];
    const trangThai = data[i][7];

    // Bỏ qua hợp đồng đã kết thúc, thiếu email hoặc ngày hết hạn không hợp lệ
    if (trangThai === "Đã kết thúc" || !emailPhuTrach || isNaN(ngayHetHan)) continue;

    ngayHetHan.setHours(0, 0, 0, 0);
    const soNgayCon = Math.round((ngayHetHan - homNay) / 86400000);

    if (nguongCanhBao.indexOf(soNgayCon) !== -1) {
      const ngayText = Utilities.formatDate(ngayHetHan, Session.getScriptTimeZone(), "dd/MM/yyyy");
      MailApp.sendEmail(
        emailPhuTrach,
        "Hợp đồng " + maHopDong + " còn " + soNgayCon + " ngày là hết hạn",
        "Hợp đồng " + maHopDong + " với " + tenDoiTac + " hết hạn ngày " + ngayText + ". Vui lòng xem xét gia hạn hoặc thanh lý."
      );
    }
  }
}

Sau khi lưu script, vào biểu tượng đồng hồ (Triggers) ở thanh bên trái, chọn Add Trigger, đặt hàm chạy là nhacHanHopDong, chọn kiểu kích hoạt "Time-driven", tần suất "Day timer", giờ chạy khoảng 7-8 giờ sáng. Từ đó script tự chạy mỗi ngày không cần ai mở file.

Lưu ý thực tế: nếu người phụ trách nghỉ hoặc nghỉ việc, cột G cần được cập nhật ngay, không thì email cảnh báo rơi vào hộp thư không ai đọc. Cách phòng là thêm một địa chỉ email quản lý chung vào cột J, gửi CC trong script bằng tham số thứ 4 của MailApp.sendEmail.

Khi nào bảng tính là đủ, khi nào cần phần mềm chuyên dụng hơn

Script trên xử lý tốt cảnh báo một chiều — tới hạn thì gửi email. Nhưng quản lý hợp đồng thực tế ở doanh nghiệp còn cần phân quyền (ai được sửa hợp đồng, ai chỉ được xem), lưu file hợp đồng gốc đính kèm, và nhật ký ai đã thao tác gì trên hồ sơ. Một bảng tính dùng Apps Script tự viết không có sẵn các lớp này — phải tự xây thêm, và càng thêm nhiều logic vào Apps Script thì file càng khó bảo trì khi người viết script nghỉ việc.

Nhu cầuGoogle Sheets + Apps Script tự viếtKhi nào nên cân nhắc công cụ có sẵn
Số hợp đồng dưới 50, 1-2 người quản lýĐủ dùng, chi phí gần như bằng khôngKhông cần thiết
Cần phân quyền 3 cấp, nhật ký thao tácPhải tự code thêm, tốn thời gianNên xem công cụ đã có sẵn tính năng này
Lưu trữ file hợp đồng gốc kèm hồ sơPhải tích hợp Google Drive riêngCông cụ có tích hợp Drive sẵn tiết kiệm công sức hơn

Với nhóm nhu cầu ở hai dòng cuối, Phần Mềm Quản Lý Tài Liệu, Văn Bản chạy trên Google Sheets và Drive có sẵn phần nhắc hạn hợp đồng tự động cùng phân quyền 3 cấp và nhật ký thao tác, giá 299.000đ trả một lần, dùng thử 7 ngày — phù hợp khi đã thấy việc tự viết Apps Script cho phân quyền và lưu file bắt đầu tốn công hơn giá trị nó mang lại.

Giao diện thực tế của Phần Mềm Quản Lý Tài Liệu, Văn Bản google sheet
Giao diện thực tế của Phần Mềm Quản Lý Tài Liệu, Văn Bản google sheet

Mẫu nhắc hạn áp dụng cho nhiều loại hợp đồng khác nhau

Logic DATEDIF/trừ ngày và trigger hằng ngày ở trên không chỉ dùng cho hợp đồng dịch vụ B2B. Giả sử một công ty cho thuê thiết bị có hợp đồng thuê xe với khách hàng cá nhân và doanh nghiệp — cấu trúc cột giống hệt, chỉ đổi "Loại hợp đồng" thành biển số xe hoặc mã thiết bị. Với nhóm cho thuê tài sản, phần mềm Quản Lý Cho Thuê Xe đã có sẵn tính năng nhắc hạn qua email tích hợp cùng chống trùng lịch và tự tính công nợ, giá 490.000đ trả một lần, dùng thử 7 ngày.

Ngược lại, nếu đối tượng là freelancer tự quản lý hợp đồng tư vấn với vài khách hàng, không cần tới mức phân quyền hay nhật ký, thì bài Google Sheets cho freelancer quản lý dự án, hợp đồng và thu nhập mô tả cách gộp luôn cột tiến độ dự án vào cùng bảng hợp đồng, giảm số sheet phải mở khi làm việc một mình.

Lỗi thường gặp khi triển khai công thức ngày hết hạn

Một lỗi phổ biến là nhập ngày hết hạn ở dạng text (ví dụ gõ "15/12/2026" nhưng ô đang để định dạng Plain text) — khi đó E2-TODAY() trả về lỗi #VALUE! vì Sheets không nhận ra đó là ngày. Cách kiểm tra nhanh: chọn cả cột E, vào Format → Number, nếu không thấy tùy chọn "Date" được tick sẵn thì toàn bộ dữ liệu cột đó đang bị hiểu sai kiểu.

Lỗi thứ hai là để trigger chạy theo "Day timer" nhưng quên rằng Apps Script tính giờ theo múi giờ cấu hình trong file (Project Settings → Time zone), không phải giờ máy chủ Google mặc định. Nếu múi giờ file đặt sai, email có thể gửi lệch ngày — chỉnh về (GMT+07:00) Bangkok trước khi thiết lập trigger. Lỗi thứ ba là quên MailApp.sendEmail có giới hạn khoảng 100 email/ngày với tài khoản Gmail miễn phí — với danh sách hợp đồng lớn và nhiều người phụ trách, nên gộp nhiều hợp đồng cùng người nhận vào một email duy nhất thay vì gửi riêng từng hợp đồng.

Câu hỏi thường gặp

Công thức tính số ngày còn lại đến hạn hợp đồng là gì?

Dùng =E2-TODAY() với E2 là ngày hết hạn, TODAY() trả về ngày hiện tại, kết quả là số ngày còn lại (âm nghĩa là đã quá hạn). Nếu muốn chắc ra số nguyên, bọc =DATEDIF(TODAY(),E2,"d") cho các dòng chưa hết hạn, nhưng DATEDIF báo lỗi khi ngày kết thúc nhỏ hơn ngày bắt đầu nên hợp đồng quá hạn vẫn nên dùng công thức trừ trực tiếp.

Vì sao email nhắc hạn tự động gửi sai ngày?

Nguyên nhân thường là Apps Script tính giờ theo múi giờ cấu hình trong file (Project Settings → Time zone), không theo giờ máy chủ Google mặc định. Nếu múi giờ file đặt sai, email có thể gửi lệch ngày. Cách sửa là chỉnh múi giờ về (GMT+07:00) Bangkok trước khi thiết lập trigger.

Tại sao công thức ngày hết hạn báo lỗi #VALUE!?

Lỗi này xảy ra khi ngày hết hạn được nhập ở dạng text (ví dụ gõ "15/12/2026" nhưng ô đang để định dạng Plain text) nên Sheets không nhận ra đó là ngày. Cách kiểm tra là chọn cả cột ngày, vào Format → Number, nếu không thấy tùy chọn "Date" được tick sẵn thì dữ liệu cột đó đang bị hiểu sai kiểu.

Gmail miễn phí có giới hạn số email gửi mỗi ngày không?

Có, MailApp.sendEmail có giới hạn khoảng 100 email/ngày với tài khoản Gmail miễn phí. Với danh sách hợp đồng lớn và nhiều người phụ trách, nên gộp nhiều hợp đồng cùng người nhận vào một email duy nhất thay vì gửi riêng từng hợp đồng để tránh vượt giới hạn.

Bạn muốn áp dụng ngay mà không phải tự xây từ đầu?

Khám phá các mẫu Google Sheets và phần mềm quản lý dựng sẵn cho doanh nghiệp Việt tại SheetStore Marketplace.

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Google SheetsGoogle Apps ScriptCRMAutomationPhần mềm quản lý doanh nghiệp

Google Workspace Certified, 5+ years experience

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