Hướng dẫn

Template Quản Lý Kho Hàng Google Sheets [Tự Động Cảnh Báo Tồn Kho 2026]

Tuân HoangTuân Hoang
9 tháng 6, 2026
10 phút đọc
Ảnh minh họa bài viết: Template Quản Lý Kho Hàng Google Sheets [Tự Động Cảnh Báo Tồn Kho 2026]

Bạn Đang Quản Lý Kho Theo Kiểu Này Không?

Sáng thứ Hai, khách gọi đặt 50 hộp sản phẩm A. Bạn vào Excel kiểm tra — tồn kho ghi 80 hộp. Nhận đơn xong, đến kho mới phát hiện thực tế chỉ còn 12 hộp vì tuần trước xuất mà chưa cập nhật. Khách hủy đơn, bạn mất đơn hàng, mất uy tín.

Hoặc chiều ngược lại: nhập về 200 thùng hàng C vì sợ hết, nhưng hóa ra hàng C đang tồn 3 tháng chưa bán hết. Vốn chết trong kho, không có tiền nhập hàng mới.

Đây là hai vấn đề phổ biến nhất của SMB khi quản lý kho bằng Excel thủ công: không có cảnh báo tự độngsố liệu không đồng bộ thời gian thực. Bài viết này giới thiệu template Google Sheets 5 sheet miễn phí giải quyết cả hai vấn đề trên — kèm Apps Script gửi email cảnh báo mỗi sáng trước khi bạn bắt đầu ngày làm việc.

Tổng Quan Template 5 Sheet

Template được thiết kế theo nguyên tắc nhập liệu một nơi, tổng hợp tự động. Nhân viên chỉ cần cập nhật sheet Nhập Kho và Xuất Kho — tất cả số liệu tồn kho, báo cáo tháng đều tự động tính theo.

Sheet Chức năng Ai dùng
1. Danh Mục Hàng Hóa Master data sản phẩm, ngưỡng tồn min/max Quản lý (cập nhật 1 lần)
2. Nhập Kho Ghi nhận từng lần nhập hàng từ nhà cung cấp Nhân viên kho
3. Xuất Kho Ghi nhận từng lần xuất hàng cho khách/bộ phận Nhân viên kho
4. Tồn Kho Tồn cuối kỳ, trạng thái màu sắc, giá trị tồn Tự động (chỉ đọc)
5. Báo Cáo Xuất nhập tồn theo tháng, top SP, biểu đồ Quản lý (tự động)

Sheet 1: Danh Mục Hàng Hóa — Nền Tảng Của Cả Hệ Thống

Sheet này là master data — nhập một lần, dùng mãi. Quan trọng nhất là hai cột Tồn Tối ThiểuTồn Tối Đa vì chúng quyết định khi nào hệ thống cảnh báo.

Mã SP Tên SP Đơn vị Nhóm hàng Giá nhập Giá bán Tồn tối thiểu Tồn tối đa Vị trí kho Nhà CC
SP001 Dầu gội X-Men 400ml Chai Chăm sóc tóc 45.000 65.000 50 500 A1-01 Unilever VN
SP002 Kem đánh răng P/S 230g Tuýp Vệ sinh răng miệng 22.000 32.000 100 800 A1-02 Unilever VN

Mẹo thiết lập ngưỡng tồn kho hợp lý:

  • Tồn tối thiểu = Mức tiêu thụ trung bình × Thời gian chờ nhập hàng (ngày). Ví dụ bán 10 cái/ngày, nhà cung cấp giao trong 5 ngày → tồn tối thiểu = 50.
  • Tồn tối đa = Sức chứa kho × 80% (để dự phòng). Không nhập quá mức này tránh hàng tồn lâu.

Sheet 2: Nhập Kho — Ghi Nhận Từng Phiếu Nhập

Mỗi khi hàng về, nhân viên kho điền vào sheet này. Số phiếu nhập được tự động tạo bằng công thức để không trùng lặp.

Ngày Số phiếu Mã SP Tên SP SL nhập Đơn giá Thành tiền Nhà CC Người nhập Ghi chú
02/06/2026 NK001 SP001 Dầu gội X-Men 400ml 200 45.000 9.000.000 Unilever VN Nguyễn Văn A Lô mới tháng 6
05/06/2026 NK002 SP002 Kem đánh răng P/S 230g 300 22.000 6.600.000 Unilever VN Trần Thị B

Công thức tự động tạo số phiếu nhập (cột B):

="NK"&TEXT(COUNTA($B$2:B2),"000")

Công thức này đếm số phiếu đã có và tạo mã tăng dần: NK001, NK002, NK003... Tương tự cho phiếu xuất dùng prefix "XK".

Tên SP tự động điền theo Mã SP (cột D):

=IFERROR(VLOOKUP(C2,'DanhMuc'!A:B,2,0),"")

Nhân viên chỉ cần nhập Mã SP, tên sản phẩm tự điền — giảm nhập liệu sai.

Sheet 3: Xuất Kho — Theo Dõi Từng Lần Xuất Hàng

Cấu trúc tương tự sheet Nhập Kho nhưng thêm cột Khách hàng/Bộ phận để biết hàng đi đâu — hữu ích khi cần truy vết hoặc xuất báo cáo theo đầu ra.

Ngày Số phiếu Mã SP Tên SP SL xuất Đơn giá Thành tiền Khách hàng/Bộ phận Người xuất Ghi chú
03/06/2026 XK001 SP001 Dầu gội X-Men 400ml 80 65.000 5.200.000 Đại lý Minh Phát Lê Văn C Đơn ĐH-0601
07/06/2026 XK002 SP002 Kem đánh răng P/S 230g 150 32.000 4.800.000 Siêu thị ABC Lê Văn C

Sheet 4: Tồn Kho — Trái Tim Của Template

Sheet này chỉ đọc — không nhập liệu trực tiếp. Toàn bộ số liệu được tính tự động từ sheet Nhập và Xuất. Đây là nơi bạn nhìn vào mỗi sáng để biết tình trạng kho.

Các Công Thức Cốt Lõi

Tổng nhập theo mã SP (cột F):

=SUMIF('NhapKho'!C:C,A2,'NhapKho'!E:E)

Tổng xuất theo mã SP (cột G):

=SUMIF('XuatKho'!C:C,A2,'XuatKho'!E:E)

Tồn cuối kỳ (cột H):

=E2+F2-G2

(E2 = Tồn đầu kỳ nhập thủ công khi bắt đầu dùng template)

Công thức trạng thái tồn kho với màu sắc (cột J):

=IFS(H2<=0,"🔴 Hết hàng",H2<=I2,"🟡 Sắp hết",H2>I2*3,"🔵 Dư thừa",TRUE,"✅ Bình thường")

Giá trị tồn kho (cột K):

=H2*IFERROR(VLOOKUP(A2,'DanhMuc'!A:E,5,0),0)

Bảng Tồn Kho Mẫu (5 Sản Phẩm)

Mã SP Tên SP Đơn vị Tồn đầu kỳ Tổng nhập Tổng xuất Tồn cuối Tồn tối thiểu Trạng thái Giá trị tồn
SP001 Dầu gội X-Men 400ml Chai 50 200 248 2 50 🔴 Hết hàng 90.000
SP002 Kem đánh răng P/S 230g Tuýp 200 300 420 80 100 🟡 Sắp hết 1.760.000
SP003 Nước rửa chén Sunlight 750ml Chai 300 500 350 450 80 ✅ Bình thường 18.000.000
SP004 Bột giặt OMO 6kg Túi 100 400 80 420 50 🔵 Dư thừa 79.800.000
SP005 Nước lau sàn Vim 1L Chai 150 200 190 160 60 ✅ Bình thường 4.480.000

Thiết Lập Conditional Formatting

Để cột Trạng thái và cả hàng đổi màu tự động:

  1. Chọn toàn bộ vùng dữ liệu (ví dụ A2:K100).
  2. Vào Format > Conditional formatting > Custom formula.
  3. Thêm 4 rule theo thứ tự ưu tiên:
Điều kiện (công thức) Màu nền Ý nghĩa
=$H2<=0 #fee2e2 (đỏ nhạt) Hết hàng
=AND($H2>0,$H2<=$I2) #fef9c3 (vàng nhạt) Sắp hết
=$H2>$I2*3 #dbeafe (xanh nhạt) Dư thừa
=$H2>$I2 #dcfce7 (xanh lá nhạt) Bình thường

Apps Script: Cảnh Báo Tồn Kho Tự Động Mỗi Sáng

Đây là phần làm cho template này khác biệt so với file Excel thông thường. Script này chạy tự động mỗi sáng lúc 7h, quét toàn bộ sheet Tồn Kho và gửi email cảnh báo nếu có sản phẩm sắp hết hoặc đã hết.

Cách Cài Đặt Script

  1. Trong Google Sheets, vào Extensions > Apps Script.
  2. Xóa nội dung mặc định, dán code sau vào.
  3. Nhấn Save (Ctrl+S).
  4. Chạy thử bằng cách nhấn Run và cấp quyền truy cập Gmail.
  5. Vào Triggers (biểu tượng đồng hồ) để đặt lịch tự động.
function canhBaoTonKho() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('TonKho');

  if (!sheet) {
    console.log('Không tìm thấy sheet TonKho');
    return;
  }

  const data = sheet.getDataRange().getValues();
  const sanPhamHetHang = [];
  const sanPhamSapHet = [];

  // Bỏ qua hàng tiêu đề (index 0)
  for (let i = 1; i < data.length; i++) {
    const maSP = data[i][0];
    const tenSP = data[i][1];
    const donVi = data[i][2];
    const tonCuoi = Number(data[i][7]);     // Cột H: Tồn cuối
    const tonToiThieu = Number(data[i][8]); // Cột I: Tồn tối thiểu

    // Bỏ qua hàng trống
    if (!maSP || !tenSP) continue;

    if (tonCuoi <= 0) {
      sanPhamHetHang.push(
        `⛔ [${maSP}] ${tenSP}: HẾT HÀNG (tồn tối thiểu: ${tonToiThieu} ${donVi})`
      );
    } else if (tonCuoi <= tonToiThieu) {
      sanPhamSapHet.push(
        `⚠️ [${maSP}] ${tenSP}: còn ${tonCuoi} ${donVi} (tối thiểu: ${tonToiThieu})`
      );
    }
  }

  const tongCanhBao = sanPhamHetHang.length + sanPhamSapHet.length;

  if (tongCanhBao === 0) {
    console.log('Tồn kho ổn định, không có cảnh báo.');
    return;
  }

  // Soạn nội dung email
  const tenFile = ss.getName();
  const ngayHomNay = Utilities.formatDate(new Date(), 'Asia/Ho_Chi_Minh', 'dd/MM/yyyy HH:mm');

  let noiDungEmail = `Báo cáo tồn kho tự động — ${ngayHom Nay}\n`;
  noiDungEmail += `File: ${tenFile}\n`;
  noiDungEmail += `Link: ${ss.getUrl()}\n\n`;
  noiDungEmail += '='.repeat(50) + '\n\n';

  if (sanPhamHetHang.length > 0) {
    noiDungEmail += `HẾT HÀNG (${sanPhamHetHang.length} sản phẩm):\n`;
    noiDungEmail += sanPhamHetHang.join('\n') + '\n\n';
  }

  if (sanPhamSapHet.length > 0) {
    noiDungEmail += `SẮP HẾT HÀNG (${sanPhamSapHet.length} sản phẩm):\n`;
    noiDungEmail += sanPhamSapHet.join('\n') + '\n\n';
  }

  noiDungEmail += '\nVui lòng kiểm tra và lên kế hoạch nhập hàng sớm.';

  // Gửi email đến người dùng hiện tại
  const emailNguoiDung = Session.getActiveUser().getEmail();
  GmailApp.sendEmail(
    emailNguoiDung,
    `[Kho hàng - ${tenFile}] ${tongCanhBao} sản phẩm cần chú ý`,
    noiDungEmail
  );

  console.log(`Đã gửi cảnh báo: ${sanPhamHetHang.length} hết hàng, ${sanPhamSapHet.length} sắp hết`);
}

// Hàm cài đặt trigger tự động (chạy một lần để đặt lịch)
function capNhatTrigger() {
  // Xóa trigger cũ nếu có
  ScriptApp.getProjectTriggers().forEach(trigger => {
    if (trigger.getHandlerFunction() === 'canhBaoTonKho') {
      ScriptApp.deleteTrigger(trigger);
    }
  });

  // Tạo trigger mới: chạy lúc 7h sáng mỗi ngày
  ScriptApp.newTrigger('canhBaoTonKho')
    .timeBased()
    .everyDays(1)
    .atHour(7)
    .create();

  console.log('Đã đặt trigger: canhBaoTonKho chạy lúc 7h mỗi ngày');
}

Đặt Lịch Chạy Tự Động

Thay vì vào Triggers thủ công, bạn chỉ cần chạy hàm capNhatTrigger() một lần — nó sẽ tự tạo lịch chạy 7h sáng hàng ngày. Muốn thay đổi giờ, sửa atHour(7) thành giờ bạn muốn.

Sheet 5: Báo Cáo Tháng — Phân Tích Xu Hướng

Sheet báo cáo giúp quản lý nhìn tổng quan theo tháng mà không cần lọc thủ công. Tất cả số liệu cập nhật realtime khi sheet Nhập/Xuất có dữ liệu mới.

Báo Cáo Xuất Nhập Tồn Theo Tháng

Công thức tổng nhập theo tháng/năm cụ thể (ví dụ tháng 6/2026, SP có mã ở cột A):

=SUMPRODUCT(
  (MONTH('NhapKho'!A$2:A$1000)=6)*
  (YEAR('NhapKho'!A$2:A$1000)=2026)*
  ('NhapKho'!C$2:C$1000=A2)*
  'NhapKho'!E$2:E$1000
)

Thay số tháng và năm thành tham chiếu ô (ví dụ $B$1 cho tháng, $C$1 cho năm) để tạo bộ lọc động — người dùng đổi tháng là toàn bộ báo cáo cập nhật.

Top 10 Sản Phẩm Xuất Nhiều Nhất

Dùng hàm QUERY để lấy danh sách và sắp xếp giảm dần:

=QUERY('XuatKho'!C:E,
  "SELECT C, SUM(E)
   WHERE C IS NOT NULL
   GROUP BY C
   ORDER BY SUM(E) DESC
   LIMIT 10
   LABEL C 'Mã SP', SUM(E) 'Tổng xuất'",
  1
)

Top 10 Sản Phẩm Tồn Lâu — Cảnh Báo Hàng Chậm Luân Chuyển

Tính tỷ lệ xuất/tồn để xác định hàng nào đang "đứng yên" trong kho:

=QUERY('TonKho'!A:K,
  "SELECT A, B, H, G
   WHERE H > 0
   ORDER BY (G/H) ASC
   LIMIT 10
   LABEL A 'Mã SP', B 'Tên SP', H 'Tồn cuối', G 'Tổng xuất'",
  1
)

Biểu Đồ Sparklines Xu Hướng 6 Tháng

Thêm sparkline mini vào từng ô để thấy xu hướng nhập/xuất mà không cần tạo biểu đồ riêng:

=SPARKLINE(
  {SoLieuThang1, SoLieuThang2, SoLieuThang3, SoLieuThang4, SoLieuThang5, SoLieuThang6},
  {"charttype","line";"color","#16a34a";"linewidth",2}
)

Tổng Giá Trị Kho Hiện Tại

=SUMPRODUCT('TonKho'!H2:H100, 'DanhMuc'!E2:E100)

Công thức nhân tồn cuối của từng SP với giá nhập, cho ra tổng vốn đang nằm trong kho.

Mẹo Vận Hành Hiệu Quả

1. Protect Sheet Tồn Kho Để Tránh Nhập Nhầm

Vào Data > Protect sheets and ranges, chọn sheet TonKho và set quyền "Only you" hoặc "Editors listed". Nhân viên kho chỉ được nhập liệu vào sheet Nhập Kho và Xuất Kho.

2. Dùng Data Validation Cho Cột Mã SP

Chọn cột Mã SP trong sheet Nhập/Xuất, vào Data > Data validation > Dropdown from range, chọn vùng mã SP trong sheet Danh Mục. Nhân viên chọn từ dropdown thay vì gõ tay — giảm lỗi chính tả.

3. Backup Tự Động Hàng Tuần

Thêm hàm này vào Apps Script để tự động tạo bản sao lưu hàng tuần:

function backupHangTuan() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ngay = Utilities.formatDate(new Date(), 'Asia/Ho_Chi_Minh', 'yyyyMMdd');
  const tenBackup = `Backup_KhoHang_${ngay}`;
  ss.copy(tenBackup);
  console.log(`Đã tạo backup: ${tenBackup}`);
}

Đặt trigger cho hàm này chạy mỗi Chủ Nhật lúc 22h — bạn sẽ có bản sao lưu hàng tuần trong Google Drive.

4. Barcode Scanner Để Nhập Liệu Nhanh

Nếu sản phẩm có mã vạch, dùng ứng dụng scanner trên điện thoại kết nối Bluetooth với máy tính. Khi quét barcode, mã sản phẩm tự điền vào ô đang chọn — nhanh hơn gõ tay 5-10 lần.

5. Quy Trình Kiểm Kê Định Kỳ

Hàng tháng (hoặc hàng quý), làm kiểm kê thực tế:

  1. Xuất danh sách tồn kho từ sheet TonKho.
  2. Đếm hàng thực tế trong kho.
  3. So sánh — nếu lệch, điều chỉnh cột "Tồn đầu kỳ" của tháng mới.
  4. Ghi chú lý do lệch (hàng vỡ, mất, nhập nhầm) để truy vết.

Kết Luận

Template 5 sheet này giải quyết bài toán quản lý kho cho SMB theo nguyên tắc đơn giản nhất: nhập liệu tập trung, tổng hợp tự động, cảnh báo chủ động. Bạn không cần phần mềm ERP đắt tiền, không cần lập trình viên — chỉ cần Google Sheets và 30 phút thiết lập ban đầu.

Điểm khác biệt lớn nhất so với Excel thông thường là Apps Script cảnh báo tồn kho. Thay vì phải nhớ kiểm tra mỗi ngày, hệ thống tự động gửi email vào 7h sáng với danh sách chi tiết những mặt hàng cần nhập thêm — bạn có thể lên kế hoạch đặt hàng ngay trước khi bắt đầu ngày làm việc.

Bước tiếp theo: Copy template về, điền danh mục hàng hóa của bạn vào sheet 1, thiết lập ngưỡng tồn min/max, cài Apps Script và đặt trigger. Từ ngày đó, bạn sẽ không bao giờ bị bất ngờ vì hết hàng nữa.

Cần hỗ trợ thiết lập template hoặc tùy chỉnh công thức theo đặc thù ngành của bạn? Để lại bình luận bên dưới.

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