Chương 4: Bản chất Kiểu dữ liệu & Nguồn dữ liệu
"AppSheet không chỉ là 'hiển thị' dữ liệu. Nó phải 'hiểu' dữ liệu."
Khi bạn khai báo một cột là Price, AppSheet hiểu rằng nó cần hiển thị ký hiệu tiền tệ và có thể cộng trừ. Khi bạn khai báo là Image, nó hiểu cần mở camera. Việc chọn đúng Data Type là bước quan trọng thứ hai sau khi thiết kế Database.
4.1 Tại sao khai báo đúng Kiểu dữ liệu lại quan trọng?
Đây là bài học đắt giá mà rất nhiều người mới bắt đầu thường bỏ qua. Nếu không khai báo kiểu dữ liệu phù hợp:
- Nhập liệu sẽ loạn: Người dùng có thể nhập bất cứ thứ gì vào ô, không có validation.
- Action sẽ lỗi: Bạn không thể gửi Email nếu cột không phải type
Email, không thể gọi điện nếu không phải typePhone. - Hệ thống sẽ nặng nề: Khi bạn chọn
Ref(tham chiếu) một cách bừa bãi, mỗi lần cựa quậy AppSheet đều phải load dữ liệu từ bảng khác → app chậm như rùa. - Báo cáo sẽ sai: Bạn không thể SUM một cột
Text, không thể tính trung bình một cộtPhone.
Nguyên tắc vàng: Khai báo đúng ngay từ đầu, sửa sau sẽ đau đầu.
4.2 Phân nhóm kiểu dữ liệu (The Big Picture)
AppSheet có hơn 30 kiểu dữ liệu khác nhau. Đừng hoảng sợ, chúng ta có thể nhóm chúng thành 5 nhóm chính dựa trên chức năng:sẽ trình bày theo thứ tự từ cơ bản đến nâng cao, kèm theo tips thực chiến.
4.2.1 Nhóm 1: Text Types (Kiểu Văn bản)
Đây là nhóm cơ bản nhất, dùng để lưu trữ chuỗi ký tự.
| Kiểu | Mô tả | Khi nào dùng | Ví dụ |
|---|---|---|---|
| Text | Một dòng văn bản ngắn | Tên, Mã sản phẩm, Tiêu đề | Nguyễn Văn A |
| LongText | Văn bản nhiều dòng | Mô tả, Ghi chú, Nội dung email | Ghi chú: Khách hàng VIP... |
| Name | Tên người hoặc địa điểm | Tên khách hàng, Tên nhân viên | Trần Thị B |
Tips thực chiến:
Textkhông cho phép xuống dòng,LongTextthì có.- Dùng
Namethay vìTextcho tên người để AppSheet hiểu ngữ nghĩa tốt hơn.LongTextđang hỗ trợ Rich Text Formatting trong Preview Program (có thể bold, italic...).
4.2.2 Nhóm 2: Numeric Types (Kiểu Số)
Đây là nhóm dùng để tính toán. QUAN TRỌNG: Nếu bạn khai báo sai kiểu, phép tính sẽ lỗi!
| Kiểu | Mô tả | Khi nào dùng | Lưu ý |
|---|---|---|---|
| Number | Số nguyên (integer) | Số lượng, Số thứ tự, Tuổi | Lưu dạng 54-bit integer, AppSheet DB chuyển về 32-bit khi hiển thị |
| Decimal | Số thực (có phần thập phân) | Điểm số, Tỉ lệ, Kích thước | 3.14159 |
| Percent | Phần trăm | Tiến độ, Chiết khấu, Lãi suất | 50% lưu là 0.50 trong database |
| Price | Tiền tệ | Giá, Doanh thu, Chi phí | Tự động hiển thị ký hiệu tiền tệ (₫, $, €...) |
Tips thực chiến:
Percentlưu dạng thập phân (0.50 = 50%), nhớ điều này khi viết formula!Pricekhông chỉ hiển thị đẹp mà còn hỗ trợ format theo locale của user.- Để set currency symbol cho
Price: Data → Columns → Edit → Currency symbol =₫hoặcVNĐ.
4.2.3 Nhóm 3: Temporal Types (Kiểu Thời gian)
Thời gian là chiều thứ tư của dữ liệu. Khai báo sai chiều này, timeline và báo cáo của bạn sẽ vô nghĩa.
| Kiểu | Mô tả | Khi nào dùng | Format |
|---|---|---|---|
| Date | Năm-Tháng-Ngày | Ngày sinh, Ngày hết hạn, Deadline | 2025-01-17 |
| Time | Giờ-Phút-Giây (không có ngày) | Giờ mở cửa, Thời gian bắt đầu ca | 14:30:00 |
| DateTime | Ngày + Giờ đầy đủ | Check-in, Timestamp giao dịch | 2025-01-17 14:30:00 |
| Duration | Khoảng thời gian | Thời gian xử lý, Thời lượng cuộc gọi | 02:30:15 (2h 30m 15s) |
Tips thực chiến:
- Luôn dùng
DateTimenếu cần ghi nhận chính xác thời điểm (Check-in, Giao dịch, Log).DatevàTimehiển thị theo timezone và format của thiết bị người dùng.Durationcực kỳ hữu ích cho timesheet, ticket support, hoặc tính thời gian chờ.
4.2.4 Nhóm 4: Enumerated Types (Kiểu Liệt kê)
Đây là nhóm giúp chuẩn hóa dữ liệu đầu vào, tránh tình trạng "Hà Nội", "HN", "hà nội" xuất hiện lung tung trong database.
| Kiểu | Mô tả | Khi nào dùng | Ví dụ values |
|---|---|---|---|
| Yes/No | Boolean (True/False) | Công tắc, Checkbox, Trạng thái On/Off | TRUE, FALSE |
| Enum | Chọn 1 giá trị từ danh sách | Trạng thái, Loại, Danh mục | New, In Progress, Done |
| EnumList | Chọn nhiều giá trị từ danh sách | Tags, Skills, Sở thích | [Đọc sách, Bơi lội, Du lịch] |
| Color | Chọn màu sắc | Phân loại theo màu, Priority | Red, Blue, Green, Orange... |
| Progress | Tiến độ dạng Harvey Balls | Quản lý dự án | Empty, Quarter, Half, Three Quarter, Full |
[Lưu ý] Cảnh báo về Ref:
Reflà con dao hai lưỡi. Nó mạnh nhưng nếu lạm dụng, app sẽ chậm như rùa vì mỗi lần load phải fetch dữ liệu từ bảng tham chiếu. Chỉ dùngRefkhi:
- Cần hiển thị thông tin từ bảng khác (Tên KH, Địa chỉ...).
- Cần tạo quan hệ cha-con (Order → OrderDetails).
- KHÔNG dùng Ref chỉ để lookup 1 giá trị đơn giản → dùng
LOOKUP()trong Virtual Column thay thế.
Tips thực chiến:
Enumcó thể hiển thị dạng Dropdown hoặc Buttons (dễ bấm trên mobile).Progresssử dụng Harvey Balls để hiển thị trực quan tiến độ.Colorhỗ trợ 8 màu chuẩn: Black, Blue, Green, Orange, Purple, Red, Yellow, White.
4.2.5 Nhóm 5: Content Types (Kiểu Nội dung Đa phương tiện)
Đây là sức mạnh của mobile app - thu thập dữ liệu đa phương tiện ngay trên thiết bị.
| Kiểu | Mô tả | Cách thu thập | Lưu ý |
|---|---|---|---|
| Image | Ảnh (.jpg, .png, .gif) | Camera hoặc Thư viện | Có thể cho phép vẽ trên ảnh (markup) |
| Thumbnail | Ảnh nhỏ (icon) | Tương tự Image | Dùng cho avatar, logo nhỏ |
| File | File bất kỳ (PDF, Word, Excel) | Upload từ browser | Chỉ capture được trên browser, mobile chỉ đọc |
| Signature | Chữ ký điện tử | Touch-based signature pad | Lưu dạng inline image trong spreadsheet |
| Drawing | Vẽ tự do | Drawing pad trong app | Sketch, sơ đồ đơn giản |
| Video | Video (.mpeg, YouTube) | URL công khai | Không hỗ trợ quay video trong app |
Tips thực chiến:
- AppSheet lưu ảnh dưới dạng URL công khai (Google Drive, Cloud Storage) hoặc tên file thuần nếu dùng AppSheet DB.
Signaturecực kỳ hữu ích cho biên bản bàn giao, xác nhận nhận hàng, ký hợp đồng.- Để cho phép vẽ trên ảnh: Data → Columns → Edit → Display → Allow image annotation.
4.2.6 Nhóm 6: Communication Types (Kiểu Liên lạc)
Hai kiểu này biến dữ liệu thành hành động - bấm vào là gọi điện/gửi email ngay!
| Kiểu | Mô tả | Hành động khi tap | Lưu ý |
|---|---|---|---|
| Địa chỉ email | Mở app Mail để soạn email mới | Hỗ trợ auto-completion | |
| Phone | Số điện thoại | Hiển thị option Gọi hoặc SMS | AppSheet chỉ tự nhận format Bắc Mỹ |
Tips thực chiến:
- Với
PhoneVN (không phải format Bắc Mỹ), bạn cần khai báo thủ công kiểuPhonevì AppSheet không tự nhận.
4.2.7 Nhóm 7: Mappable Types (Kiểu Bản đồ)
Sức mạnh của GPS và bản đồ - dùng cho giao hàng, chấm công, field service.
| Kiểu | Mô tả | Khi nào dùng | Format |
|---|---|---|---|
| Address | Địa chỉ đầy đủ | Địa chỉ giao hàng, Địa chỉ khách hàng | 123 Nguyễn Huệ, Q1, TPHCM, VN |
| LatLong | Tọa độ GPS (Vĩ độ, Kinh độ) | Check-in, Vị trí hiện tại | 10.7769, 106.7009 |
| XY | Tọa độ trên ảnh tùy chỉnh | Vị trí trên sơ đồ, Bản đồ indoor | 50, 75 (50% từ trái, 75% từ trên) |
Tips thực chiến về Address:
- Đặt tên cột chứa từ "Address" để AppSheet tự nhận (VD:
Customer Address,Billing Address).- Có thể tách thành nhiều cột (
Street,City,State,Country,Zip) → AppSheet tự động tạoComputed Address.- Nếu có nhiều địa chỉ, đặt prefix:
Home Street,Home CityvsWork Street,Work City.
Tips thực chiến về LatLong:
LatLong+ChangeLocation= Tự động ghi lại vị trí GPS khi có thay đổi → Check-in chấm công.- Xem mẫu: Calculate distances sample app.
4.2.8 Nhóm 8: Change Types (Kiểu Theo dõi Thay đổi)
Đây là nhóm "thông minh" - tự động cập nhật khi có thay đổi, không cần user nhập liệu.
| Kiểu | Mô tả | Tự động ghi lại | Ví dụ sử dụng |
|---|---|---|---|
| ChangeCounter | Đếm số lần chỉnh sửa | +1 mỗi lần edit | Theo dõi version, số lần cập nhật |
| ChangeLocation | Vị trí GPS lúc chỉnh sửa | Tọa độ hiện tại | Chấm công, Giao hàng |
| ChangeTimestamp | Thời điểm chỉnh sửa | DateTime hiện tại | Last Modified, Completed At |
| Update row timestamp | Timestamp cập nhật row (AppSheet DB) | Tự động bởi hệ thống | Audit trail |
Tips thực chiến:
ChangeTimestampcó thể cấu hình chỉ kích hoạt khi một cột cụ thể thay đổi!
- VD: Khi
[Status]đổi thành "Done" → cột[CompletedAt]tự động ghi timestamp.- Cấu hình: Data → Columns → Edit → Update behavior.
- Nếu app offline,
ChangeTimestampghi thời điểm thay đổi thực sự, không phải thời điểm sync.
4.2.9 Nhóm 9: Show Types (Kiểu Hiển thị)
Đây là kiểu đặc biệt - cột trống trong spreadsheet, chỉ dùng để cải thiện giao diện form và detail view.
| Kiểu | Mô tả | Khi nào dùng |
|---|---|---|
| Show | Hiển thị nội dung tĩnh | Nhúng hình ảnh, video, separator, hướng dẫn |
Tips thực chiến:
- Dùng
Showđể thêm tiêu đề section, hướng dẫn nhập liệu, hoặc hình ảnh minh họa vào form.- Xem chi tiết: Improve the presentation of detail and form views using Show types.
4.2.10 Nhóm 10: Other Types (Kiểu Khác)
Các kiểu đặc biệt cho những use case nâng cao.
| Kiểu | Mô tả | Khi nào dùng |
|---|---|---|
| URL | Địa chỉ web | Link website, Link tài liệu |
| App | Link đến app khác hoặc view khác | Deep link, Navigation |
| Multi Column Key | Khóa tổng hợp từ nhiều cột | Composite primary key |
Tips thực chiến về URL:
URLcó 2 phần: hyperlink address (https://google.com) và display text (Bấm vào đây).- Cấu hình display text: Data → Columns → Edit → Display → Content.
4.3 Bảng Tổng hợp Nhanh: Khi nào dùng kiểu nào?
| Mục đích | Kiểu nên dùng | Đừng dùng |
|---|---|---|
| Lưu tên người | Name |
Text chung chung |
| Ghi chú dài | LongText |
Text (không xuống dòng được) |
| Số lượng (nguyên) | Number |
Decimal (thừa) |
| Tiền tệ | Price |
Number hoặc Decimal |
| Phần trăm | Percent |
Decimal (khó đọc) |
| Ngày sinh | Date |
DateTime (thừa giờ) |
| Check-in | DateTime |
Date (thiếu giờ) |
| Trạng thái cố định | Enum |
Text (dễ gõ sai) |
| Tags/Skills | EnumList |
Text với comma (khó query) |
| Email có thể bấm gửi | Email |
Text |
| SĐT có thể bấm gọi | Phone |
Text hoặc Number |
| Ảnh chụp | Image |
URL thủ công |
| Chữ ký | Signature |
Image (không có pad) |
| Vị trí GPS | LatLong |
Text |
| Địa chỉ giao hàng | Address |
Text |
| Tham chiếu bảng khác | Ref |
Text chứa ID (mất liên kết) |
| Thời điểm cập nhật | ChangeTimestamp |
DateTime + formula (phức tạp) |
4.4 Google Sheets vs AppSheet Database vs SQL
| Đặc điểm | Google Sheets | AppSheet Database | Cloud SQL |
|---|---|---|---|
| Chi phí | Miễn phí | Miễn phí (trong gói) | Tốn phí Server |
| Dung lượng | < 100k dòng | < 50k dòng/bảng | Hàng triệu dòng |
| Tốc độ Sync | Trung bình | Nhanh | Rất nhanh |
| Chỉnh sửa tay | Rất dễ | Khá dễ | Cần kiến thức SQL |
| Phù hợp | SME, Mới bắt đầu | SME, Cần tốc độ | Doanh nghiệp lớn |
4.5 Lưu ý Tương thích giữa AppSheet và Nguồn dữ liệu
Khi AppSheet "đọc" một bảng từ Google Sheets, PostgreSQL hay MySQL, nó tự động ánh xạ (map) kiểu dữ liệu về dạng AppSheet Type. Nếu ánh xạ sai hoặc thiếu ràng buộc, bạn sẽ gặp lỗi "Data type mismatch".
| Kiểu SQL / Sheets | AppSheet tự nhận | Validation nên bổ sung | Lưu ý |
|---|---|---|---|
VARCHAR(255) / TEXT |
Text |
Valid_If = LEN([Column]) <= 255 |
PostgreSQL sẽ cắt phần dư, AppSheet không báo. |
NUMERIC(10,2) / Currency |
Price |
Type = Price, Currency = "VND" |
Nếu Sheets không định dạng tiền, AppSheet vẫn hiển thị "₫" nhưng SQL sẽ lưu số thuần → cần đồng bộ decimal. |
INT / INTEGER |
Number |
Type = Number, Min = 0, Max = 2147483647 |
Tránh lỗi "out of range" từ SQL. |
TIMESTAMP / DateTime |
DateTime |
Initial value = NOW() |
Google Sheets chỉ có DateTime dạng text → đảm bảo format yyyy-mm-dd hh:mm:ss để PostgreSQL chấp nhận. |
BOOLEAN |
Yes/No |
Không cần thêm | Sheets dùng TRUE/FALSE; AppSheet dùng Y/N nhưng vẫn tương thích. |
ENUM trong PostgreSQL |
Không tự nhận → Text |
Tạo Enum trong AppSheet + CHECK constraint trong SQL |
Đảm bảo 2 đầu khớp danh sách values. |
ARRAY (PostgreSQL) |
EnumList |
Type = EnumList, AllowOtherValues = false |
AppSheet lưu dạng text có phân cách dấu phẩy. |
GEOMETRY(Point) / PostGIS |
LatLong |
Type = LatLong |
AppSheet gửi "lat,long" text; cần hàm chuyển đổi trong PostgreSQL. |
4.5.1 Quy trình "3 bước" tránh xung đột
- Thiết kế DB trước: Đặt kiểu cột, CHECK, UNIQUE, NOT NULL ở SQL/Sheets.
- Regenerate: Vào Data → Tables → Regenerate trong AppSheet để ánh xạ lại.
- Thêm AppSheet-Only validation:
Valid_If,Required_If,Initial value,App formulađể lớp UI khớp logic hơn SQL.
4.6 Thực hành (Guided Practice)
Mục tiêu: Cấu hình Data Type chuẩn cho dự án CRM.
4.6.1 Cấu hình Bảng Customers
- Vào Tab Data -> Chọn bảng
Customers. - Bấm vào nút View Columns.
- Tìm cột
Phone: Đổi Type sang Phone. (Để trên điện thoại bấm vào là gọi ngay). - Tìm cột
Email: Đổi Type sang Email. - Tìm cột
Address: Đổi Type sang Address (Để hiện icon bản đồ). - Tìm cột
Avatar: Đổi Type sang Image.
4.6.2 Cấu hình Bảng Opportunities
- Vào bảng
Opportunities. - Tìm cột
Stage:- Đổi Type sang Enum.
- Bấm vào biểu tượng cây bút (Edit).
- Mục Values, bấm Add để thêm lần lượt:
New,Qualified,Proposal,Won,Lost. - Mục Input mode: Chọn
Buttons(để hiện nút bấm cho nhanh) hoặcDropdown.
- Tìm cột
Amount:- Đổi Type sang Price.
- Mục Currency symbol: Điền
₫hoặcVNĐ.
4.6.3 Lưu và Kiểm tra
- Bấm nút Save màu xanh ở góc phải trên cùng.
- Mở giao diện Preview bên phải, thử tạo mới một Customer và một Opportunity để xem sự thay đổi (Có nút chọn Stage, có ô chụp ảnh...).
4.7 Vận dụng (Your Project)
Câu hỏi:
- Chuẩn hóa dữ liệu nhập: Trong quy trình của bạn, có chỗ nào nhân viên hay gõ sai chính tả không? (Ví dụ: "Hà Nội", "HN", "hà nội"). -> Hãy chuyển nó thành Enum để họ chỉ được chọn.
- Bằng chứng công việc: Bạn có cần nhân viên chụp ảnh bằng chứng (giao hàng xong, lỗi kỹ thuật, biên lai) không? -> Hãy thêm cột Image.
- Xác nhận: Bạn có cần chữ ký xác nhận của khách hàng khi bàn giao không? -> Hãy thêm cột Signature.
- Theo dõi tự động: Bạn có cần biết ai sửa gì, lúc nào, ở đâu không? -> Hãy thêm ChangeTimestamp và ChangeLocation.
4.8 Tổng kết: Nền móng vững chắc cho ứng dụng
Bạn đã hoàn thành việc "dạy" AppSheet hiểu từng cột dữ liệu là gì (Text, Number, hay Image) để nó hiển thị đúng trên mobile. Việc chọn đúng Data Type ngay từ đầu giống như việc bạn chọn đúng vật liệu để xây nhà vậy - nó quyết định độ bền vững và tiện dụng của ngôi nhà đó.
Tuy nhiên, nếu để ý kỹ, bạn sẽ thấy các bảng dữ liệu của chúng ta (Khách hàng, Sản phẩm, Đơn hàng) vẫn đang đứng cô đơn, rời rạc. Sức mạnh thực sự của một hệ thống quản trị nằm ở sự kết nối. Trong chương 5, chúng ta sẽ học cách buộc các bảng này lại với nhau bằng những "sợi dây" vô hình nhưng cực kỳ bền chặt - đó chính là Quan hệ dữ liệu (Data Relationships).
4.9 Tổng kết: Nền móng vững chắc cho ứng dụng
Hiểu đúng và chọn đúng kiểu dữ liệu (Data Type) là bước đầu tiên để App chạy mượt và đúng logic.
- Bạn đã biết cách dùng
Enumđể tạo list cố định. - Bạn đã biết dùng
ImagevàFileđể lưu trữ tài liệu.
Nhưng sức mạnh thực sự của AppSheet nằm ở khả năng kết nối. Làm sao để nối bảng Khách hàng với Đơn hàng? Làm sao để từ Đơn hàng trỏ về Nhân viên phụ trách? Chương 5: "Quan hệ Dữ liệu (Data Relationships)" sẽ giải mã bí mật của các mối nối Ref thần thánh này.
4.10 Tài liệu tham khảo (Google Docs)
- Google AppSheet Documentation: Column data types - Tài liệu chính thống phân loại 10 nhóm kiểu dữ liệu
- Track app changes using change column types - Hướng dẫn sử dụng Change Types
- Display images and documents - Hướng dẫn hiển thị ảnh và tài liệu
- References between tables - Hướng dẫn tạo quan hệ Ref giữa các bảng
- Improve the presentation of detail and form views using Show types - Cải thiện giao diện với Show Types
- Set up email auto-completion for Email columns - Thiết lập auto-complete cho Email