Các sản phẩm của AKA Lab được thiết kế để tận dụng tối đa các công cụ có sẵn trong hệ sinh thái Google Workspace. Chúng tôi tập trung vào những người dùng phổ thông, không chuyên về công nghệ. Vì thế, các công cụ của AKA Lab được xây dựng dựa trên kiến thức và kỹ năng mà người dùng bình thường đã có, ví dụ như kỹ năng sử dụng Google Sheets - một trong những công cụ phổ biến nhất với người dùng máy tính tại Việt Nam. Firebase là NoSQL database hiệu suất cao, phù hợp với các ứng dụng web cần realtime nhưng lại phức tạp với người dùng phổ thông chỉ cần mục đích lưu trữ nội dung form. Các chuyên viên tại AKA Lab đã tận dụng Google Forms để làm database đơn giản phục vụ mục đích lưu trữ.
Yêu cầu cơ bản¶
Một cơ sở dữ liệu phải hỗ trợ được 4 hành động cơ bản (gọi tắt là CRUD)
- Tạo mới/Create
- Truy vấn/Read/Query
- Cập nhật/Edit
- Xóa/Delete
Cài đặt¶
Tạo mới/Create¶
Với Google Forms bạn có thể submit dữ liệu mà không cần tương tác trực tiếp với UI của Google Forms mà thông qua URL. Cách làm xem tại đây How to submit responses to a Google Form using Apps Script?. Với phương thức này, chúng ta có thể tạo mới record trong Spreadsheet mà không cần phải code Apps Script, chỉ cần liên kết Google Forms với file Spreadsheet
Truy vấn/Read/Query¶
Truy vấn có thể thực hiện bằng hàm QUERY với Google Visual Query Language
Cập nhật/Edit¶
Chúng ta cần bật tùy chọn cho phép người dùng cập nhật nội dung đã submit

Google Forms cho phép người dùng cập nhật giá trị đã submit thông qua URL dạng https://docs.google.com/forms/d/e/1FAIpQLSfZE4_hX35xFqo3504_SIfPB5k-4zuLme3ae_xTq4QxxsueqA/formResponse?edit2=2_ABaOnue2DOlQsXnou5viPOupaRp7ANXgcOZb8_JfewdwbaVwvbRmbjNKhzxBotFKBMKFHdQ &entry.1745485693={Document}&entry.1408490212={ModifiedBy}&entry.95214425={ModifiedAt}&entry.988375443={IsDeleted}
Việc cần làm là lấy được giá trị editUrl của new submission đều này chúng ta cần đến Form Trigger, xem file Trigger.gs trong code project của form Database-Documents. Dưới đây là nội dung file Trigger.gs
// ⚠️ This is Form trigger.
// Open script editor from form interface
// Install it wia Triggers
function onFormSubmit(e) {
const formResponse = e.response;
const itemResponses = formResponse.getItemResponses();
const Id = "Id";
const EditUrl = "EditUrl";
const Created = "CreatedAt";
const Updated = "ModifiedAt";
let obj = {};
for (const item of itemResponses) {
obj[item.getItem().getTitle()] = item.getResponse();
}
let created = Utilities.parseDate(obj[Created], "GMT", "yyyy-MM-dd HH:mm:ss.sss").getTime();
let updated = obj[Updated] ? Utilities.parseDate(obj[Updated], "GMT", "yyyy-MM-dd HH:mm:ss.sss").getTime() : created;
const Diff = 5 * 1000;
if (updated - created <= Diff) {
// No updated since the timespan is too low
let endPoint = PropertiesService.getScriptProperties().getProperty("EndPoint");
if (endPoint) {
endPoint = endPoint.replace(`{${Id}}`, encodeURI(obj[Id]));
endPoint = endPoint.replace(`{${EditUrl}}`, encodeURI(formResponse.getEditResponseUrl().replace("viewform?", "formResponse?")));
UrlFetchApp.fetch(endPoint);
}
}
}
- Lấy New Url của form Document-Links (form phụ) theo cách ở trên, ví dụ: https://docs.google.com/forms/d/e/ 1FAIpQLScYAXtjFMy8N4vWz3t_ujZRJ-cRx5idKGUR8EQ-sFLYxc-qVQ /formResponse?entry.329640571={Id}&entry.463446545={EditUrl}
Nếu bạn copy từ template thì field id của Id và EditUrl sẽ không đổi, việc của bạn là thay thế FormId (bôi đậm) băng FormId của file Document-Links sinh ra
- Thêm thuộc tính EndPoint cho Project với giá trị là Url vừa lấy được

- Cài đặt trigger cho Form Documents như hình bên dưới
Xóa/Delete¶
Giải pháp của AKA Lab là sử dụng soft delete bằng cách cập nhật giá trị IsDeleted= 1 nên việc DeleteUrl cơ bản giống EditUrl nhưng ngắn hơn do chỉ cập nhật giá trị column IsDeleted
Updated by Lê Sĩ Quý 8 months ago · 9 revisions