
Bạn hoàn toàn có thể dùng AppSheet quản lý kho mà không cần biết lập trình: chuẩn bị một file Google Sheet gồm 4 tab (sản phẩm, kho, phiếu, chi tiết phiếu), kết nối vào AppSheet, khai báo kiểu cột, rồi thêm một cột ảo tính tồn = tổng nhập trừ tổng xuất. Sau khoảng một buổi làm, thủ kho đã có app trên điện thoại để lập phiếu nhập, phiếu xuất, quét mã vạch và xem tồn thực tế. Bài này tôi đi từng bước, kèm công thức cụ thể để bạn copy, và nói thẳng cả những chỗ AppSheet làm không tốt.
App quản lý kho bằng AppSheet cần làm được gì?
Một app kho tối thiểu phải làm được 6 việc. Đây là danh sách tôi hay dùng để chốt phạm vi với chủ doanh nghiệp trước khi bắt tay vào dựng:
- Nhập kho: lập phiếu nhập, chọn nhiều sản phẩm trong một phiếu, ghi số lượng và đơn giá.
- Xuất kho: lập phiếu xuất cho đơn hàng, cho sản xuất hoặc chuyển kho.
- Xem tồn: tồn tổng của từng sản phẩm và tồn theo từng kho/chi nhánh.
- Quét mã vạch: dùng camera điện thoại thay cho gõ mã sản phẩm.
- Cảnh báo sắp hết: danh sách sản phẩm có tồn nhỏ hơn hoặc bằng mức tối thiểu.
- Báo cáo nhập – xuất – tồn: xem theo khoảng ngày, theo kho, xuất ra để gửi sếp.
Nếu nhu cầu của bạn chỉ dừng ở 6 việc này, AppSheet là lựa chọn rất hợp lý. Nếu bạn cần thêm quản lý theo lô – hạn sử dụng, theo serial từng máy, hay tính giá vốn bình quân tự động cho kế toán, hãy đọc hết phần cuối bài trước khi quyết định.
Chuẩn bị file Google Sheet quản lý kho
Cấu trúc dữ liệu quyết định 80% chất lượng app. Tôi luôn tách thành 4 tab trong cùng một file Google Sheet, mỗi tab một bảng, dòng 1 là tên cột (không gộp ô, không để dòng tiêu đề trang trí phía trên).
| Tab | Các cột | Vai trò |
|---|---|---|
SanPham | MaSP, TenSP, DVT, TonToiThieu, Anh | Danh mục hàng hoá |
Kho | MaKho, TenKho | Danh sách kho/chi nhánh |
Phieu | MaPhieu, Loai, Ngay, MaKho, NguoiTao | Đầu phiếu nhập hoặc xuất |
ChiTietPhieu | MaCT, MaPhieu, MaSP, SoLuong, DonGia | Các dòng hàng trong phiếu |
Hãy nhập sẵn 3 dòng mẫu cho mỗi tab. AppSheet đọc dữ liệu mẫu để đoán kiểu cột, nếu tab trống thì nó đoán sai hết. Ví dụ một cửa hàng vật liệu xây dựng ở Bình Dương: SanPham có "SP001 – Xi măng PCB40 – Bao – 50", Kho có "K01 – Kho chính" và "K02 – Kho công trình", Phieu có một dòng "PN0001 – Nhap – 01/10/2026 – K01 – anh Tuấn".
Lưu ý quan trọng: không tạo cột "Tồn" trong tab SanPham rồi tự cộng trừ bằng công thức Sheet. Khi nhiều người cùng dùng app, công thức Sheet và AppSheet sẽ ghi đè lẫn nhau. Tồn sẽ được tính trong AppSheet ở bước sau. Nếu bạn muốn hiểu sâu hơn về cách bố trí bảng và quan hệ, tôi có viết riêng một bài về thiết kế database quản lý kho.

Thiết lập bảng và kiểu cột trong AppSheet
Sau khi tạo app từ file Google Sheet, việc đầu tiên là vào mục cấu hình bảng và khai báo đúng kiểu cột. Đây là phần người mới hay bỏ qua rồi sau đó app chạy sai.
Khoá chính và cột Ref
- Key: MaSP cho SanPham, MaKho cho Kho, MaPhieu cho Phieu, MaCT cho ChiTietPhieu. Mỗi bảng đúng một khoá, không trùng.
- Ref: cột
MaPhieutrong ChiTietPhieu đặt type Ref trỏ về bảng Phieu; cộtMaSPtrong ChiTietPhieu đặt Ref trỏ về SanPham; cộtMaKhotrong Phieu đặt Ref trỏ về Kho.
Khi đặt Ref từ ChiTietPhieu về Phieu, AppSheet tự sinh cột ảo Related ChiTietPhieus trong bảng Phieu. Đây chính là thứ cho phép bạn nhập nhiều dòng hàng ngay trong form phiếu.
Enum, ảnh và mã tự sinh
- Cột
Loaitrong Phieu: type Enum, hai giá trịNhapvàXuat. Nên dùng giá trị không dấu để viết công thức cho gọn, phần hiển thị tiếng Việt chỉnh ở Display name. - Cột
Anhtrong SanPham: type Image. Ảnh chụp từ điện thoại sẽ lưu vào thư mục Drive của app. - Mã tự sinh: đặt Initial value cho MaCT là
UNIQUEID(). Với MaPhieu, nếu muốn mã dễ đọc kiểu PN/PX, bạn có thể dùng tiền tố theo loại phiếu rồi ghép thêm chuỗi ngẫu nhiên, ví dụCONCATENATE("PN-", UNIQUEID()). Tôi khuyên đừng cố đánh số tăng dần 0001, 0002 — khi hai người cùng tạo phiếu một lúc rất dễ trùng.
AppSheet quản lý tồn kho: dùng cột ảo để tính tồn
Tồn kho nên là cột ảo (virtual column) trong bảng SanPham, tính lại mỗi lần đồng bộ, không lưu vào Sheet. Cách này luôn cho số đúng vì nó cộng trực tiếp từ các dòng chi tiết phiếu.
Tạo cột ảo tên Ton, type Number, với App formula:
SUM(SELECT(ChiTietPhieu[SoLuong], AND([MaSP] = [_THISROW].[MaSP], LOOKUP([MaPhieu], "Phieu", "MaPhieu", "Loai") = "Nhap"))) - SUM(SELECT(ChiTietPhieu[SoLuong], AND([MaSP] = [_THISROW].[MaSP], LOOKUP([MaPhieu], "Phieu", "MaPhieu", "Loai") = "Xuat")))
Đọc công thức này bằng tiếng Việt: lấy tất cả số lượng trong ChiTietPhieu, lọc ra những dòng có mã sản phẩm trùng với sản phẩm đang xét và thuộc phiếu loại "Nhap", cộng lại; rồi trừ đi phần tương tự của phiếu loại "Xuat". LOOKUP ở đây dùng để nhìn sang bảng Phieu lấy giá trị cột Loai.
Tồn theo từng kho
Nếu công ty bạn có nhiều kho, tồn tổng là chưa đủ — thủ kho K02 cần biết K02 còn bao nhiêu. Cách tôi hay làm là thêm một tab TonTheoKho trong Sheet, mỗi dòng là một cặp sản phẩm – kho (MaDong, MaSP, MaKho), rồi tạo cột ảo tính tương tự nhưng thêm một điều kiện vào trong AND(...): LOOKUP([MaPhieu], "Phieu", "MaPhieu", "MaKho") = [_THISROW].[MaKho].
Nhược điểm cần biết trước
Cột ảo kiểu SELECT lồng LOOKUP chạy trên từng dòng sản phẩm. Với 200 mã hàng và vài nghìn dòng chi tiết phiếu thì mượt. Khi chi tiết phiếu lên đến vài chục nghìn dòng, mỗi lần mở app sẽ thấy rõ độ trễ. Đây là giới hạn thật của cách làm này, không phải lỗi cấu hình — phần cuối bài tôi nói cách xử lý.
Giao diện: form phiếu, quét mã vạch, danh sách sắp hết
Giao diện tốt cho kho là giao diện bấm được bằng một tay, trong lúc tay kia còn đang cầm hàng. Ba thứ cần làm:
- Form phiếu kèm chi tiết inline: mở view dạng Form của bảng Phieu, kéo cột
Related ChiTietPhieusvào form và chọn hiển thị inline. Thủ kho chọn loại phiếu, chọn kho, rồi bấm "Add" để thêm từng dòng hàng ngay trong phiếu. - Bật quét mã vạch: vào cột
MaSPcủa bảng ChiTietPhieu, bật tuỳ chọn Scannable. Khi đó ô nhập mã sẽ có biểu tượng camera, quét mã vạch trên thùng hàng là app tự điền mã. Điều kiện là mã vạch dán trên hàng phải trùng với MaSP trong bảng SanPham — nếu dùng mã nhà sản xuất, hãy thêm một cột Barcode riêng trong SanPham và cho quét vào cột đó. - Danh sách sắp hết: tạo một Slice trên bảng SanPham tên
SapHet, Row filter condition là[Ton] <= [TonToiThieu], rồi tạo một view dạng Deck từ slice này. Thủ kho mở app là thấy ngay cần nhập gì.
Cuối cùng, gom lại thành một view dạng Dashboard: bên trái là danh sách sắp hết, bên phải là các phiếu gần nhất. Đây là màn hình mặc định khi thủ kho mở app.
Chặn xuất âm kho và phân quyền theo kho
Không chặn xuất âm thì sớm muộn sổ sách cũng lệch. AppSheet xử lý việc này bằng Valid If ở cột SoLuong trong bảng ChiTietPhieu:
OR(LOOKUP([MaPhieu], "Phieu", "MaPhieu", "Loai") = "Nhap", [SoLuong] <= LOOKUP([MaSP], "SanPham", "MaSP", "Ton"))
Nghĩa là: nếu là phiếu nhập thì cho nhập số lượng bất kỳ; nếu là phiếu xuất thì số lượng không được vượt tồn hiện có. Nhớ điền thêm phần Invalid value error một câu tiếng Việt như "Số lượng xuất vượt quá tồn kho hiện có" để nhân viên hiểu vì sao bị chặn.
Một điểm tôi muốn nói thật: ràng buộc này kiểm tra tồn tại thời điểm nhập liệu trên máy đó. Nếu hai người cùng xuất một mã hàng trong lúc máy chưa đồng bộ, vẫn có khả năng âm nhẹ. Với kho nhỏ, vài người dùng thì hiếm khi xảy ra; với kho đông người thao tác đồng thời, bạn cần kiểm kê định kỳ để bù.
Phân quyền và khoá phiếu đã chốt
- Security filter: thêm bảng
NhanVien(Email, HoTen, MaKho) rồi đặt security filter cho bảng Phieu là[MaKho] = LOOKUP(USEREMAIL(), "NhanVien", "Email", "MaKho"). Mỗi thủ kho chỉ tải về và chỉ thấy phiếu kho mình. - Editable If: thêm cột
TrangThai(Enum: Nhap lieu / Da chot) vào bảng Phieu. Ở bảng ChiTietPhieu, đặt Editable If làLOOKUP([MaPhieu], "Phieu", "MaPhieu", "TrangThai") <> "Da chot". Phiếu đã chốt thì không ai sửa được số lượng nữa.
Tự động hoá: cảnh báo sắp hết và báo cáo cuối ngày
Phần Automation của AppSheet cho phép app tự gửi email mà không cần người nhớ. Hai bot tôi hay dựng cho app kho:
- Bot cảnh báo tồn thấp: Event là khi có dòng mới được thêm vào ChiTietPhieu, Condition kiểm tra sản phẩm đó có tồn nhỏ hơn hoặc bằng TonToiThieu hay không, Task là gửi email cho người phụ trách mua hàng. Ưu điểm là cảnh báo đúng lúc vừa xuất xong.
- Bot báo cáo cuối ngày: Event dạng Schedule chạy hằng ngày vào giờ cố định, Task gửi email đính kèm bảng tồn hiện tại cho quản lý. Cách này nhẹ hơn và không làm phiền người nhận nhiều lần trong ngày.
Lưu ý: số lượng thao tác tự động hoá mỗi tháng và một số tính năng phụ thuộc vào gói bạn đang dùng. AppSheet tính phí theo số người dùng mỗi tháng và chính sách này thay đổi theo thời gian, nên trước khi cam kết với sếp, bạn nên kiểm tra tài liệu chính thức của AppSheet thay vì tin một con số đọc được ở đâu đó.
Hạn chế của AppSheet với kho lớn và khi nào nên chuyển
AppSheet không phải lời giải cho mọi quy mô kho. Ba giới hạn thực tế tôi gặp nhiều nhất:
- Google Sheet nhiều dòng thì đồng bộ chậm. Sheet là file, mỗi lần sync app phải đọc lại dữ liệu. Chi tiết phiếu tăng theo thời gian và không bao giờ giảm.
- Cột ảo nặng. Càng nhiều cột ảo dùng SELECT, thời gian mở app càng lâu. Giải pháp tạm: lưu dữ liệu cũ sang file khác và chỉ giữ dữ liệu năm hiện tại trong file đang chạy.
- Chi phí tăng theo số người dùng. App càng được dùng rộng, phí hằng tháng càng lớn — đây là điều cần tính từ đầu chứ không phải phát sinh.
| Lựa chọn | Hợp khi | Nhược điểm |
|---|---|---|
| AppSheet + Google Sheet | Dưới ~50 mã hàng đến vài trăm mã, vài người dùng, quy trình riêng, muốn tự sửa app | Chậm khi dữ liệu lớn, phí theo người dùng |
| AppSheet + cơ sở dữ liệu SQL | Giữ nguyên app và quy trình riêng nhưng dữ liệu đã nhiều chục nghìn dòng | Cần người biết SQL, tốn thêm chi phí máy chủ |
| Phần mềm kho chuyên dụng | Cần lô – hạn dùng, serial, giá vốn bình quân, kết nối hoá đơn điện tử, kế toán | Khó sửa theo quy trình riêng, phải làm theo cách của phần mềm |
Nói cho công bằng: nếu nghiệp vụ kho của bạn là nghiệp vụ chuẩn — hàng hoá thương mại, cần xuất hoá đơn, cần ghép với kế toán — thì một phần mềm kho có sẵn sẽ nhanh và rẻ hơn tự dựng. AppSheet thắng ở chỗ ngược lại: khi quy trình của bạn đặc thù (ví dụ kho nguyên liệu của xưởng may, mỗi lần xuất phải ghi kèm mã đơn hàng và chuyền sản xuất) và không phần mềm sẵn nào vừa. Tôi có bàn kỹ hơn chuyện này trong bài dùng Google Sheet làm database: khi nào ổn, khi nào phải chuyển.
Tóm tắt và bước tiếp theo
Tổng kết lại các bước để có một file AppSheet quản lý kho chạy được:
- Tạo file Google Sheet 4 tab: SanPham, Kho, Phieu, ChiTietPhieu, mỗi tab 3 dòng mẫu.
- Kết nối AppSheet, khai báo Key, Ref, Enum Loai, cột Image.
- Thêm cột ảo
Tonbằng công thức SUM(SELECT(...)) nhập trừ xuất. - Dựng form phiếu có chi tiết inline, bật Scannable cho mã sản phẩm.
- Tạo slice
SapHetvới điều kiện[Ton] <= [TonToiThieu]và một dashboard cho thủ kho. - Thêm Valid If chặn xuất âm, security filter theo kho, Editable If khoá phiếu đã chốt.
- Dựng bot cảnh báo tồn thấp và báo cáo cuối ngày.
Việc nên làm ngay hôm nay: mở Google Sheet, dựng đúng 4 tab ở trên với dữ liệu thật của 10 mã hàng bán chạy nhất, rồi thử tạo một phiếu nhập và một phiếu xuất. Nếu con số tồn ra đúng với kho thực tế, phần còn lại chỉ là trang trí. Nếu bạn mới làm quen với nền tảng này, đọc trước AppSheet là gì và cách biến Google Sheet thành app, sau đó tham khảo lộ trình học AppSheet từ cơ bản đến nâng cao để đi tiếp.
Nếu bạn muốn làm bài bản hơn với kiểm kê hàng loạt, in phiếu PDF và dashboard, 5F Edu có lớp xây app quản lý kho và kiểm kê bằng AppSheet đi theo đúng mạch nội dung bài này.
Câu hỏi thường gặp
›File AppSheet quản lý kho có dùng cho nhiều kho được không?
Được, miễn là bạn có bảng Kho và cột MaKho trong bảng Phieu. Tồn khi đó tính theo từng cặp sản phẩm – kho bằng cách thêm điều kiện lọc MaKho vào công thức cột ảo. Bạn cũng nên bật security filter để mỗi thủ kho chỉ thấy phiếu của kho mình.
›AppSheet có quét mã vạch bằng điện thoại không?
Có. Bạn vào cấu hình cột chứa mã sản phẩm và bật tuỳ chọn Scannable, ô nhập liệu sẽ xuất hiện biểu tượng camera để quét. Điều kiện là mã vạch dán trên hàng phải trùng với giá trị trong bảng sản phẩm; nếu dùng mã của nhà sản xuất thì nên tạo thêm một cột Barcode riêng.
›Làm sao không cho xuất quá số tồn?
Đặt Valid If cho cột số lượng trong bảng chi tiết phiếu, với điều kiện: nếu phiếu là loại Nhap thì cho qua, nếu là Xuat thì số lượng phải nhỏ hơn hoặc bằng tồn hiện có. Nhớ viết câu báo lỗi tiếng Việt để nhân viên hiểu. Lưu ý ràng buộc này kiểm tra tồn tại thời điểm nhập liệu nên vẫn cần kiểm kê định kỳ.
›Dữ liệu nhiều thì app có chậm không?
Có. Google Sheet là file nên mỗi lần đồng bộ app phải đọc lại dữ liệu, và các cột ảo dùng SELECT phải tính lại trên từng dòng. Với vài trăm mã hàng và vài nghìn dòng chi tiết phiếu thì vẫn mượt; khi lên vài chục nghìn dòng bạn nên tách dữ liệu cũ sang file khác hoặc chuyển nguồn sang cơ sở dữ liệu SQL.
›Tôi có cần biết lập trình để dựng app kho bằng AppSheet không?
Không cần biết ngôn ngữ lập trình, nhưng bạn phải quen với tư duy bảng dữ liệu và viết được công thức kiểu Excel nâng cao như SELECT, LOOKUP, AND. Nếu bạn dùng tốt SUMIFS và VLOOKUP trong Google Sheet thì học AppSheet khá nhanh.
Tác giả
Chuyên gia chuyển đổi số · Đại diện 5F Edu
Hơn 8 năm triển khai và tư vấn chuyển đổi số cho doanh nghiệp vừa và nhỏ: chuẩn hoá quy trình, xây phần mềm quản lý bằng AppSheet và web app, tự động hoá bằng N8N. Người làm kênh YouTube Nghiện AppSheet.



