Tính Tồn Kho FIFO: Công Thức Hay Apps Script? (2026)
Mục lục:
- 1. Cuối tháng đóng sổ, số tồn kho trên sheet lệch với số đếm tay
- 2. Công thức thuần làm được gì, và nó gãy ở đâu
- 3. Khi nào Apps Script mới thực sự đáng viết
- 4. Cái giá thật của Apps Script mà ít người nói
- 5. Bảng so sánh để tự quyết định nhanh
- 6. Cách kết hợp cả hai thay vì chọn một
- 7. Vài lỗi thường gặp khi tự dựng FIFO trên Sheets
- 8. Dấu hiệu cho thấy đã đến lúc cần chuyển hẳn sang giải pháp có sẵn
- 9. Câu hỏi thường gặp
Cuối tháng đóng sổ, số tồn kho trên sheet lệch với số đếm tay
Chị chủ shop mỹ phẩm ở quận Bình Thạnh nhắn tin lúc 11 giờ đêm: "Em ơi, sao sheet báo còn 47 chai serum mà kiểm kho chỉ có 31, mất tiêu 16 chai mà không biết bán giá nào để tính lời lỗ." Đây không phải lỗi thất thoát hàng — đây là lỗi tính giá vốn theo phương pháp FIFO (nhập trước xuất trước) sai ngay từ công thức.
Vấn đề nằm ở chỗ: khi một lô hàng nhập với giá 85.000đ/chai, lô sau nhập giá 92.000đ/chai, và khách mua lắt nhắt suốt tháng — công thức trung bình cộng (AVERAGE hoặc SUMPRODUCT chia SUM) sẽ cho ra giá vốn sai lệch, kéo theo lợi nhuận báo cáo sai theo. Với ngành có biên lợi nhuận mỏng như mỹ phẩm, thực phẩm chức năng hay đồ handmade, sai 5-7% giá vốn là đủ để một tháng tưởng lãi hóa ra lỗ.
Bài này không bàn lý thuyết FIFO là gì — hầu hết người quản lý shop đều đã hiểu nguyên lý "vào trước bán trước". Cái cần bàn là: nên dùng công thức Google Sheets thuần hay viết Apps Script để tính, và ranh giới thực tế giữa hai lựa chọn nằm ở đâu.
Công thức thuần làm được gì, và nó gãy ở đâu
Với một sheet quản lý tồn kho đơn giản — mỗi dòng là một lần nhập hàng (ngày, số lượng, đơn giá) và một sheet riêng ghi lần xuất hàng — có thể dựng công thức FIFO bằng kết hợp SUMIF, chạy tổng lũy kế (running total) và một chút ARRAYFORMULA để tính số lượng đã xuất tính đến thời điểm đó, rồi so sánh với số lượng nhập lũy kế của từng lô để xác định lô nào đã "cạn", lô nào đang bị trừ dở.
Cách làm phổ biến nhất là dùng cột phụ tính lũy kế nhập (running sum bằng SUM($B$2:B2)) và lũy kế xuất, sau đó dùng MAX/MIN để cắt ra phần còn lại của mỗi lô. Ví dụ một shop bán đồ handmade nhập 3 lô: lô 1 ngày 1/8 nhập 50 cái giá 40.000đ, lô 2 ngày 10/8 nhập 30 cái giá 45.000đ, lô 3 ngày 20/8 nhập 40 cái giá 48.000đ. Đến 25/8 đã bán 65 cái. Công thức lũy kế sẽ tính: lô 1 xuất hết 50 cái, lô 2 xuất tiếp 15/30 cái — giá vốn của 65 cái đó là (50×40.000 + 15×45.000) = 2.675.000đ, còn lại 15 cái lô 2 và nguyên lô 3 tồn kho.
Công thức này chạy tốt khi số dòng nhập-xuất còn dưới vài trăm và chỉ có một mặt hàng hoặc vài chục SKU. Nhưng nó gãy ở ba điểm cụ thể:
- Khi số SKU tăng lên vài trăm, mỗi SKU cần một bộ công thức lũy kế riêng — sheet phình ra hàng chục nghìn công thức mảng, mỗi lần mở file mất 8-15 giây để tính lại toàn bộ.
- Khi có xuất kho kiểu trả hàng hoặc điều chỉnh ngược (khách trả lại, nhập lại lô cũ), công thức lũy kế đơn giản không xử lý được thứ tự "chèn ngược" — phải viết lại toàn bộ range.
- Khi cần snapshot giá vốn tại một thời điểm cụ thể trong quá khứ (ví dụ tính lại giá vốn tháng trước để đối chiếu thuế), công thức thời gian thực không lưu lại trạng thái cũ — mỗi lần sheet cập nhật, số cũ biến mất.
Đây chính là lúc nhiều chủ shop tưởng mình dùng sai công thức, đi sửa qua sửa lại, trong khi vấn đề thực ra là công thức thuần đã chạm trần khả năng của nó, không phải do viết sai.
Khi nào Apps Script mới thực sự đáng viết
Apps Script giải quyết đúng ba điểm gãy ở trên bằng cách xử lý FIFO như một thuật toán hàng đợi (queue) thực sự: mỗi lô hàng là một object có ngày nhập, số lượng còn lại, đơn giá — script duyệt tuần tự các giao dịch xuất kho, trừ dần vào lô cũ nhất trước, cập nhật số lượng còn lại của từng lô, và ghi log giá vốn ra một sheet riêng. Toàn bộ logic này chạy trong vài trăm mili giây kể cả với vài nghìn dòng giao dịch, vì nó là vòng lặp một lần, không phải công thức mảng tính lại liên tục. Một xưởng may gia công ở Bình Dương mà tôi từng hỗ trợ có khoảng 180 loại vải, mỗi loại nhập 2-4 lần/tháng, xuất hàng ngày cho 6 chuyền may. Với công thức thuần, sheet của họ trước đó mất gần 20 giây để tính lại mỗi lần nhập số liệu mới, và thường xuyên bị lỗi #REF khi chèn thêm dòng. Sau khi chuyển sang Apps Script chạy theo trigger "khi chỉnh sửa" (onEdit) kết hợp trigger theo giờ để tính lại toàn bộ vào cuối ngày, thời gian xử lý giảm còn dưới 2 giây, và họ có thêm khả năng xuất báo cáo giá vốn theo từng chuyền may — thứ mà công thức thuần gần như không làm nổi vì phải join dữ liệu từ 3 sheet khác nhau.
Apps Script cũng là lựa chọn bắt buộc nếu doanh nghiệp cần lưu lịch sử giá vốn bất biến — tức là giá vốn của lô hàng bán ngày 15/8 phải giữ nguyên vĩnh viễn kể cả khi sau này nhập thêm hàng mới, phục vụ đối chiếu kế toán hoặc kiểm toán thuế. Công thức thuần tính động (dynamic) nên không lưu được trạng thái lịch sử; script thì ghi giá trị tĩnh (value) vào ô ngay tại thời điểm giao dịch xảy ra.
Cái giá thật của Apps Script mà ít người nói
Nhiều bài hướng dẫn online chỉ show phần "wow, script chạy nhanh" mà bỏ qua ba cái giá phải trả. Thứ nhất là bảo trì — công thức trong ô, ai mở sheet cũng nhìn thấy và sửa được ngay; script thì nằm trong trình soạn thảo riêng (Extensions > Apps Script), nhân viên kế toán không rành code sẽ không dám đụng vào, mọi thay đổi logic đều phải quay lại tìm người viết ban đầu. Thứ hai là rủi ro khi trigger lỗi âm thầm. Nếu Apps Script dùng trigger tự động (installable trigger) mà gặp lỗi — ví dụ Google Sheets API rate limit, hoặc dữ liệu đầu vào có ô trống bất thường — script có thể dừng chạy mà không ai biết, và sheet vẫn hiển thị số liệu cũ trông có vẻ bình thường. Đây là lỗi nguy hiểm hơn nhiều so với công thức bị lỗi #REF, vì công thức lỗi thì nhìn thấy ngay, còn script lỗi âm thầm thì cả tuần sau mới phát hiện số liệu sai. Thứ ba, và thường bị đánh giá thấp nhất: chi phí thời gian viết và test script FIFO cho đúng không hề nhỏ. Một script FIFO xử lý đúng các trường hợp biên (trả hàng, điều chỉnh tồn kho âm, nhiều đơn vị tính khác nhau cho cùng SKU) thường mất 2-4 ngày để viết và test kỹ, so với vài giờ dựng công thức thuần. Với một shop bán hàng online quy mô 20-30 SKU, doanh thu vài chục triệu/tháng, khoản đầu tư này thường không đáng — công thức thuần đã đủ dùng ít nhất 1-2 năm tới khi quy mô tăng lên.
Bảng so sánh để tự quyết định nhanh
| Tiêu chí | Công thức thuần | Apps Script |
|---|---|---|
| Số SKU đang quản lý | Dưới 50 SKU | Trên 100 SKU hoặc tăng nhanh |
| Tần suất giao dịch | Dưới 20 giao dịch/ngày | Trên 50 giao dịch/ngày |
| Cần lưu lịch sử giá vốn bất biến | Không xử lý được | Xử lý tốt |
| Người bảo trì có biết code | Không cần | Bắt buộc, hoặc thuê ngoài |
| Xử lý trả hàng/điều chỉnh ngược | Phức tạp, dễ sai | Xử lý được nếu viết logic queue đúng |
| Thời gian mở sheet với dữ liệu lớn | Chậm dần theo số dòng | Ổn định vì tính một lần rồi ghi giá trị |
| Chi phí ban đầu | Thấp, tự làm trong 1-2 giờ | Cao, cần 2-4 ngày hoặc thuê dev |
Ranh giới thực tế nằm ở khoảng 50-100 SKU hoặc 30 giao dịch/ngày — dưới ngưỡng này công thức thuần vẫn đủ nhanh và đủ minh bạch để cả người không biết code cũng kiểm tra được; vượt ngưỡng này thì công thức bắt đầu chậm và dễ sai ở các trường hợp biên, lúc đó chuyển sang script là hợp lý.
Cách kết hợp cả hai thay vì chọn một
Thực tế nhiều doanh nghiệp SME không cần chọn hẳn một bên. Cách làm hiệu quả mà tôi thấy nhiều shop áp dụng: dùng Apps Script chạy nền để tính toán FIFO và ghi kết quả (giá vốn, số lượng tồn theo lô) dưới dạng giá trị tĩnh vào một sheet "kết quả", sau đó dùng công thức thuần (SUMIF, QUERY) ở các sheet báo cáo phía trên để tổng hợp, lọc, và trình bày cho người xem không biết code. Cách chia này giữ được tốc độ và độ chính xác của script ở tầng tính toán, đồng thời giữ được sự minh bạch, dễ kiểm tra của công thức ở tầng báo cáo — nhân viên kế toán vẫn có thể click vào ô xem công thức QUERY đang lọc gì mà không cần đụng vào code. Nếu doanh nghiệp có nhiều nguồn dữ liệu nhập kho từ các sheet chi nhánh khác nhau cần đồng bộ về sheet trung tâm trước khi chạy FIFO, có thể tham khảo thêm IMPORTRANGE Hay Apps Script: Nên Dùng Cách Nào Đồng Bộ Sheets 2026 để chọn cách đồng bộ phù hợp trước khi bắt tay tính giá vốn. Vấn đề lựa chọn công thức hay script không chỉ xảy ra với tồn kho FIFO — bài toán tương tự cũng gặp ở tính hoa hồng nhiều bậc cho sales, có thể xem thêm ở Tính Hoa Hồng Nhiều Bậc: Công Thức Hay Apps Script? (2026) để thấy logic đánh giá ngưỡng chuyển đổi khá giống nhau.
Vài lỗi thường gặp khi tự dựng FIFO trên Sheets
Lỗi phổ biến nhất là trộn lẫn đơn vị tính — nhập hàng theo thùng (giá/thùng) nhưng xuất hàng theo cái lẻ, khiến công thức lũy kế tính sai số lượng ngay từ bước đầu. Một tiệm tạp hóa nhập sữa theo thùng 48 lon nhưng bán lẻ theo lon, nếu không quy đổi thống nhất về "lon" trước khi chạy công thức FIFO, số tồn kho sẽ lệch gấp nhiều lần thực tế. Lỗi thứ hai là để công thức tính giá vốn nằm chung sheet với dữ liệu giao dịch thô — mỗi lần ai đó vô tình sort hay chèn dòng, toàn bộ tham chiếu ô lũy kế bị xô lệch. Nên tách riêng sheet "giao dịch thô" (chỉ nhập liệu, không công thức) và sheet "tính toán" (chỉ đọc, không ai được sửa tay) — nguyên tắc này cũng áp dụng khi quyết định nên lưu công thức hay giá trị khi chia sẻ báo cáo ra ngoài cho khách hàng hoặc đối tác xem. Lỗi thứ ba, gặp nhiều ở người mới học ARRAYFORMULA, là dùng SUMPRODUCT lồng nhiều điều kiện mà quên khóa vùng tuyệt đối ($), khiến công thức copy xuống các dòng dưới bị lệch vùng tham chiếu — tồn kho lô 1 vô tình cộng luôn dữ liệu lô 2. Nếu muốn nắm vững kỹ thuật ARRAYFORMULA và QUERY để tự dựng công thức FIFO chắc tay hơn trước khi nghĩ đến script, có thể xem thêm ở Google Sheets Nâng Cao 2027: Công Thức ARRAYFORMULA, QUERY, Apps Script Và Kỹ Thuật Chuyên Nghiệp.
Dấu hiệu cho thấy đã đến lúc cần chuyển hẳn sang giải pháp có sẵn
Có một ngưỡng khác ít người nói tới: khi công thức lẫn script đều bắt đầu tốn nhiều thời gian bảo trì hơn giá trị nó mang lại. Dấu hiệu cụ thể là khi mỗi tháng phải dành hơn 2-3 giờ để soát lại công thức bị lỗi, hoặc khi có hơn một người cùng thao tác trên sheet và thường xuyên đụng độ, ghi đè công thức của nhau. Ở giai đoạn này, một hệ thống quản lý tồn kho xây sẵn trên nền Google Sheets — với logic FIFO đã được kiểm thử, phân quyền nhập liệu tách bạch khỏi vùng tính toán, và giao diện quen thuộc để không phải đào tạo lại nhân viên — thường tiết kiệm hơn nhiều so với việc tiếp tục tự vá công thức hoặc thuê dev viết script riêng mỗi lần phát sinh nhu cầu mới. Đây cũng là lúc phần mềm quản lý kho & giá vốn của SheetStore thường được các shop tìm đến, vì đã giải quyết sẵn phần xử lý lô hàng theo FIFO — cấu hình song song với bình quân gia quyền cho từng mặt hàng — mà không cần người dùng tự mò công thức từ đầu. Nếu tự làm, nên bắt đầu từ công thức thuần cho đến khi thực sự chạm ngưỡng về số lượng SKU hoặc cần lưu lịch sử giá vốn, lúc đó chuyển từng phần sang script thay vì viết lại toàn bộ hệ thống một lúc — cách làm tăng dần này giảm rủi ro và cho phép kiểm tra độ chính xác ở từng bước.
Câu hỏi thường gặp
Công thức FIFO thuần trong Google Sheets bị chậm khi nào?
Khi dùng SUMPRODUCT hoặc mảng lồng nhau để trừ dần số lượng theo từng lô nhập, mỗi dòng xuất kho phải quét lại toàn bộ lịch sử nhập. Với vài trăm SKU và hàng nghìn giao dịch, sheet dễ trễ nhiều giây mỗi lần sửa ô, thậm chí treo khi mở file.
Khi nào nên chuyển từ công thức sang Apps Script để tính FIFO?
Khi số dòng giao dịch vượt quá vài nghìn, có nhiều kho/chi nhánh cùng lúc, hoặc cần xử lý trả hàng và điều chỉnh tồn phức tạp. Apps Script xử lý bằng vòng lặp và lưu trạng thái lô hàng, chạy nhanh hơn nhiều so với công thức mảng.
Dùng công thức thuần có rủi ro gì khi tính giá vốn FIFO?
Rủi ro chính là sai số khi có giao dịch chỉnh sửa ngược ngày tháng hoặc xóa dòng giữa chừng — công thức không tự phát hiện, dẫn đến trừ nhầm lô. Ngoài ra file phình to do công thức mảng nặng, dễ bị lỗi #REF khi copy-paste.
Apps Script tính FIFO có cần biết lập trình không?
Cần hiểu cơ bản để tùy chỉnh, nhưng phần lớn mẫu FIFO bán sẵn đã đóng gói sẵn hàm chạy bằng nút bấm hoặc trigger tự động, người dùng chỉ nhập liệu vào bảng nhập/xuất kho như bình thường, không phải sửa code.
Bài viết liên quan:
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.
📚 Bài Viết Liên Quan
- Template Google Sheets Theo Dõi Dự Án IT Và Phần Mềm 2027: Agile Sprint Board Đơn Giản
- Mẫu Báo Cáo Tài Chính Doanh Nghiệp Google Sheets 2027: P&L, Cash Flow, Balance Sheet
- Google Sheets Nâng Cao Bài 6: ARRAYFORMULA - Tự Động Hóa Công Thức Hàng Loạt
- Google Sheets Nâng Cao Bài 8: Pivot Table và SUMPRODUCT - Phân Tích Dữ Liệu Đa Chiều
Chia sẻ bài viết:
Tuân Hoang
Đội ngũ SheetStore
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.
