
Dữ liệu AppSheet được tổ chức thành các table (bảng), mỗi bảng gồm nhiều record (dòng) và các column (cột), còn nơi lưu các bảng đó gọi là data source (nguồn dữ liệu), thường là Google Sheet. App chỉ thêm, sửa, xoá dòng; cấu trúc cột thì giữ cố định. Nếu bạn đã tạo được app đầu tiên và bắt đầu rối ở chỗ «dữ liệu nằm đâu, table là gì, sao app đòi key», bài này dựng lại từng lớp bằng app «Bán hàng 5F». Video bên dưới làm mẫu từng bước phần nguồn kết nối, còn bài viết vẫn đầy đủ nếu bạn không xem.
Ba khái niệm nền: record, table, column là gì?
Record là một dòng dữ liệu, table là tập các record cùng loại, column là thuộc tính chung của mọi dòng. Ví dụ một khách «Cửa hàng Minh An» là một record, một đơn DH001 là một record khác.
- Record: một dòng trong Sheet, ví dụ khách «Cửa hàng Minh An» hoặc đơn DH001.
- Table: tập hợp record cùng loại, ví dụ Khách hàng, Sản phẩm, Đơn hàng.
- Column: thuộc tính của mọi dòng, ví dụ Tên khách hàng, Số điện thoại.
Cách hình dung dễ nhất: table giống một tờ form. Mỗi câu hỏi trên form là một cột, mỗi người điền là một dòng. Khi dùng app, phần lớn thao tác thực chất là thêm, sửa, xoá dòng. Cột thì bạn thiết kế một lần rồi giữ nguyên. Hiểu điều này giúp bạn bớt sợ: không có gì bí ẩn, app chỉ là giao diện đẹp để nhập và xem các dòng đó.
Thiết kế bảng AppSheet: app bán hàng cần những bảng nào?
Mỗi loại đối tượng một bảng, mỗi bảng một sheet (tab) trong cùng một file, đặt tên tab theo loại record. Cách làm này khớp với hướng dẫn chính thức của AppSheet là nên dùng một spreadsheet cho mỗi app.
App «Bán hàng 5F» có sáu bảng:
- Khách hàng
- Sản phẩm
- Đơn hàng
- Chi tiết đơn
- Nhân viên
- Phiếu nhập kho
Cách nghĩ để ra các cột: với từng loại đối tượng, liệt kê những thông tin bạn cần hỏi. Với Khách hàng, đó là Mã KH, Tên khách hàng, Số điện thoại, Địa chỉ. Mỗi thông tin là một cột. Đây là bước đầu của cấu trúc dữ liệu AppSheet, và làm kỹ ở đây sẽ đỡ sửa rất nhiều về sau.
Vì sao không nên nhập lặp hay nhồi danh sách vào một ô?
Vì dữ liệu lặp phải sửa ở nhiều nơi, còn danh sách trong một ô thì khó thêm và khó thống kê. Cách khắc phục là tách bảng và nối bằng Ref (kiểu cột trỏ tới dòng của bảng khác).
Tách thông tin khách ra bảng riêng
Giả sử bảng Đơn hàng có các cột Tên khách, SĐT khách, Địa chỉ khách. Khi «Cửa hàng Minh An» đổi số điện thoại, bạn phải sửa ở mọi đơn từng mua. Sót một đơn là dữ liệu mâu thuẫn. Cách đúng là chuyển các cột đó sang bảng Khách hàng, còn Đơn hàng chỉ giữ một cột trỏ tới khách bằng Ref. Đổi số một lần, mọi đơn đều thấy số mới.
Mỗi ô chỉ một giá trị
Đừng làm các cột Sản phẩm 1, Sản phẩm 2, Sản phẩm 3 trong bảng Đơn hàng. Cách này cố định số món và khó thêm khi khách mua nhiều hơn. Hãy tạo bảng Chi tiết đơn, mỗi món một dòng.
| Cách làm | Ví dụ | Vấn đề |
|---|---|---|
| Nhiều cột lặp | Đơn hàng: Sản phẩm 1, Sản phẩm 2, Sản phẩm 3 | Cố định số món, đơn có 4 món là bí |
| Tách bảng | Chi tiết đơn: DH001 – Sản phẩm A; DH001 – Sản phẩm B | Thêm bao nhiêu món cũng chỉ thêm dòng |
Mỗi bảng có một cột định danh riêng
Mỗi bảng cần một cột làm khoá (key) để phân biệt các dòng, ví dụ Mã KH, Mã SP, Mã đơn. Tên khách có thể trùng, địa chỉ có thể đổi, nên không dùng chúng làm key. Cách chọn key chi tiết nằm ở bài riêng «Key trong AppSheet: chọn khoá chính đúng và dùng UNIQUEID()». Nếu quen với SQL, bạn có thể đọc thêm về khóa chính khóa ngoại và quan hệ 1-nhiều, nhiều-nhiều để thấy cùng một ý tưởng.
Nối các bảng bằng Ref: danh sách dòng liên quan hoạt động ra sao?
Cột Ref chứa key của một dòng ở bảng khác. Nhờ đó app biết đơn DH001 thuộc khách nào mà không cần chép lại thông tin khách.
Nếu bạn đặt tên cột trùng tên bảng, ví dụ cột «Khách hàng» trong bảng Đơn hàng, AppSheet thường tự đoán đó là Ref tới bảng Khách hàng. Tài liệu chính thức mô tả cùng cách này với ví dụ cột Book trỏ tới bảng Books. Bạn vẫn nên kiểm tra lại kiểu cột sau khi AppSheet đoán.
Với quan hệ một – nhiều, chỉ cần đặt Ref ở bảng «nhiều». Đơn hàng có Ref tới Khách hàng thì khi mở một khách, bạn tự thấy danh sách đơn của khách đó. Bạn không phải thêm gì vào bảng Khách hàng.
Trong «Bán hàng 5F», chuỗi quan hệ chạy như sau: Nhân viên → Khách hàng → Đơn hàng → Chi tiết đơn. Mỗi bảng có một cột Ref trỏ về bảng đứng trước. Riêng Chi tiết đơn còn một Ref nữa sang Sản phẩm. Chính vì Chi tiết đơn nối cả Đơn hàng lẫn Sản phẩm nên nó đóng vai bảng trung gian cho quan hệ nhiều – nhiều (một đơn có nhiều sản phẩm, một sản phẩm nằm trong nhiều đơn). Chủ đề này thuộc phần thiết kế cơ sở dữ liệu nâng cao, tôi chỉ nhắc ở đây.

Đưa dữ liệu vào Sheet thế nào cho app đọc đúng?
Hàng đầu tiên phải là tiêu đề cột, tên rõ nghĩa, mỗi cột một định dạng thống nhất, và dữ liệu mới luôn thêm thành dòng. Đây là các lỗi tôi thấy hay gặp nhất khi người mới chuyển file cũ sang app:
- Tiêu đề cột in đậm, tên có nghĩa như
Tên khách hàng, không để Column1, Column2. - Mỗi cột một kiểu dữ liệu: cột ngày chỉ chứa ngày, cột tiền chỉ chứa số, không trộn chữ «5 triệu» với số 5000000.
- Dữ liệu mới thêm thành dòng mới. Thêm thành cột thì app không hiểu.
- Không để ghi chú hay con số rời rạc nằm ngoài vùng bảng.
Phần chuẩn bị file chi tiết hơn có trong bài chuẩn bị Google Sheet cho AppSheet.
Data source AppSheet là gì: nơi app đọc và ghi?
Data source là nơi thật sự lưu các bảng, và app đọc rồi ghi ngược về đó. Mỗi tài khoản AppSheet luôn có một nguồn chính dùng để đăng nhập, thường là Google Drive, và bạn thêm được nhiều nguồn khác. Một app lấy bảng từ nhiều nguồn cùng lúc, ví dụ Khách hàng nằm ở Google Sheet còn dữ liệu lớn nằm ở cơ sở dữ liệu.
Theo tài liệu chính thức lúc viết, các nguồn chia thành nhóm sau (danh sách có thể thay đổi, bạn nên kiểm tra lại trang nguồn dữ liệu của AppSheet):
| Nhóm | Ví dụ |
|---|---|
| Native | AppSheet database |
| Bảng tính | Google Sheets, Excel trên Office 365/SharePoint |
| Cơ sở dữ liệu | BigQuery, MySQL, PostgreSQL, SQL Server, Oracle |
| Dịch vụ khác | Google Calendar, Drive, Forms, Gmail, Salesforce, Smartsheet, Airtable, OData |
| Integration Connectors | Đang ở dạng preview |
Có hai lưu ý nhỏ. Google Forms khi thêm vào sẽ thành bảng chỉ đọc. Gmail chỉ dùng được trong automation. Nếu đang phân vân giữa Google Sheet và native, bài AppSheet Database là gì so sánh hai hướng này.

Quản lý nguồn dữ liệu AppSheet trong tài khoản ra sao?
Mọi nguồn được quản lý ở trang Sources của tài khoản. Các thao tác thường gặp:
- Xem nguồn: vào
My account > Sources, nơi có nguồn của bạn và nguồn team chia sẻ. - Thêm nguồn: bấm
+ New Data Sourceở trang Sources, hoặc+ New sourcekhi tạo app, hoặc khi bấm + trong Data của app có sẵn. Tuỳ chọn Use Integration Connectors chỉ dành cho team admin. - Copy bảng sang nguồn khác: vào Data, chọn bảng, rồi
Table settings> Storage >Copy Data to New Source. Có tuỳ chọn Include file data nếu muốn kèm file ảnh. - Xoá nguồn: gỡ các bảng liên quan khỏi app trước. Nếu không, app sẽ chạy sai.
Đổi mật khẩu tài khoản nguồn thì app có lỗi không?
Có thể mất kết nối, nhưng sửa được dễ dàng. Khi bạn đổi mật khẩu hoặc đổi user ở nguồn dữ liệu, hãy vào tab Sources và bấm vào nguồn đó để xác thực lại (làm mới kết nối). Với nguồn dùng chung, chỉ tài khoản đã tạo kết nối mới làm mới được, nên hãy nhờ đúng người đó. Chi tiết xem ở tài liệu về làm mới quyền truy cập.
Blank value comparison mode ảnh hưởng biểu thức thế nào?
Đây là tuỳ chọn ở Settings > Data, nhóm Expressions, quyết định cách app so sánh một ô trống với giá trị khác. Có hai chế độ:
- Consistent: so sánh với ô trống cho kết quả giống nhau giữa server (với virtual column, tức cột ảo) và thiết bị (với cột thật). Chế độ này có thể giúp sync nhanh hơn.
- Legacy: giữ cách cũ. Theo tài liệu, Legacy sẽ bị bỏ trong tương lai.
App mới mặc định là Consistent. App được copy giữ chế độ của app gốc.
Ví dụ với cột [Công nợ] đang để trống, biểu thức so sánh nó với 0:
| Chế độ | Tính trên server | Tính trên thiết bị |
|---|---|---|
| Legacy | False | True |
| Consistent | False | False |
Nghĩa là ở Legacy, cùng một biểu thức có thể cho hai kết quả khác nhau tuỳ nơi tính, nên báo cáo trên điện thoại và trên server lệch nhau mà khó tìm ra lý do.
Nếu app cũ của bạn đang phụ thuộc cách cũ, đừng chuyển thẳng. Hãy copy app ra bản thử, chuyển sang Consistent và sửa các biểu thức ở bản thử trước, rồi mới áp dụng cho app thật.

Tóm tắt và bước tiếp theo
Ý chính cần nhớ về dữ liệu AppSheet:
- Record là dòng, table là tập dòng cùng loại, column là thuộc tính chung. App chỉ thêm, sửa, xoá dòng.
- Mỗi loại đối tượng một bảng, mỗi bảng có key riêng. Không nhập lặp, không nhồi danh sách vào một ô.
- Nối bảng bằng Ref ở phía «nhiều» để có danh sách dòng liên quan.
- Một app dùng được nhiều data source; quản lý ở
My account > Sources. Đổi mật khẩu nguồn thì xác thực lại ở đó. - Kiểm tra
Blank value comparison modenếu biểu thức cho kết quả lệch giữa server và thiết bị.
Để tự làm ngay: lấy app bạn đang có, liệt kê các cột bị lặp hoặc kiểu «Sản phẩm 1, Sản phẩm 2», rồi thử tách ra một bảng riêng trong bản copy. Nếu chưa có app, hãy bắt đầu với tạo app AppSheet đầu tiên từ Google Sheet. Bạn cũng có thể đối chiếu với tài liệu chính thức về cách tổ chức dữ liệu.
Câu hỏi thường gặp
›AppSheet lấy dữ liệu từ những nguồn nào?
Theo tài liệu chính thức lúc viết, AppSheet đọc từ native (AppSheet database), bảng tính như Google Sheets và Excel trên Office 365/SharePoint, cơ sở dữ liệu như BigQuery, MySQL, PostgreSQL, SQL Server, Oracle, cùng các dịch vụ khác như Google Calendar, Drive, Forms, Salesforce, Smartsheet, Airtable, OData. Ngoài ra còn Integration Connectors ở dạng preview. Danh sách này có thể thay đổi nên hãy kiểm tra lại trang chính thức.
›Một app AppSheet có dùng được nhiều Google Sheet cùng lúc không?
Được. Một app có thể thêm bảng từ nhiều nguồn khác nhau cùng lúc, kể cả nhiều file Google Sheet hoặc trộn Google Sheet với cơ sở dữ liệu. Tuy vậy, nếu không có lý do đặc biệt thì nên dùng một spreadsheet cho mỗi app, mỗi bảng một sheet (tab) để dễ quản lý.
›Vì sao không nên để cột Sản phẩm 1, Sản phẩm 2 trong bảng Đơn hàng?
Vì cách này cố định số món trong một đơn và khó thêm khi khách mua nhiều hơn. Mỗi ô nên chỉ chứa một giá trị. Hãy tạo bảng Chi tiết đơn, mỗi món một dòng, rồi nối với Đơn hàng và Sản phẩm bằng Ref.
›Đổi mật khẩu tài khoản nguồn dữ liệu thì cần làm gì để app chạy tiếp?
Vào trang Sources trong tài khoản AppSheet, bấm vào nguồn đó và xác thực lại để làm mới kết nối. Nếu nguồn được dùng chung, chỉ tài khoản đã tạo kết nối mới làm mới được. Cách vào xem nguồn là My account > Sources.
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.



