Hướng dẫn

Tạo Hệ Thống Quản Lý Kho Hàng Hoàn Chỉnh Trên Google Sheets [Template Miễn Phí]

Tuân HoangTuân Hoang
27 tháng 2, 2026
Cập nhật: 25 tháng 3, 2026
11 phút đọc
Tạo Hệ Thống Quản Lý Kho Hàng Hoàn Chỉnh Trên Google Sheets [Template Miễn Phí]

Tại sao dùng Google Sheets để quản lý kho hàng?

Với doanh nghiệp nhỏ (dưới 500 SKU), Google Sheets là giải pháp quản lý kho tối ưu nhất vì: miễn phí, dễ tùy chỉnh, nhiều người dùng cùng lúc, và tích hợp được với nhiều công cụ khác. Bài này sẽ hướng dẫn bạn xây dựng một hệ thống quản lý kho hoàn chỉnh từ A-Z.

Hệ thống quản lý kho sẽ có gì?

5 Sheet chính

  • • Danh mục sản phẩm
  • • Phiếu nhập kho
  • • Phiếu xuất kho
  • • Tồn kho realtime
  • • Dashboard báo cáo

Tự động hóa

  • • Tính tồn kho tự động
  • • Cảnh báo hàng sắp hết
  • • Email khi dưới mức tối thiểu
  • • Mã phiếu tự tăng
  • • Dropdown liên kết

Báo cáo

  • • Giá trị tồn kho
  • • Hàng bán chạy/chậm
  • • Biến động nhập/xuất
  • • Tồn kho theo danh mục
  • • Hàng sắp hết/tồn lâu

Sheet 1: Danh mục sản phẩm (Master Data)

Đây là sheet chứa thông tin gốc của tất cả sản phẩm. Các sheet khác sẽ tham chiếu đến sheet này.

Cấu trúc cột

Cột Tên trường Kiểu dữ liệu Mô tả Ví dụ
A Mã SP Text Mã định danh duy nhất SP001
B Tên sản phẩm Text Tên đầy đủ Áo thun nam trắng L
C Danh mục Text (Dropdown) Nhóm sản phẩm Áo
D Đơn vị tính Text (Dropdown) Cái, Hộp, Kg... Cái
E Giá nhập Number Giá vốn/đơn vị 120,000
F Giá bán Number Giá bán lẻ 250,000
G Tồn tối thiểu Number Mức cảnh báo 10
H Vị trí kho Text Kệ/Tầng/Vị trí A1-02-05
I Ghi chú Text Thông tin thêm Hàng mùa hè

Công thức tự động tạo Mã SP

// Ô A2 (tự động tạo mã SP001, SP002, SP003...)
=IF(B2="","","SP"&TEXT(ROW()-1,"000"))

Sheet 2: Phiếu nhập kho

Ghi nhận mỗi lần nhập hàng vào kho từ nhà cung cấp hoặc chuyển kho nội bộ.

Cấu trúc cột

Cột Tên trường Công thức / Validation
A Mã phiếu nhập =IF(B2="","","NK"&TEXT(ROW()-1,"0000"))
B Ngày nhập Date validation
C Mã SP Dropdown từ sheet Sản phẩm
D Tên SP =VLOOKUP(C2,'Sản phẩm'!A:B,2,FALSE)
E Số lượng Number > 0
F Đơn giá nhập =VLOOKUP(C2,'Sản phẩm'!A:E,5,FALSE)
G Thành tiền =E2*F2
H Nhà cung cấp Dropdown danh sách NCC
I Người nhập Text
J Ghi chú Text

Sheet 3: Phiếu xuất kho

Tương tự phiếu nhập nhưng ghi nhận hàng xuất khỏi kho (bán hàng, trả NCC, hủy...).

Cột Tên trường Công thức / Validation
A Mã phiếu xuất =IF(B2="","","XK"&TEXT(ROW()-1,"0000"))
B Ngày xuất Date
C Mã SP Dropdown từ Sản phẩm
D Tên SP =VLOOKUP(C2,'Sản phẩm'!A:B,2,FALSE)
E Số lượng Number > 0
F Đơn giá bán =VLOOKUP(C2,'Sản phẩm'!A:F,6,FALSE)
G Thành tiền =E2*F2
H Lý do xuất Dropdown: Bán hàng / Trả NCC / Hủy / Khác
I Khách hàng Text

Sheet 4: Tồn kho (Realtime)

Sheet quan trọng nhất - hiển thị tồn kho hiện tại của từng sản phẩm, tính tự động từ phiếu nhập/xuất.

Công thức tính tồn kho

// Cột A: Mã SP (copy từ sheet Sản phẩm)
// Cột B: Tên SP
=VLOOKUP(A2,'Sản phẩm'!A:B,2,FALSE)

// Cột C: Tổng nhập
=SUMIF('Nhập kho'!C:C,A2,'Nhập kho'!E:E)

// Cột D: Tổng xuất
=SUMIF('Xuất kho'!C:C,A2,'Xuất kho'!E:E)

// Cột E: Tồn kho hiện tại
=C2-D2

// Cột F: Giá vốn/đơn vị
=VLOOKUP(A2,'Sản phẩm'!A:E,5,FALSE)

// Cột G: Giá trị tồn kho
=E2*F2

// Cột H: Tồn tối thiểu
=VLOOKUP(A2,'Sản phẩm'!A:G,7,FALSE)

// Cột I: Trạng thái
=IF(E2<=0,"Hết hàng",IF(E2<=H2,"Sắp hết","Bình thường"))

// Cột J: Nhập gần nhất
=IFERROR(MAXIFS('Nhập kho'!B:B,'Nhập kho'!C:C,A2),"")

Conditional Formatting cho cột Trạng thái

Thiết lập tô màu tự động:

  • 1. Chọn cột I (Trạng thái) → Format → Conditional formatting
  • 2. Thêm 3 quy tắc:
    • Text = "Hết hàng" → Background đỏ nhạt + Text đỏ đậm
    • Text = "Sắp hết" → Background vàng nhạt + Text vàng đậm
    • Text = "Bình thường" → Background xanh nhạt + Text xanh đậm

Sheet 5: Dashboard báo cáo

Sheet tổng hợp các chỉ số quan trọng bằng biểu đồ và con số KPI.

Các KPI chính

// Tổng SKU đang kinh doanh
=COUNTA('Sản phẩm'!A2:A)

// Tổng giá trị tồn kho
=SUM('Tồn kho'!G:G)

// Số SP hết hàng
=COUNTIF('Tồn kho'!I:I,"Hết hàng")

// Số SP sắp hết
=COUNTIF('Tồn kho'!I:I,"Sắp hết")

// Tổng nhập tháng này
=SUMPRODUCT(('Nhập kho'!B2:B>=DATE(YEAR(TODAY()),MONTH(TODAY()),1))
 *('Nhập kho'!G2:G))

// Tổng xuất tháng này
=SUMPRODUCT(('Xuất kho'!B2:B>=DATE(YEAR(TODAY()),MONTH(TODAY()),1))
 *('Xuất kho'!G2:G))

// Top 5 SP bán chạy tháng này (dùng QUERY)
=QUERY('Xuất kho'!C:E,
 "SELECT C, SUM(E) WHERE B >= date '"
 &TEXT(DATE(YEAR(TODAY()),MONTH(TODAY()),1),"yyyy-MM-dd")
 &"' GROUP BY C ORDER BY SUM(E) DESC LIMIT 5")

Biểu đồ Dashboard

4 biểu đồ nên có:

1. Pie Chart

Tồn kho theo danh mục sản phẩm

2. Bar Chart

Top 10 sản phẩm tồn kho nhiều nhất

3. Line Chart

Nhập - Xuất - Tồn theo tháng

4. Stacked Bar

Tỷ lệ trạng thái: Bình thường / Sắp hết / Hết

Tự động hóa với Apps Script

Nâng cấp hệ thống kho hàng lên level cao hơn với Apps Script tự động hóa.

Script 1: Cảnh báo hàng sắp hết qua email

/**
 * Kiểm tra tồn kho và gửi email cảnh báo
 * Đặt trigger chạy mỗi ngày lúc 8h sáng
 */
function checkLowStock() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var stockSheet = ss.getSheetByName("Tồn kho");
  var data = stockSheet.getDataRange().getValues();

  var lowStockItems = [];
  var outOfStockItems = [];

  // Bỏ hàng tiêu đề
  for (var i = 1; i < data.length; i++) {
    var maSP = data[i][0];
    var tenSP = data[i][1];
    var tonKho = data[i][4]; // Cột E
    var tonToiThieu = data[i][7]; // Cột H
    var trangThai = data[i][8]; // Cột I

    if (trangThai === "Hết hàng") {
      outOfStockItems.push({ ma: maSP, ten: tenSP, ton: tonKho });
    } else if (trangThai === "Sắp hết") {
      lowStockItems.push({ ma: maSP, ten: tenSP, ton: tonKho, min: tonToiThieu });
    }
  }

  // Chỉ gửi email nếu có hàng cần cảnh báo
  if (outOfStockItems.length === 0 && lowStockItems.length === 0) return;

  var html = '
' + '

⚠️ Cảnh báo tồn kho

' + '

Ngày: ' + Utilities.formatDate(new Date(), "Asia/Ho_Chi_Minh", "dd/MM/yyyy") + '

'; if (outOfStockItems.length > 0) { html += '

🔴 Hết hàng (' + outOfStockItems.length + ' SP):

' + '' + ''; outOfStockItems.forEach(function(item) { html += '' + '' + ''; }); html += '
Tên SPTồn
' + item.ma + '' + item.ten + '' + item.ton + '
'; } if (lowStockItems.length > 0) { html += '

🟡 Sắp hết (' + lowStockItems.length + ' SP):

' + '' + ''; lowStockItems.forEach(function(item) { html += '' + '' + '' + ''; }); html += '
Tên SPTồnTối thiểu
' + item.ma + '' + item.ten + '' + item.ton + '' + item.min + '
'; } html += '

Mở file quản lý kho

'; GmailApp.sendEmail( "admin@company.com", "⚠️ Cảnh báo tồn kho - " + (outOfStockItems.length + lowStockItems.length) + " SP cần chú ý", "", { htmlBody: html } ); }

Script 2: Menu tùy chỉnh cho quản lý kho

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Quản lý kho')
    .addItem('Nhập hàng nhanh', 'quickImport')
    .addItem('Xuất hàng nhanh', 'quickExport')
    .addSeparator()
    .addItem('Kiểm tra tồn kho', 'checkLowStock')
    .addItem('Báo cáo tháng', 'monthlyReport')
    .addItem('Xuất PDF báo cáo', 'exportReport')
    .addToUi();
}

/**
 * Dialog nhập hàng nhanh
 */
function quickImport() {
  var ui = SpreadsheetApp.getUi();
  var maSP = ui.prompt('Nhập mã sản phẩm:').getResponseText();
  if (!maSP) return;

  var soLuong = ui.prompt('Nhập số lượng:').getResponseText();
  if (!soLuong || isNaN(soLuong)) return;

  var nhapKho = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Nhập kho");
  var lastRow = nhapKho.getLastRow() + 1;

  nhapKho.getRange(lastRow, 2).setValue(new Date()); // Ngày
  nhapKho.getRange(lastRow, 3).setValue(maSP);       // Mã SP
  nhapKho.getRange(lastRow, 5).setValue(parseInt(soLuong)); // Số lượng

  ui.alert('Đã nhập ' + soLuong + ' đơn vị SP: ' + maSP);
}

/**
 * Dialog xuất hàng nhanh
 */
function quickExport() {
  var ui = SpreadsheetApp.getUi();
  var maSP = ui.prompt('Nhập mã sản phẩm:').getResponseText();
  if (!maSP) return;

  // Kiểm tra tồn kho trước khi xuất
  var stockSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tồn kho");
  var stockData = stockSheet.getDataRange().getValues();
  var currentStock = 0;
  for (var i = 1; i < stockData.length; i++) {
    if (stockData[i][0] === maSP) {
      currentStock = stockData[i][4];
      break;
    }
  }

  var soLuong = ui.prompt('Tồn kho hiện tại: ' + currentStock + '\nNhập số lượng xuất:').getResponseText();
  if (!soLuong || isNaN(soLuong)) return;

  if (parseInt(soLuong) > currentStock) {
    ui.alert('Lỗi: Số lượng xuất (' + soLuong + ') vượt quá tồn kho (' + currentStock + ')!');
    return;
  }

  var xuatKho = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Xuất kho");
  var lastRow = xuatKho.getLastRow() + 1;

  xuatKho.getRange(lastRow, 2).setValue(new Date());
  xuatKho.getRange(lastRow, 3).setValue(maSP);
  xuatKho.getRange(lastRow, 5).setValue(parseInt(soLuong));
  xuatKho.getRange(lastRow, 8).setValue("Bán hàng");

  ui.alert('Đã xuất ' + soLuong + ' đơn vị SP: ' + maSP + '\nTồn kho còn: ' + (currentStock - parseInt(soLuong)));
}

Script 3: Báo cáo tồn kho cuối tháng

/**
 * Tạo báo cáo tồn kho cuối tháng và gửi email
 */
function monthlyReport() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var stockSheet = ss.getSheetByName("Tồn kho");
  var data = stockSheet.getDataRange().getValues();

  var totalSKU = data.length - 1;
  var totalValue = 0;
  var outOfStock = 0;
  var lowStock = 0;

  for (var i = 1; i < data.length; i++) {
    totalValue += data[i][6] || 0; // Giá trị tồn
    if (data[i][8] === "Hết hàng") outOfStock++;
    if (data[i][8] === "Sắp hết") lowStock++;
  }

  var month = Utilities.formatDate(new Date(), "Asia/Ho_Chi_Minh", "MM/yyyy");

  var report = '📦 BÁO CÁO TỒN KHO THÁNG ' + month + '\n\n'
    + '📊 Tổng SKU: ' + totalSKU + '\n'
    + '💰 Giá trị tồn: ' + formatVND(totalValue) + '\n'
    + '🔴 Hết hàng: ' + outOfStock + ' SP\n'
    + '🟡 Sắp hết: ' + lowStock + ' SP\n'
    + '🟢 Bình thường: ' + (totalSKU - outOfStock - lowStock) + ' SP';

  // Hiển thị trong Sheets
  SpreadsheetApp.getUi().alert(report);
}

function formatVND(amount) {
  return new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' }).format(amount);
}

Mẹo tối ưu hệ thống kho

1

Đặt tên sheet rõ ràng

Dùng tên tiếng Việt không dấu hoặc có dấu nhất quán. VD: "Sản phẩm", "Nhập kho", "Xuất kho".

2

Bảo vệ sheet quan trọng

Lock sheet "Tồn kho" và "Dashboard" (chỉ chứa công thức). Chỉ mở chỉnh sửa cho "Nhập kho" và "Xuất kho".

3

Dùng Data Validation

Tạo dropdown cho Mã SP, Danh mục, Đơn vị, Lý do xuất. Giảm sai sót nhập liệu.

4

Freeze hàng tiêu đề

View → Freeze → 1 row. Tiêu đề luôn hiển thị khi cuộn xuống dữ liệu dài.

5

Barcode/QR Code

Dùng add-on "Barcode Generator" để tạo barcode từ Mã SP. In ra dán lên sản phẩm cho kiểm kho nhanh.

6

Kiểm kho định kỳ

Tạo sheet "Kiểm kê" riêng, so sánh tồn kho hệ thống vs thực tế. Làm mỗi tháng/quý.

Khi nào nên chuyển sang phần mềm chuyên dụng?

Google Sheets quản lý kho rất tốt cho doanh nghiệp nhỏ, nhưng đến một ngưỡng nhất định, bạn nên cân nhắc phần mềm chuyên dụng:

Tiêu chí Google Sheets Phần mềm chuyên dụng
Số SKU Dưới 500 Trên 500
Số kho 1-2 kho Trên 3 kho
Giao dịch/ngày Dưới 50 Trên 50
Người dùng 1-5 người Trên 5 người
Tính năng Cơ bản + Apps Script Barcode scan, multi-kho, phân quyền chi tiết
Chi phí Miễn phí 300K-2M/tháng

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

Nhiều người cùng nhập liệu có bị xung đột không?

Google Sheets hỗ trợ đa người dùng realtime. Mỗi người thấy con trỏ của người khác và thay đổi cập nhật tức thì. Tuy nhiên nếu 2 người sửa cùng 1 ô, thay đổi cuối cùng sẽ ghi đè. Giải pháp: phân công mỗi người nhập ở sheet riêng (Nhập kho / Xuất kho).

Có thể quản lý nhiều kho hàng không?

Có. Thêm cột "Kho" vào phiếu nhập/xuất, rồi dùng SUMIFS thay SUMIF để tính tồn kho theo từng kho. Hoặc tạo file Sheets riêng cho mỗi kho rồi dùng IMPORTRANGE tổng hợp.

Dữ liệu có an toàn không? Lỡ xóa nhầm thì sao?

An toàn. Google Sheets tự động lưu version history (File → Version history). Bạn có thể khôi phục bất kỳ phiên bản nào trong 30 ngày. Kết hợp Apps Script backup tự động (script ở trên) để thêm an toàn.

Google Sheets chứa được tối đa bao nhiêu dòng?

10 triệu ô. Với 10 cột, bạn có thể lưu ~1 triệu dòng. Tuy nhiên trên 50K dòng, Sheets sẽ chậm. Giải pháp: Archive dữ liệu cũ sang file khác, chỉ giữ 6-12 tháng gần nhất trong file chính.

Có thể quét barcode nhập liệu không?

Có. Dùng điện thoại cài app Google Sheets + bàn phím barcode scanner (bluetooth). Khi quét, mã barcode tự nhập vào ô đang chọn. Hoặc dùng add-on "Barcode Scanner" cho Google Sheets.

Tổng kết

Với 5 sheet và vài Apps Script, bạn đã có một hệ thống quản lý kho hoàn chỉnh trên Google Sheets:

  • Nhập/xuất kho có kiểm soát với dropdown và validation

  • Tồn kho realtime tính tự động, tô màu theo trạng thái

  • Cảnh báo tự động khi hàng sắp hết qua email

  • Dashboard báo cáo tổng giá trị tồn, hàng bán chạy

  • Hoàn toàn miễn phí và dễ tùy chỉnh theo nhu cầu

Cần hệ thống quản lý kho chuyên nghiệp hơn?

SheetStore cung cấp phần mềm quản lý bán hàng tích hợp Google Sheets với quản lý kho đa kho, barcode, và đồng bộ realtime.

Truy cập sheet.com.vn để dùng thử miễn phí.

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