Hướng dẫn tạo API ghi dữ liệu lên google sheet
Bài đăng này đã không được cập nhật trong 4 năm
Ở dự án, gần đây mình có được giao 1 task liên quan đến việc lưu giữ liệu lên google sheet sau khi khách hàng merged pull request để thực hiện tính toán và báo cáo lên cấp trên hoặc lấy ví dụ với các bạn đã quá quen việc sử dụng google form nhưng không muốn sử dụng giao diện của google mà muốn tạo riêng 1 form html theo ý mình sau đó lưu lại các phản hồi lên google sheet thì bên google sheet lại không có sẵn api để mình sử dụng nên chúng ta sẽ phải tự xây dựng api để ghi dữ liệu. Trong bài này mình sẽ chia sẻ cho mọi người 1 cách đơn giản để xây dựng api push dữ liệu từ nguồn nào đó vào google sheet.
Thiết lập google sheet
Đầu tiên chúng ta cần tạo 1 trang google sheets, bạn nào có rồi có thể bỏ qua bước này, truy cập đường dẫn: https://docs.google.com/spreadsheets/ sẽ mở trang google sheet giao diện như bên dưới sau đó chọn "Blank"
Thiết lập google script
Sau khi đã có 1 trang google sheet chúng ta sẽ đi viết script để ghi dữ liệu, trên thanh công cụ chọn Tools -> Script editor
Trình duyệt sẽ mở 1 tab google script
Thay đoạn code trong phần Code.gs thành nội dung sau
function doGet(e) {
return handleResponse(e);
}
var SHEET_NAME = "Sheet1";
var SCRIPT_PROP = PropertiesService.getScriptProperties();
function handleResponse(e) {
var lock = LockService.getPublicLock();
lock.waitLock(30000);
try {
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName(SHEET_NAME);
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow() + 1;
var row = [];
for (i in headers) {
row.push(e.parameter[headers[i]]);
}
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
return ContentService
.createTextOutput(JSON.stringify({"result": "success", "row": nextRow}))
.setMimeType(ContentService.MimeType.JSON);
} catch (e) {
return ContentService
.createTextOutput(JSON.stringify({"result": "error", "error": e}))
.setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
SCRIPT_PROP.setProperty("key", doc.getId());
}
Chú ý biến SHEET_NAME chính là tên của sheet bên trang google sheet, mặc định khi tạo mới sẽ là "Sheet1"
Lưu tập lệnh lại, chọn File -> Save
Chọn OK
Bước tiếp theo cần cấp quyền cho google script sử dụng tài khoản, chọn Run -> Run function -> setup
Chọn Review Permissions
Trình duyệt sẽ mở 1 cửa sổ mới, chọn vào tài khoản mình sẽ cấp quyền
Chọn Allow
Sau khi đã cấp quyền cho tài khoản bước tiếp theo chúng ta sẽ thực hiện lấy URL, chọn Publish -> Deploy as web app
Phần Who has access to the app thay đổi từ "Only myself" thành "Anyone, even anonymous" sau đó chọn Deploy
Copy URL và note lại để sử dụng cho việc push data
Ánh xạ google script qua google sheet
Viết xong phần script rồi chúng ta sẽ quay lại phần google sheet sửa như sau để kiểm tra xem việc ghi dữ liệu đã hoạt động chưa
-
Ở hàng 1 thêm 2 giá trị là field_1 và field_2
-
Giá trị đặt là gì cũng được nhưng phải tuân theo quy tắc đặt tên biến ở các ngôn ngữ lập trình, thứ tự cũng thế đặt ở đâu cũng được miễn là ở hàng 1
-
Copy URL (tạo ở phần google script) và thêm vào 1 đoạn như dưới sau đó ném lên trình duyệt ấn Enter chạy thử
?field_1=123&field_2=456
-
Ở màn hình trình duyệt hiển thị như dưới là đã thêm dữ liệu thành công, row chính là số dòng đã thêm vào google sheet
-
Quay lại google sheet kiểm tra kết quả
Sau khi đã kiểm tra việc ghi dự liệu thành công giờ mọi người chỉ cần xây dựng chức năng xử lý dữ liệu ở ứng dụng của mình sau đó gọi URL (tạo ở phần google script) bằng phường thức GET và truyền tham số vào sao cho tương ứng với giá trị đặt ở dòng 1 trong google sheet là ok. Phía dưới là 1 ví dụ trong ngôn ngữ javascript (sử dụng thư viện jQuery), các ngôn ngữ khác tương tự mọi người google thêm nhé.
var url = 'https://script.google.com/macros/s/abcdefghijklmnopqrstuvwxyz1234567890/exec';
var data = {
field_1: 123,
field_2: 456
};
$.ajax({
url: url,
method: "GET",
dataType: "json",
data: data
});
Nguồn tham khảo
- https://medium.com/@dmccoy/how-to-submit-an-html-form-to-google-sheets-without-google-forms-b833952cc175
- https://gist.github.com/willpatera/ee41ae374d3c9839c2d6
Đọc thêm
All rights reserved
Bình luận
Bài viết rất hay nhưng mình có 1 câu hỏi như này.
Việc dùng scrip tạo ra dữ liệu hoặc tính toán rồi đưa dữ liệu vào trang tính (sheet) là không mới mình từng thử nghịch nó dưới excel rồi (mò mẫm nghịch ngợm để gian dối trong thi cử thôi
). Nhưng một vấn đề là các bước thực hiện theo mình thì vẫn sẽ là truy cập file (sheet) -> thao tác với những cell với tọa độ -> bla bla -> đóng file.
Nói thật nó không khác gì mấy so với những gì bạn làm bên trên, nếu đặt vào bài toán sheet là 1 master data và những user có nhiều application cùng connect và thao tác giữ liệu thì rất tuyệt, nó đúng là 1 api với server là google (cool thật
). Từ đây có thể mở rộng ra quản lý role, sheet, row. column,... theo từng loại tài khoản. Theo mình hiểu ý bạn thì bài toàn được đặt ra chỉ là ghi lại dữ liệu vào sheet đó rồi gửi nó đến một nơi nào đó.
Nhưng theo ngu ý của mình ta có thể dùng driver api, ggsheet api làm việc này một cách dễ dàng và một điểm mình thấy hay hơn là chỉ cần push 1 tệp data duy nhất mỗi lầm đồng bộ là được. Mọi tính toán sẽ được xử lý dưới client nhằm tăng nhanh tốc độ xử lý và dảm bảo rằng connect 1 lần là có thể đẩy full dữ liệu đc rồi
.
Theo bạn 2 cách này cách nào ổn hơn nhỉ :-?. Mình định viết scrip mấy lần r nhưng đắn đo suy nghĩ nên mình lại viết api update file
. Bạn đã có kinh nghiệm cho vấn đề này rồi có thể cho mình 1 chút ý kiến được không
. Thank!
p/s: Mình không biết khách bạn yêu cầu như nào nên mình không có ý kiến gì nha