Tạo Hệ Thống Quản Lý Kho Hàng Hoàn Chỉnh Trên Google Sheets [Template Miễn Phí]
![Tạo Hệ Thống Quản Lý Kho Hàng Hoàn Chỉnh Trên Google Sheets [Template Miễn Phí]](/images/blog/quan-ly-kho-hang-google-sheets.png)
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):
'
+ ''
+ 'Mã Tên SP Tồn ';
outOfStockItems.forEach(function(item) {
html += '' + item.ma + ' '
+ '' + item.ten + ' '
+ '' + item.ton + ' ';
});
html += '
';
}
if (lowStockItems.length > 0) {
html += '🟡 Sắp hết (' + lowStockItems.length + ' SP):
'
+ ''
+ 'Mã Tên SP Tồn Tối thiểu ';
lowStockItems.forEach(function(item) {
html += '' + item.ma + ' '
+ '' + item.ten + ' '
+ '' + item.ton + ' '
+ '' + item.min + ' ';
});
html += '
';
}
html += '';
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
Đặ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".
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".
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.
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.
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.
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í.
📚 Bài Viết Liên Quan
- Template Google Sheets Báo Cáo Bán Hàng Theo Vùng và Đại Lý 2027: Phân Tích Đa Chiều
- Google Sheets Nâng Cao Bài 9: Bảo Mật, Phân Quyền và Chia Sẻ Chuyên Nghiệp
- Google Sheets Nâng Cao Bài 4: Hàm QUERY - Lọc và Phân Tích Dữ Liệu Chuyên Nghiệp
- Template Google Sheets Quản Lý Phòng Khám và Bệnh Viện Nhỏ 2027
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.