Project

General

Profile

Sử Dụng Google Forms làm NoSQL Database » History » Version 4

Lê Sĩ Quý, 08/19/2025 07:29 PM

1 1 Lê Sĩ Quý
{{TOC}}
2 2 Lê Sĩ Quý
3 4 Lê Sĩ Quý
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ữ.
4 2 Lê Sĩ Quý
5
## Yêu cầu cơ bản
6
7
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)
8
- Tạo mới/Create
9
- Truy vấn/Read/Query
10
- Cập nhật/Edit
11
- Xóa/Delete
12 3 Lê Sĩ Quý
13
## Cài đặt
14
15
### Tạo mới/Create
16
17
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?](https://spreadsheet.dev/submit-responses-to-google-form-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
18
19
### Truy vấn/Read/Query
20
21
Truy vấn có thể thực hiện bằng hàm QUERY với [Google Visual Query Language](https://developers.google.com/chart/interactive/docs/querylanguage)
22
23
###  Cập nhật/Edit
24
25
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}
26
27
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*
28
29
``` javascript
30
// ⚠️ This is Form trigger. 
31
//    Open script editor from form interface
32
//    Install it wia Triggers
33
function onFormSubmit(e) {
34
    const formResponse = e.response;
35
    const itemResponses = formResponse.getItemResponses();
36
    const Id = "Id";
37
    const EditUrl = "EditUrl";
38
    const Created = "CreatedAt";
39
    const Updated = "ModifiedAt";
40
    let obj = {};
41
42
    for (const item of itemResponses) {
43
        obj[item.getItem().getTitle()] = item.getResponse();
44
    }
45
    
46
    let created = Utilities.parseDate(obj[Created], "GMT", "yyyy-MM-dd HH:mm:ss.sss").getTime();
47
    let updated = obj[Updated] ? Utilities.parseDate(obj[Updated], "GMT", "yyyy-MM-dd HH:mm:ss.sss").getTime() : created;
48
    const Diff = 5 * 1000;
49
50
    if (updated - created <= Diff) {
51
        // No updated since the timespan is too low
52
        let endPoint = PropertiesService.getScriptProperties().getProperty("EndPoint");
53
        
54
        if (endPoint) {
55
            endPoint = endPoint.replace(`{${Id}}`, encodeURI(obj[Id]));
56
            endPoint = endPoint.replace(`{${EditUrl}}`, encodeURI(formResponse.getEditResponseUrl().replace("viewform?", "formResponse?")));
57
            UrlFetchApp.fetch(endPoint);
58
        }
59
    }
60
}
61
```