Code.gs → Google Apps Script (API backend)
admin-config.html → Admin tạo & quản lý mẫu báo cáo
print.html → Trang in cho người dùng cuối
Code.gsSPREADSHEET_ID: "ID_CỦA_GOOGLE_SHEET"
// Lấy từ URL: https://docs.google.com/spreadsheets/d/[ID_Ở_ĐÂY]/edit
admin-config.html và print.htmlSau mỗi lần sửa Code.gs → phải Deploy lại (New deployment hoặc Edit version)
| Cách | Tốc độ setup | URL |
|---|---|---|
| GitHub Pages | 5 phút | username.github.io/repo/print.html |
| Cloudflare Pages | 3 phút | project.pages.dev/print.html |
| Google Sites | 2 phút | Embed trực tiếp vào trang Sites |
admin-config.html — tìm và sửa:
const API_URL = "https://script.google.com/macros/s/xxxx/exec";
const PRINT_APP_URL = "https://username.github.io/repo/print.html";
print.html — tìm và sửa:
const API_URL = "https://script.google.com/macros/s/xxxx/exec";
Mở admin-config.html → điền form:
| Trường | Ví dụ |
|---|---|
| Tên mẫu | Hóa đơn bán hàng |
| ID mẫu | hoa-don |
| Sheet | DonHang (chọn từ danh sách) |
| Cột | Tick + kéo thả sắp thứ tự |
| Loại | Hóa đơn / Bảng / Phiếu kho / Tổng hợp |
Nhấn Lưu → config ghi vào sheet _PrintConfig trong Google Sheet.
Action name : In hóa đơn
For a record: [table]
Do this : Open a link
URL : [copy từ ô "URL AppSheet Action" trong admin]
Ví dụ URL:
https://username.github.io/repo/print.html?id=[_UNIQUEID]&tpl=hoa-don&sheet=DonHang
| Param | Bắt buộc | Mô tả |
|---|---|---|
id |
✓ | [_UNIQUEID] — AppSheet tự điền |
sheet |
✓ | Tên sheet Google Sheets |
tpl |
Nên có | ID template → tự load config |
cols |
Tùy | Ghi đè danh sách cột |
preview=1 |
— | Dùng data demo, không cần ID thật |
autoprint=1 |
— | Tự mở hộp thoại in khi tải xong |
Trong admin, chọn loại “Tổng hợp nhiều sheet” → thêm “Sheet dữ liệu phụ”:
Sheet phụ: KhachHang | Join theo: MaKhachHang | Alias: customer
Sheet phụ: SanPham | Join theo: MaDonHang | Alias: items
Print App sẽ:
Trong admin → “Cột tính toán”:
Tên cột : Thành tiền
Công thức: {SoLuong} * {DonGia}
Tên cột : VAT 10%
Công thức: {ThanhTien} * 0.1
Kết quả tự tính khi render, không cần cột này có trong Google Sheet.
Mỗi app chỉ cần:
API_URL (1 Apps Script)print.htmltplId khác nhauKhông cần deploy lại, không cần code mới.
| Nơi | Khi nào |
|---|---|
| localStorage | Tải tức thì khi mở admin (offline-capable) |
Google Sheets _PrintConfig |
Master — đồng bộ mỗi khi mở admin |
Nhấn “Đồng bộ từ Sheets” để pull bản mới nhất về.
| Lỗi | Nguyên nhân | Cách sửa |
|---|---|---|
| “CORS” hoặc không kết nối | Apps Script chưa deploy đúng | Deploy lại, chọn Anyone |
| Không thấy sheet | SPREADSHEET_ID sai | Kiểm tra lại ID |
| Cột không hiện | Hàng 1 không phải header | Đảm bảo row 1 là tên cột |
| Trang trắng khi in | Lỗi JS | Mở ?preview=1 → F12 → Console |
| “Không tìm thấy dòng” | ID không khớp | Kiểm tra keyCol hoặc để trống |