A
Đăng nhập

Chương 7: Hệ sinh thái Công thức (The Formula Ecosystem) - Vũ Khí Của Chuyên Gia

AppSheet Formulas

"Đừng học thuộc lòng 1000 hàm. Hãy học cách kết hợp 5 hàm cơ bản để giải quyết 1000 vấn đề." - Hiền Nguyễn

Nếu bạn đang cố gắng nhớ hết cú pháp của AppSheet như học từ vựng tiếng Anh, thì bạn đang đi sai hướng. AppSheet không giống Excel. Trong Excel, hàm VLOOKUP luôn hoạt động giống nhau dù bạn đặt nó ở ô A1 hay Z100. Nhưng trong AppSheet, công thức phụ thuộc vào ngữ cảnh (Context).

Một công thức chạy ngon lành trong Virtual Column có thể gây lỗi nát App nếu đặt vào Slice. Một hàm chạy nhanh trên 100 dòng có thể làm treo máy ở 10.000 dòng.

Chương này không dạy bạn cú pháp (bạn có thể tra Google). Chương này dạy bạn Tư duy chiến lược: Viết cái gì? Viết ở đâu? Và Viết thế nào để App không "chết"?

7.1 Bản Chất "Bất Quy Tắc" Của AppSheet

Hãy chấp nhận sự thật này: AppSheet không có một quy tắc cú pháp thống nhất.

  • Trong SELECT, bạn so sánh [Cot] = [_THISROW].[Cot].
  • Nhưng trong LINKTOFORM, bạn lại dùng [Cot] = [GiaTri].
  • Trong Show_If, TRUE hiện, FALSE ẩn.
  • Trong Valid_If, TRUE hợp lệ, FALSE báo lỗi (nhưng cũng dùng để tạo Dropdown list).

=> Tuyệt chiêu: Đừng đoán mò. Hãy dùng chức năng Test trong Expression Assistant để xem kết quả trả về là List, Text, hay Yes/No.

7.2 Chiến Lược: Đặt Công Thức Ở Đâu? (The Placement Strategy)

Đây là phần quan trọng nhất phân biệt "Newbie" và "Expert". Cùng một bài toán "Tính tồn kho", đặt sai chỗ là dự án thất bại.

Chúng ta có 4 tầng xử lý dữ liệu, từ Nhanh nhất (Real-time) đến Mạnh nhất (Heavy lifting):

Tầng xử lý Công cụ Đặc điểm Khi nào dùng?
Tầng 1: UI / Device Virtual Column Tính toán tức thì trên máy người dùng. Hiển thị phụ, tính toán nhẹ (A * B), Logic hiển thị (Show_If). Tuyệt đối tránh SELECT bảng lớn tại đây.
Tầng 2: Data Write App Formula (Real Column) Tính khi người dùng bấm Save/Edit. Dữ liệu tĩnh (Thành tiền, Ngày tạo). Lưu chết vào Database để không phải tính lại.
Tầng 3: Server Async Automation / Bot Chạy ngầm sau khi Sync. Tác vụ nặng, gửi Email, tạo PDF, cập nhật hàng loạt bảng con.
Tầng 4: Backend Google Sheets / Apps Script Chạy trên Spreadsheet. Các phép tính mảng (ArrayFormula) siêu phức tạp mà AppSheet không làm được. Xử lý dữ liệu định kỳ (Nightly jobs).

Case Study Thực Chiến: Bạn cần tính "Tổng doanh số của Khách hàng A trong năm nay" (Bảng Đơn hàng có 50.000 dòng).

  • (-) Cách sai: Tạo Virtual Column trong bảng Khách hàng: SUM(SELECT(DonHang[Tien], [KhachHang]=[_THISROW])).
    • Hậu quả: Mỗi lần mở danh sách Khách hàng, App phải quét 50.000 dòng x Số lượng khách -> App treo.
  • (+) Cách đúng: Dùng Automation. Khi có đơn hàng mới, Bot tự cộng thêm tiền vào cột TongDoanhSo (Real Column) của bảng Khách hàng. Hoặc dùng Apps Script tính định kỳ mỗi đêm.

7.3 Bộ Tứ Siêu Đẳng: Làm Chủ Mọi Tình Huống

Thay vì học lan man, hãy luyện thành thục 4 combo sau. Chúng giải quyết 90% bài toán.

Combo 1: "Cây Dao Thụy Sĩ" - ANY(SELECT(...))

AppSheet không có hàm VLOOKUP linh hoạt như Excel (Hàm LOOKUP của nó rất hạn chế). Hãy quên LOOKUP đi. Hãy dùng ANY(SELECT(...)).

  • Bài toán: Lấy Giá Bán của Sản Phẩm mới nhất mà khách này từng mua.
  • Công thức:
    ANY(
      SELECT(
        DonHang[GiaBan],
        AND(
          [KhachHang] = [_THISROW].[KhachHang],
          [SanPham] = [_THISROW].[SanPham]
        )
      )
    )
    
  • Tại sao mạnh?: SELECT lọc ra danh sách, ANY lấy giá trị đầu tiên. Bạn có thể lọc theo bao nhiêu điều kiện tùy thích (điều mà LOOKUP bó tay).

Combo 2: "Lấy Cái Mới Nhất" - INDEX(ORDERBY(...))

Bài toán kinh điển: Lấy đơn giá nhập hàng gần nhất.

  • Công thức:
    INDEX(
      ORDERBY(
        SELECT(
          NhapKho[DonGia],
          [MaSP] = [_THISROW].[MaSP]
        ),
        [NgayNhap],
        TRUE
      ),
      1
    )
    
    Ghi chú: TRUE = Descending (Giảm dần). 1 = Lấy phần tử đầu tiên.
  • Giải thích: Lọc giá -> Sắp xếp ngày giảm dần -> Lấy cái đầu tiên (Mới nhất).

Combo 3: "Xử Lý List" - LIST() - LIST()

Làm sao để tìm ra "Những nhân viên CHƯA chấm công hôm nay"?

  • Tư duy: Lấy [Danh Sách Tất Cả NV] trừ đi [Danh Sách Đã Chấm Công].
  • Công thức:
    SELECT(NhanVien[MaNV], TRUE) 
    - 
    SELECT(ChamCong[MaNV], [Ngay] = TODAY())
    
  • Kết quả: Trả về danh sách những người chưa có mặt. Dùng cái này để gửi Noti nhắc nhở thì tuyệt vời.

Combo 4: "Ràng Buộc Kép" - AND(..., IN(...))

Dùng trong Valid_If để tạo Dropdown phụ thuộc (Dependent Dropdown) xịn. Ví dụ: Chọn Tỉnh -> Chọn Huyện (Chỉ hiện huyện của tỉnh đó).

  • Công thức (Tại cột Huyện):
    IN(
      [_THIS],
      SELECT(
        Huyen[TenHuyen],
        [Tinh] = [_THISROW].[Tinh]
      )
    )
    

7.4 Thực Hành: Tối Ưu Hóa App CRM

Mục tiêu: Thay thế các Virtual Column nặng nề bằng Real Column + Automation.

7.4.1 Rà soát (Audit)

Vào tab Data -> Columns. Tìm các cột có biểu tượng "Máy tính màu xanh" (Virtual Column). Nếu thấy công thức nào dùng SELECT, FILTER hoặc REF_ROWS trên bảng lớn (>5000 dòng), hãy khoanh vùng lại.

7.4.2 Chuyển đổi (Refactor)

Giả sử ta có Virtual Column [SoLanMua] = COUNT([Related Orders]).

  1. Tạo thêm cột thật [SoLanMua_Real] (Number) trong Google Sheet. Regenerate Structure.
  2. Tạo Automation (Bot):
    • Event: Khi bảng OrdersAdds hoặc Deletes.
    • Process:
      • Bước 1: Tìm khách hàng tương ứng.
      • Bước 2: Update cột [SoLanMua_Real] = [SoLanMua_Real] + 1 (Nếu Add) hoặc -1 (Nếu Delete).
  3. Xóa Virtual Column cũ.

Kết quả: App mở lên nhanh gấp đôi vì không phải đếm lại đơn hàng mỗi khi sync.


7.5 Tổng kết: Biến công thức thành vũ khí

Công thức trong AppSheet là một nghệ thuật cân bằng giữa Tính năng (Functionality)Hiệu năng (Performance).

  • Biết viết công thức là tốt.
  • Biết khi nào KHÔNG NÊN viết công thức (mà dùng Automation/Backend) mới là chuyên gia.

Giờ đây, khi bạn đã có trong tay bộ vũ khí Công thức mạnh mẽ này, bạn đã sẵn sàng để kiến tạo những hệ thống báo cáo đỉnh cao. Chương 8: "Dashboard - Sức mạnh & Giới hạn" sẽ hướng dẫn bạn cách dùng chính những công thức này để tạo ra các lát cắt dữ liệu (Slices) thông minh, biến Dashboard tĩnh thành một trung tâm điều hành tương tác (Interactive) thực sự.


7.6 Tài liệu tham khảo (Google Docs)