
Danh sách ít thay đổi thì dùng Enum; danh sách tăng theo thời gian thì tạo một bảng danh mục riêng, tức là một appsheet lookup table, rồi cho cột Text lấy giá trị từ bảng đó bằng Valid_If. Còn nếu người dùng chọn một thứ có nhiều thuộc tính riêng như Sản phẩm, hãy dùng Ref. Bài này đi qua từng trường hợp trong app «Bán hàng 5F» (Trạng thái đơn, Hình thức thanh toán, Tỉnh/Thành, Sản phẩm), theo mẫu thiết kế lookup/drop-down trong tài liệu của Google. Video bên dưới làm mẫu từng bước, còn nội dung bài này đọc riêng vẫn đủ để làm theo.
Câu hỏi đầu tiên: người dùng chọn một giá trị hay chọn một đối tượng?
Giá trị là một thuộc tính đơn lẻ, còn đối tượng là thứ có nhiều thuộc tính riêng. Tài liệu của Google cũng nhấn mạnh bước phân biệt này trước khi chọn cách làm.
- Giá trị: Trạng thái «Đã giao», Hình thức thanh toán «Chuyển khoản». Mỗi thứ chỉ là một cái tên.
- Đối tượng: Sản phẩm có tên, giá, ảnh, tồn kho. Mỗi sản phẩm là một dòng dữ liệu đầy đủ.
Giá trị thì dùng Enum hoặc bảng danh mục. Đối tượng thì dùng Ref (cột tham chiếu) tới bảng của nó. Bảng dưới đây tóm tắt các tình huống trong app bán hàng.
| Tình huống | Cách làm |
|---|---|
| Trạng thái đơn, Hình thức thanh toán (cố định, chặt) | Enum, liệt kê trong Values |
| Chọn nhiều giá trị (Kênh bán) | EnumList |
| Danh sách gợi ý nhưng được gõ khác | Suggested values hoặc Enum + Allow other values |
| Danh sách tăng theo thời gian (Tỉnh/Thành) | Bảng danh mục + Valid_If |
| Chọn một Sản phẩm | Ref |
| Nhiều sản phẩm trong một đơn | Mẫu item-detail |

Khi nào dùng Enum cho danh sách cố định, chặt?
Dùng Enum khi danh sách ngắn, ít đổi và người dùng chỉ được chọn trong đó. Trạng thái đơn (Mới, Đã giao, Chưa thu, Đã thu) và Hình thức thanh toán đều thuộc nhóm này: bạn liệt kê sẵn các giá trị trong Values của cột.
Nếu cột trong Google Sheet đã có data validation dạng danh sách, AppSheet tự tạo Enum khi đọc bảng, nên nhiều khi bạn không phải làm gì thêm. Với trường hợp chọn nhiều giá trị cùng lúc, ví dụ Kênh bán là «Tại cửa hàng» và «Zalo», hãy dùng EnumList. Nếu cần tìm hiểu các kiểu cột khác, xem bảng tổng hợp column type trong AppSheet.
Suggested values và Allow other values: gợi ý nhưng vẫn cho gõ khác
Suggested values là danh sách gợi ý hiện thành dropdown mà người dùng vẫn gõ được giá trị khác. Cột nào cũng khai được danh sách này, không bắt buộc phải là Enum.
Cách thứ hai là giữ cột Enum và bật Allow other values; lúc đó các giá trị trong Values chỉ còn là gợi ý. Lưu ý: Allow other values không hỗ trợ với AppSheet database, theo tài liệu chính thức của AppSheet. Ví dụ, cột «Ghi chú giao hàng» có thể gợi ý vài câu hay dùng nhưng nhân viên vẫn tự gõ được.
Danh sách thay đổi thường xuyên: bảng danh mục + Valid_If
Khi danh sách tăng theo thời gian, hãy tách ra một bảng danh mục riêng và để cột Text lấy giá trị từ bảng đó qua Valid_If (biểu thức ràng buộc giá trị hợp lệ của cột). Đây chính là cách dùng appsheet lookup table điển hình.
Ví dụ: công ty mở thêm tỉnh thành theo từng năm, nên tạo bảng «Địa bàn» có hai cột Khu vực và Tỉnh/Thành. Đây là phần mở rộng tôi thêm vào app demo để minh hoạ, không phải bảng có sẵn trong app gốc.
- Tạo bảng Địa bàn với các cột Khu vực, Tỉnh/Thành.
- Trong bảng Khách hàng, để cột Tỉnh/Thành kiểu Text.
- Đặt Valid_If của cột này là
Địa bàn[Tỉnh/Thành].
App sẽ hiện dropdown lấy từ bảng Địa bàn. Cái hay là khi có tỉnh mới, bạn chỉ thêm một dòng vào bảng Địa bàn, không phải sửa app. Cái cần nhớ: Valid_If là ràng buộc chặt, người dùng không thêm được giá trị ngoài danh sách. Nếu muốn nới lỏng, xem phần «Khác» bên dưới.

Làm dropdown phụ thuộc: chọn Khu vực rồi mới lọc Tỉnh/Thành thế nào?
Dùng chính bảng danh mục đó, nhưng để Valid_If chỉ lấy các tỉnh thuộc khu vực đã chọn. Giả định bảng Khách hàng có thêm cột Khu vực (cũng là phần mở rộng của demo), Valid_If của cột Tỉnh/Thành là:
SELECT(Địa bàn[Tỉnh/Thành], [Khu vực] = [_THISROW].[Khu vực])
Hàm SELECT() (lọc một cột theo điều kiện) lấy các giá trị Tỉnh/Thành trong bảng Địa bàn có Khu vực bằng Khu vực của dòng đang nhập. Chọn «Miền Bắc» thì dropdown Tỉnh/Thành chỉ còn các tỉnh miền Bắc. Đây là dropdown phụ thuộc appsheet theo cách thủ công, dễ hiểu và dễ kiểm soát.
AppSheet còn có cách dựng sẵn cho các trường hợp phụ thuộc thông dụng. Phần đó tôi chưa đọc nguồn trong bài này, nên xin dẫn sang bài «Dropdown trong AppSheet: Enum, Ref, Valid_If và dropdown phụ thuộc».

Cho người dùng chọn «Khác» rồi tự gõ giá trị được không?
Được, bằng cách kết hợp Enum, Allow other values và một cột ẩn. Các bước:
- Để cột Tỉnh/Thành kiểu Enum nhưng không khai Values, rồi bật Allow other values.
- Đặt Valid_If là
Địa bàn[Tỉnh/Thành] + {"Khác"}. Danh sách động từ bảng, cộng thêm lựa chọn «Khác». - Thêm cột «Tỉnh khác», đặt Show_If (điều kiện hiển thị cột) là
[Tỉnh/Thành] = "Khác".
Khi nhân viên chọn «Khác», ô «Tỉnh khác» mới hiện ra để gõ tên tỉnh. Cách này hợp với khách hàng ở nơi công ty chưa mở địa bàn. Định kỳ, người quản lý xem các giá trị «Tỉnh khác» và thêm vào bảng Địa bàn nếu thấy cần.
Chọn một đối tượng bằng Ref: Sản phẩm trong Chi tiết đơn
Khi chọn Sản phẩm, hãy dùng Ref để dropdown hiện danh sách từ bảng Sản phẩm, vì sản phẩm có tên, giá, ảnh, tồn kho riêng. Về quyền, bảng Sản phẩm thường để chỉ đọc hoặc chỉ thêm, để sản phẩm đã có trong đơn không bị xoá mất. Xem thêm cách liên kết bảng ở bài mẫu Đơn hàng – Chi tiết đơn với Ref và IsAPartOf.
Chọn nhiều sản phẩm trong một ô có nên dùng không?
Hầu như không nên. Chọn nhiều sản phẩm cho một đơn thì nên tách thành mẫu item-detail: mỗi sản phẩm là một dòng trong bảng Chi tiết đơn, có số lượng và đơn giá riêng. Cột «danh sách Ref» hiếm khi cần; AppSheet không có sẵn kiểu này, chỉ mô phỏng được bằng EnumList + Valid_If. Cách mô phỏng đó khó gắn số lượng, giá cho từng sản phẩm.

Giá trị hay bảng riêng: quyết định thế nào khi còn phân vân?
Nếu chỉ cần cái tên thì để giá trị; khi cần lưu thêm thông tin cho từng mục thì tách thành bảng. Ví dụ Nhóm hàng (Gạo, Dầu ăn, Gia vị, Đồ khô): lúc đầu Enum là đủ. Khi bạn muốn lưu thêm người phụ trách nhóm hay chỉ tiêu doanh số, hãy tách thành bảng Nhóm hàng và đổi cột sang Ref. Quy tắc dễ nhớ: thứ gì là «một loại sự vật có thật» thì thường sẽ thành bảng. Muốn hiểu rõ quan hệ giữa các bảng, đọc bài về Ref liên kết Khách hàng – Đơn hàng.
Tóm tắt và bước tiếp theo
- Chọn giá trị: Enum (cố định), EnumList (nhiều giá trị), Suggested values hoặc Allow other values (cho gõ khác).
- Danh sách tăng theo thời gian: bảng danh mục + Valid_If, ràng buộc chặt.
- Dropdown phụ thuộc: Valid_If dùng SELECT() lọc theo cột Khu vực.
- Chọn đối tượng: Ref; nhiều đối tượng: item-detail.
Bạn có thể bắt đầu bằng việc lấy một cột đang gõ tay, ví dụ Tỉnh/Thành, tạo bảng danh mục cho nó và thử Valid_If trên một bản sao của app. Bản đầy đủ của mẫu thiết kế này nằm trong tài liệu chính thức của AppSheet về lookup/drop-down.
Xem thêm
Câu hỏi thường gặp
›Khi nào dùng Enum, khi nào cần bảng danh mục riêng?
Dùng Enum khi danh sách ngắn, cố định và chỉ cần cái tên, như Trạng thái đơn hay Hình thức thanh toán. Khi danh sách tăng theo thời gian, như tỉnh thành công ty mở thêm, hãy tạo bảng danh mục và dùng Valid_If. Khi cần lưu thêm thuộc tính cho từng mục thì tách thành bảng và dùng Ref.
›Làm dropdown Tỉnh/Thành lọc theo Khu vực thế nào?
Tạo bảng danh mục có hai cột Khu vực và Tỉnh/Thành. Ở cột Tỉnh/Thành của Khách hàng, đặt Valid_If là SELECT(Địa bàn[Tỉnh/Thành], [Khu vực] = [_THISROW].[Khu vực]). Khi chọn Khu vực, dropdown chỉ còn các tỉnh thuộc khu vực đó.
›Cho chọn «Khác» rồi tự gõ giá trị được không?
Được. Để cột Enum không khai Values, bật Allow other values và đặt Valid_If là Địa bàn[Tỉnh/Thành] + {"Khác"}. Sau đó thêm cột «Tỉnh khác» có Show_If là [Tỉnh/Thành] = "Khác" để người dùng tự gõ. Allow other values không hỗ trợ với AppSheet database.
›Có nên cho chọn nhiều sản phẩm trong một ô không?
Hầu như không nên. Nên tách thành mẫu item-detail để mỗi sản phẩm là một dòng chi tiết đơn. AppSheet không có sẵn kiểu danh sách Ref, chỉ mô phỏng được bằng EnumList + Valid_If.
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.



