
Key AppSheet là cột định danh duy nhất cho mỗi dòng của bảng: khi bạn sửa hoặc xoá một dòng trong app, AppSheet dùng giá trị key để tìm đúng dòng đó trong nguồn dữ liệu. Cách làm an toàn nhất với đa số app là một cột ẩn có Initial value (giá trị khởi tạo) là UNIQUEID(), còn mã đẹp như DH001, DH002 chỉ để hiển thị. Tôi hay gặp người làm app đặt key sai ngay từ đầu rồi sửa nhầm dòng mà không hiểu vì sao. Video bên dưới làm mẫu từng bước, nhưng bài này vẫn đủ để bạn làm theo mà không cần xem.
Key dùng để làm gì và vì sao trùng key nguy hiểm?
Key định danh duy nhất mỗi dòng, và giá trị của nó phải giữ nguyên suốt đời của dòng. Mỗi lần bạn bấm sửa hay xoá từ app, AppSheet nhìn vào key để biết phải tác động lên dòng nào trong Google Sheet.
Nếu hai dòng trùng key (lỗi gọi là «duplicate keys»), AppSheet không còn phân biệt được chúng. Ví dụ trong app «Bán hàng 5F»: đơn của Cửa hàng Minh An và đơn của Tạp hoá Hồng Phúc cùng mang key DH005. Khi nhân viên sửa đơn Minh An, thay đổi có thể ghi đè lên đơn Hồng Phúc. Đây là lỗi nghiêm trọng vì dữ liệu sai mà không có thông báo gì.
Có mấy loại key trong AppSheet, loại nào tốt nhất?
Tài liệu chính thức chia thành ba loại, xếp từ tốt đến tệ: natural key, key do hệ thống sinh và row number.
- Natural key (key tự nhiên): cột có sẵn và vốn đã duy nhất, như Mã NV. Cũng có thể ghép hai cột, ví dụ Tỉnh + Biển số xe. Hoặc key tính bằng App formula (công thức của app) từ các cột không bao giờ đổi. Nếu công thức dùng ngày giờ hiện tại, editor sẽ báo lỗi.
- Key do hệ thống sinh:
UNIQUEID()hoặcRANDBETWEEN(). Bảng AppSheet database mặc định dùng Row ID. - Row number (
_RowNumber): không nên dùng. Khi dòng bị di chuyển, bị xoá hoặc nhiều người thêm cùng lúc, số dòng thay đổi, và editor sẽ cảnh báo khi bạn chọn.
| Loại key | Ví dụ trong app bán hàng | Mức khuyên dùng |
|---|---|---|
| Natural key | Mã NV ở bảng Nhân viên; Tỉnh + Biển số xe ở bảng Xe giao hàng | Tốt, nếu giá trị thật sự duy nhất và không đổi |
| Do hệ thống sinh | Cột ẩn UNIQUEID() ở bảng Đơn hàng | Tốt, dùng được cho hầu hết bảng nhập liệu |
| Row number | _RowNumber | Không nên |

Vì sao AppSheet không có mã tự tăng DH001, DH002 an toàn?
Câu trả lời ngắn trong tài liệu AppSheet cho key tuần tự là «No». Một hệ thống có nhiều người dùng, cho thêm dòng cùng lúc và hoạt động cả khi offline thì không thể vừa tăng đều, vừa đúng thứ tự tạo.
Nhiều người thử MAX(Đơn hàng[Mã đơn]) + 1. Công thức này chỉ an toàn khi đúng MỘT người thêm dòng. Hai nhân viên lập đơn cùng lúc, hoặc một người đang offline, đều có thể lấy ra cùng một số. Tình huống minh hoạ: cả hai thấy số lớn nhất là DH004, cùng ra DH005 và lưu hai đơn khác nhau.
Công thức tăng dần trong Google Sheet cũng không làm key được, vì không đảm bảo bất biến và không tính được khi app offline. Ngược lại, UNIQUEID() và RANDBETWEEN() không cần phối hợp giữa client (app trên máy) và server nên vẫn chạy khi nhiều người thêm dòng offline. Tôi cũng không có cách nào làm mã tự tăng an toàn cho bạn; tài liệu nói rõ là không thể.
Hướng xử lý cho «Bán hàng 5F»: key là một cột ẩn dùng UNIQUEID(). «Mã đơn hiển thị» là cột thường, dùng để in hoá đơn và đọc cho khách, tuyệt đối không dùng làm key. Nếu bạn cần số thứ tự đẹp, hãy coi đó là nhãn và chấp nhận có thể có khoảng trống hoặc phải kiểm tra riêng.

AppSheet tự chọn key cho bảng như thế nào?
Khi thêm bảng, AppSheet quét các cột từ trái sang phải để tìm cột có giá trị duy nhất. Vì vậy hãy đặt cột key tốt ở VỊ TRÍ ĐẦU TIÊN bên trái trong sheet.
- Không có cột nào duy nhất: AppSheet thử từng cặp cột (không cần nằm liền nhau) và tạo key ghép là một virtual column (cột ảo) ở cuối bảng.
- Vẫn không có: dùng row number kèm cảnh báo.
Nghĩa là nếu sheet của bạn chưa có cột ID, app vẫn chạy được, nhưng bạn đang đứng trên loại key tệ nhất. Chuẩn bị cột ID từ đầu rẻ hơn rất nhiều so với sửa sau.

Cách đặt UNIQUEID() làm key bằng tay
Bạn đặt UNIQUEID() ở Initial value của cột key, rồi tick Key cho cột đó. Các bước:
- Mở bảng trong editor.
- Bỏ tick Key ở cột key cũ.
- Tick Key ở cột mới.
- (Tuỳ chọn) bỏ tick Show? để ẩn cột khỏi người dùng.
- Ở Initial value, nhập
UNIQUEID(). - Bấm Save.
Vì sao Initial value mà không phải App formula? Initial value chỉ tính MỘT lần lúc tạo dòng. App formula tính lại mỗi lần dòng được cập nhật, nên key sẽ đổi và dòng bị «mất». Quy tắc: key đặt ở Initial value, không bao giờ ở App formula. Bảng Chi tiết đơn của app demo dùng đúng cách này cho cột Mã dòng.
| Biểu thức | Kết quả |
|---|---|
UNIQUEID() | 8 ký tự chữ và số |
UNIQUEID("UUID") | UUID v4 |
UNIQUEID("PackedUUID") | 22 ký tự |
RANDBETWEEN() | Số ngẫu nhiên, dùng khi muốn key là số |
Một lưu ý trung thực: tài liệu nói UNIQUEID() không đảm bảo tuyệt đối, nhưng xác suất trùng gần như bằng 0. Chi tiết xem tại trang tài liệu về UNIQUEID().

Muốn cột «không trùng nhưng vẫn sửa được» thì làm sao?
Đừng biến cột đó thành key, vì key không sửa được. Lý do: hai người cùng mở một dòng, người thứ hai đổi key rồi lưu; người thứ nhất lưu sau sẽ không tìm thấy dòng nữa.
Ví dụ bảng Nhân viên muốn Email không trùng nhưng vẫn đổi được:
- Thêm cột Mã NV ở đầu sheet.
- Sinh giá trị cho các dòng cũ (xem phần dưới), rồi bấm Regenerate (nạp lại cấu trúc bảng) trong editor.
- Đặt Initial value là
UNIQUEID(), tick Key và ẩn cột đi. - Cột Email đặt Valid_If (điều kiện hợp lệ) để chặn trùng.
- Bật Label cho cột Họ tên để app hiện tên thay cho mã.
Cách viết Valid_If chi tiết nằm ở bài «Valid_If: chặn nhập sai và tạo dropdown có điều kiện» của 5F Edu. Bài đó chưa có trong danh sách đã đăng nên tôi chưa gắn link ở đây.
Làm sao sinh ID cho dữ liệu cũ ngay trong Google Sheet?
Dùng công thức =DEC2HEX(RANDBETWEEN(0, 4294967295), 8), cho ra mã cùng dạng với UNIQUEID(). Thêm LOWER() bên ngoài nếu bạn muốn chữ thường.
- Dán công thức vào ô A2.
- Kéo xuống tới A10 (hoặc hết số dòng dữ liệu).
- Copy vùng đó, rồi dán «chỉ giá trị» bằng Ctrl+Shift+V đè lên chính vùng đó.
Bước 3 là bắt buộc: ID phải là GIÁ TRỊ, không được để nguyên công thức, nếu không mỗi lần Sheet tính lại thì ID đổi. Nguyên tắc tương tự được nói trong bài về công thức Google Sheet trong app AppSheet. Nguồn công thức: tài liệu chính thức.
Đổi key ở AppSheet database và những kiểu cột không làm key được
Bảng AppSheet database dùng Row ID làm key, cột này ẩn trong database editor. Nếu đổi sang key khác trong app editor, các tham chiếu đang trỏ theo Row ID sẽ hỏng, nên phải chuyển tham chiếu sang cột mới trước khi đổi. Bạn có thể đọc thêm về loại dữ liệu này ở bài AppSheet Database là gì.
Các kiểu cột không làm key được: ChangeCounter, ChangeLocation, ChangeTimestamp, Color, List, LongText, Progress, Show, URL.
Tóm tắt và bước tiếp theo
- Key định danh duy nhất mỗi dòng và phải giữ nguyên suốt đời dòng; trùng key có thể làm sửa hoặc xoá nhầm dòng.
- Ưu tiên natural key thật sự duy nhất; không thì dùng cột ẩn
UNIQUEID(); tránh_RowNumber. - Không có mã tự tăng an toàn khi nhiều người nhập và có offline; mã DH001 chỉ nên là cột hiển thị.
- Đặt
UNIQUEID()ở Initial value, không đặt ở App formula. - Cột cần không trùng mà sửa được: dùng key ẩn riêng, chặn trùng bằng Valid_If, bật Label.
Việc nên làm ngay: mở app hiện có, kiểm tra từng bảng xem key là cột nào. Bảng nào đang dùng _RowNumber hoặc cột bạn hay sửa, hãy thêm cột ID đầu sheet, sinh giá trị cho dòng cũ rồi đổi key. Làm trên bản sao trước khi áp vào app đang chạy.
Xem thêm
- Dữ liệu AppSheet hoạt động thế nào: data source, table, column
- Khóa chính khóa ngoại là gì? Quan hệ 1-nhiều, nhiều-nhiều trong SQL
- Chuẩn bị Google Sheet cho AppSheet: tiêu đề cột, định dạng, nhiều sheet
Tài liệu gốc của AppSheet về key: support.google.com/appsheet/answer/10106672.
Câu hỏi thường gặp
›Key trong AppSheet là gì và vì sao bắt buộc?
Key là cột định danh duy nhất mỗi dòng trong bảng. AppSheet dùng nó để tìm đúng dòng trong nguồn dữ liệu khi sửa hoặc xoá từ app. Nếu hai dòng trùng key, thay đổi ở dòng này có thể ghi đè lên dòng kia, nên mỗi bảng cần một key giữ nguyên suốt đời dòng.
›AppSheet có tạo mã đơn tự tăng DH001, DH002 được không?
Không có cách an toàn khi nhiều người cùng thêm dòng và khi có offline, vì không thể vừa tăng đều, vừa đúng thứ tự tạo. MAX()+1 chỉ ổn khi đúng một người nhập. Cách thực tế là dùng cột key ẩn UNIQUEID() và để Mã đơn hiển thị là cột thường dùng cho hoá đơn.
›Đặt UNIQUEID() ở Initial value hay App formula?
Đặt ở Initial value. Giá trị này chỉ tính một lần lúc tạo dòng nên key ổn định. App formula tính lại mỗi lần dòng được cập nhật, khiến key đổi và dòng bị mất.
›Muốn email nhân viên không trùng nhưng vẫn sửa được thì làm sao?
Đừng đặt Email làm key vì key không sửa được. Thêm cột Mã NV ở đầu sheet với Initial value UNIQUEID(), tick Key và ẩn đi. Sau đó đặt Valid_If cho cột Email để chặn trùng và bật Label cho Họ tên để app hiện tên thay vì mã.
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.



