Chào quý anh chị và các bạn đã quay trở lại với series thực hành AppSheet của mình! Hôm nay mình sẽ không làm gì quá to tát, mà cùng nhau dựng một ứng dụng nhỏ gọn nhưng cực kỳ hữu ích: Recipes App – ứng dụng lưu trữ công thức nấu ăn.Mỗi ngày mình học được món gì thì mình lưu lại, khi nào nấu lại lôi ra xài theo đúng công thức là có món ăn ngon cho gia đình, Đặc biệt giúp mình không quên món và công thức riêng, khẩu vị của mình và gia đình, Và với những món lâu lâu mới nấu lại mình cũng không quên các thành phần và định lượng để nấu.
Mục lục.
Ứng dụng này phù hợp với ai? Rất nhiều đối tượng:
- Các bạn học viên ngành đầu bếp – ẩm thực, cần lưu lại công thức đã học để không quên.
- Các chủ quán ăn, nhà hàng muốn kiểm soát định lượng nguyên liệu và tính giá thành món ăn.
- Và đơn giản nhất, những ai yêu thích nấu ăn, muốn có một “cuốn sổ tay công thức” của riêng mình, gọn gàng trên điện thoại và mang theo đi đâu cũng có thể trổ tài.
Video tự làm app quản lý Công Thức Nấu Ăn với AppSheet | Link Youtube
Điểm hay của app này là nó không chỉ lưu công thức dạng văn bản, mà còn giúp bạn quản lý định lượng nguyên liệu cho từng món, từ đó biết được nấu một phần (hay nhiều phần) thì cần bao nhiêu nguyên liệu, và tự động ước tính giá thành của món ăn dựa trên đơn giá nguyên liệu đầu vào. Toàn bộ chỉ mất hơn 30 phút thực hiện. Bắt đầu thôi!
Thiết kế dữ liệu trên Google Sheet
Cũng như mọi app AppSheet khác, việc đầu tiên là chuẩn bị “bộ khung” dữ liệu trên Google Sheet. Mình tạo một file mới, đặt tên là Recipe (công thức), và thiết kế 3 sheet chính.
Sheet “Món ăn”
Đây là bảng trung tâm, lưu thông tin tổng quan của từng món:
- ID món ăn – mã định danh, để hệ thống tự sinh
- Tên món ăn
- Hình ảnh – ảnh minh họa món ăn
- Công thức nấu ăn – phần mô tả cách chế biến (các bước nấu)
Phần công thức nấu ăn ở đây quan trọng vì trên mạng có rất nhiều công thức khác nhau cho cùng một món. Khi bạn tìm được công thức ưng ý, hoặc học được từ một người thầy nào đó, hãy lưu lại đây. Sau này lỡ quên cách nấu, mở app ra là có ngay, không phải lục lại từ đầu.
Sheet “Nguyên liệu”
Bảng này lưu danh sách các loại nguyên liệu dùng chung cho tất cả món ăn:
- ID nguyên liệu
- Tên nguyên liệu
- Đơn vị tính (kg, gam, lít…)
- Đơn giá (giá theo đơn vị tính)
- Cập nhật – cột lưu thời điểm thay đổi giá
Lưu ý là nguyên liệu được thiết kế dùng chung: một loại như “hành lá” có thể xuất hiện trong nhiều món khác nhau, chứ không gắn chết vào một món cụ thể.
Sheet “Định lượng”
Đây là bảng “cầu nối” giữa Món ăn và Nguyên liệu, đóng vai trò quan trọng nhất trong việc tính toán:
- ID định lượng – hệ thống tự sinh
- Món ăn – liên kết (Ref) tới bảng Món ăn
- Nguyên liệu – liên kết (Ref) tới bảng Nguyên liệu
- Số lượng cần – định lượng nguyên liệu cần dùng
- Thành tiền – tự tính bằng công thức
- Cập nhật
- Tên món ăn, Tên nguyên liệu – hai cột phụ, lấy tên hiển thị thay vì chỉ hiện mã ID (để khi xem dữ liệu thô, bạn vẫn biết ngay đây là món gì, nguyên liệu gì, phòng khi phần mềm có trục trặc thì dữ liệu gốc vẫn đọc hiểu được).
Vì sao bảng Định lượng lại “trực thuộc” (child) của Món ăn mà không phải Nguyên liệu? Vì logic là: nếu bạn xóa một món ăn (ví dụ món Phở), thì các dòng định lượng gắn với món Phở cũng nên mất theo. Nhưng nếu bạn xóa nguyên liệu “Hành lá” thì không hợp lý, vì hành lá còn được dùng ở nhiều món khác – nên Nguyên liệu chỉ liên kết (Ref) chứ không thiết lập là con trực thuộc của Định lượng.
Tạo app từ dữ liệu
Sau khi có đủ 3 bảng và ít dữ liệu mẫu, vào Extensions (Tiện ích) → AppSheet → Create an app để AppSheet tự động quét cấu trúc và tạo app mẫu ban đầu.
Tiếp theo, khai báo lại kiểu dữ liệu (column type) cho từng cột:
- Cột Món ăn và Nguyên liệu trong bảng Định lượng: chọn kiểu Ref, trỏ tới bảng tương ứng.
- Riêng cột Món ăn: tick chọn Is a part of? (là “con” của bảng Món ăn) – để khi xóa món ăn, các dòng định lượng liên quan cũng bị xóa theo.
- Cột Nguyên liệu: không tick “Is a part of?”, vì nguyên liệu dùng chung cho nhiều món.
- Cột Tên món ăn / Tên nguyên liệu: dùng công thức lấy tên từ bảng liên kết, ví dụ:
=[Món ăn].[Tên món ăn]
- Cột Số lượng cần: kiểu Decimal (số thập phân), để có thể nhập 0.2 kg, 0.15 kg… thay vì chỉ số nguyên.
- Cột Đơn giá, Đơn giá nguyên liệu: kiểu Number.
- Cột Đơn vị tính: dùng kiểu Enum, để người dùng có thể tự thêm giá trị mới (kg, gam, lít, bó, củ, trái…) tùy nhu cầu thực tế.
- Cột Công thức nấu ăn: dùng kiểu Long Text, vì công thức thường khá dài.
- Cột Cập nhật: kiểu DateTime.
Công thức tính “Thành tiền” cho từng nguyên liệu
Cột Thành tiền trong bảng Định lượng sẽ tự động tính bằng cách lấy số lượng cần nhân với đơn giá của nguyên liệu tương ứng:
=[Số lượng cần] * [Nguyên liệu].[Đơn giá]
Ví dụ: món Cơm tấm cần 0.2 kg gạo tấm, giá gạo tấm hiện tại 25.000đ/kg, thì thành tiền phần gạo là 5.000đ. Nếu sau này giá gạo tăng lên 30.000đ/kg, con số này sẽ tự cập nhật theo (mình sẽ nói kỹ hơn ở phần automation bên dưới).
Cột ảo tính giá ước tính của cả món ăn
Đây là phần thú vị nhất: làm sao để cộng tổng “Thành tiền” của tất cả nguyên liệu cấu thành nên một món, ra giá ước tính của cả món ăn – mà không phải cộng tay?
Vào bảng Món ăn, thêm một Virtual Column mới, đặt tên là Giá ước tính, dùng công thức:
=SUM(SELECT(Định lượng[Thành tiền], TRUE))
Ở đây, SELECT sẽ lấy toàn bộ giá trị cột “Thành tiền” trong các dòng định lượng thuộc về món ăn hiện tại (vì Định lượng là bảng con của Món ăn, nên AppSheet tự hiểu ngữ cảnh “con của dòng đang xét”), điều kiện TRUE nghĩa là lấy tất cả không lọc gì thêm, và SUM cộng tổng lại.
Kết quả: mỗi khi bạn thêm/sửa/xóa một dòng nguyên liệu trong định lượng của món, giá ước tính của món ăn đó sẽ tự động cập nhật ngay lập tức.
Ví dụ với món Cơm tấm gồm: gạo tấm (5.000đ) + sườn nướng (24.000đ) + củ cải ngâm giấm (5.000đ) → Giá ước tính hiển thị ngay 30.000đ mà không cần bấm nút tính toán nào cả.
Tự động đồng bộ khi giá nguyên liệu thay đổi (Automation)
Đây là phần “nâng cấp” giúp app thực sự thông minh. Vấn đề là: khi giá của một nguyên liệu thay đổi (ví dụ giá gạo tăng), thì các dòng Định lượng liên quan cũng cần được đánh dấu cập nhật, kéo theo giá ước tính của Món ăn cũng thay đổi theo.
Bước 1 – Tạo Action “Cập nhật định lượng”
Trong bảng Định lượng, tạo Action mới:
- Do this:
Data: set the values of some columns in this row - Set column Cập nhật =
NOW()(hàm lấy thời gian hiện tại)
Bước 2 – Tạo Automation (Bot) chạy khi Nguyên liệu thay đổi
Vào Automation → Bots, tạo bot mới, đặt tên “Cập nhật định lượng”:
- Event: khi bảng Nguyên liệu có thay đổi (Updates only)
- Process → Run a data action:
- Referenced Table: Định lượng
- Referenced Rows:
SELECT(Định lượng[ID định lượng], [Nguyên liệu] = [_THISROW].[ID nguyên liệu])
- Referenced Action: chọn Action “Cập nhật định lượng” đã tạo ở bước 1
Bước 3 – Tương tự cho bảng Món ăn
Lặp lại logic trên với bảng Món ăn: tạo Action “Cập nhật món ăn” (cũng set cột Cập nhật = NOW()), rồi tạo thêm một Bot chạy khi bảng Định lượng có thay đổi (kể cả thêm hoặc xóa dòng), và gọi Action đó với điều kiện:
SELECT(Món ăn[ID món ăn], [ID món ăn] = [_THISROW].[Món ăn])
Từ giờ, chuỗi phản ứng dây chuyền sẽ hoạt động như sau: Đổi giá nguyên liệu → Định lượng tự cập nhật → Giá ước tính của Món ăn tự cập nhật theo. Bạn không cần làm gì thủ công cả.
Dọn dẹp giao diện cho gọn gàng, dễ nhìn
Sau khi phần “lõi” đã chạy đúng, bước cuối cùng là làm đẹp UX:
- Ẩn (
Hidehoặc setShow?= FALSE) các cột kỹ thuật mà người dùng không cần thấy: ID món ăn, ID nguyên liệu, ID định lượng, Tên món ăn/Tên nguyên liệu (vì đã có Ref hiển thị rồi), cột Cập nhật. - Trong View “Món ăn” chi tiết (Detail view): đưa Giá ước tính lên đầu để dễ thấy, đưa Công thức nấu ăn xuống cuối cùng vì nội dung dài.
- Với ảnh món ăn: chọn kiểu hiển thị hình tròn (thay vì vuông) cho đẹp mắt hơn – hợp với hình ảnh tô, dĩa món ăn.
- Trong View danh sách Món ăn: đặt Summary là cột Giá ước tính, để khi lướt danh sách món, bạn thấy ngay giá của từng món mà không cần bấm vào chi tiết.
- Tạo thêm 1 View kiểu Table, nhóm (Group by) theo Món ăn cho bảng Định lượng, để xem tổng quan “món nào gồm những nguyên liệu gì” một cách trực quan, sắp xếp theo alphabet cho dễ tìm.
- Đổi tên các view, cột sang tiếng Việt có dấu cho thân thiện, dễ đọc.
- Vào Settings → Options → Form, chọn kiểu hiển thị “side by side” để tên cột và ô nhập liệu nằm cạnh nhau, dễ thao tác khi nhập dữ liệu trên điện thoại.
Sau khi hoàn tất, app sẽ có giao diện gồm: danh sách món ăn kèm ảnh và giá ước tính, bấm vào từng món sẽ thấy công thức nấu, danh sách nguyên liệu và định lượng chi tiết, tất cả đồng bộ tự động khi có thay đổi giá.
Kết quả cuối cùng
Chỉ với hơn 30 phút, chúng ta đã có một ứng dụng hoàn chỉnh giúp:
- Lưu trữ công thức nấu ăn của riêng bạn, không sợ quên.
- Quản lý định lượng nguyên liệu chi tiết cho từng món, biết chính xác cần bao nhiêu nguyên liệu để nấu (dù là 1 phần hay nhiều phần ăn).
- Tự động ước tính giá thành món ăn dựa trên giá nguyên liệu đầu vào – cực kỳ hữu ích cho ai đang kinh doanh quán ăn nhỏ, cần tính giá vốn món ăn để lên menu.
- Tự động đồng bộ khi giá nguyên liệu biến động, không phải tính tay lại từng món.
App này tuy nhỏ nhưng thiết thực cho rất nhiều đối tượng: học viên bếp cần lưu công thức, chủ quán cần kiểm soát chi phí, hay đơn giản chỉ là người yêu bếp núc muốn có cuốn sổ tay công thức số hóa của riêng mình.
Cảm ơn quý anh chị và các bạn đã theo dõi!
Xem thêm các bài khác về hướng dẫn xây dựng ứng dụng bằng Appsheet của mình trên blog.
Hẹn gặp lại trong các video thực hành AppSheet tiếp theo nhé!