Một ứng dụng hữu ích của Google Docs API là hợp nhất thông tin từ một hoặc nhiều nguồn dữ liệu vào một tài liệu.
Trang này trình bày cách bạn có thể lấy dữ liệu từ một nguồn bên ngoài và chèn dữ liệu đó vào một tài liệu mẫu hiện có.
Mẫu là một loại tài liệu đặc biệt chứa cùng một văn bản cố định cho tất cả tài liệu được tạo từ mẫu, cùng với các phần giữ chỗ được chỉ định nơi có thể đặt văn bản động khác. Ví dụ: một mẫu hợp đồng có thể có nội dung cố định, cùng với các vị trí cho tên, địa chỉ và các thông tin khác của người nhận. Sau đó, ứng dụng của bạn có thể hợp nhất dữ liệu dành riêng cho khách hàng vào mẫu để tạo tài liệu hoàn chỉnh.
Cách tiếp cận này hữu ích vì một số lý do sau:
Nhà thiết kế có thể dễ dàng tinh chỉnh thiết kế của tài liệu bằng trình chỉnh sửa Google Tài liệu. Cách này dễ dàng hơn nhiều so với việc điều chỉnh các tham số trong ứng dụng để đặt bố cục được kết xuất.
Tách nội dung khỏi bản trình bày là một nguyên tắc thiết kế nổi tiếng với nhiều lợi ích.
Công thức cơ bản
Sau đây là ví dụ về cách bạn có thể sử dụng Docs API để hợp nhất dữ liệu vào một tài liệu:
Tạo tài liệu bằng nội dung giữ chỗ để hỗ trợ bạn thiết kế và định dạng. Mọi định dạng văn bản bạn muốn thay thế sẽ được giữ nguyên.
Đối với mỗi phần tử mà bạn sẽ chèn, hãy thay thế nội dung phần giữ chỗ bằng một thẻ. Hãy nhớ sử dụng những chuỗi không có khả năng xuất hiện một cách bình thường. Ví dụ:
{{account-holder-name}}
có thể là một thẻ phù hợp.Trong mã của bạn, hãy sử dụng Google Drive API để tạo bản sao của tài liệu.
Trong mã của bạn, hãy sử dụng phương thức
batchUpdate()
của Docs API với tên tài liệu và thêmReplaceAllTextRequest
.
Mã nhận dạng tài liệu tham chiếu đến một tài liệu và có thể được lấy từ URL
https://docs.google.com/document/d/documentId/edit
Ví dụ:
Hãy xem xét ví dụ sau đây, trong đó thay thế 2 trường trên tất cả các thẻ của một mẫu bằng các giá trị thực để tạo ra một tài liệu hoàn chỉnh.
Để thực hiện thao tác hợp nhất này, bạn có thể dùng mã bên dưới.
Java
String customerName = "Alice"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String date = formatter.format(LocalDate.now()); List<Request> requests = new ArrayList<>(); // One option for replacing all text is to specify all tab IDs. requests.add(new Request() .setReplaceAllText(new ReplaceAllTextRequest() .setContainsText(new SubstringMatchCriteria() .setText("{{customer-name}}") .setMatchCase(true)) .setReplaceText(customerName) .setTabsCriteria(new TabsCriteria() .addTabIds(TAB_ID_1) .addTabIds(TAB_ID_2) .addTabIds(TAB_ID_3)))); // Another option is to omit TabsCriteria if you are replacing across all tabs. requests.add(new Request() .setReplaceAllText(new ReplaceAllTextRequest() .setContainsText(new SubstringMatchCriteria() .setText("{{date}}") .setMatchCase(true)) .setReplaceText(date))); BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest(); service.documents().batchUpdate(documentId, body.setRequests(requests)).execute();
Node.js
let customerName = 'Alice'; let date = yyyymmdd() let requests = [ // One option for replacing all text is to specify all tab IDs. { replaceAllText: { containsText: { text: '{{customer-name}}', matchCase: true, }, replaceText: customerName, tabsCriteria: { tabIds: [TAB_ID_1, TAB_ID_2, TAB_ID_3], }, }, }, // Another option is to omit TabsCriteria if you are replacing across all tabs. { replaceAllText: { containsText: { text: '{{date}}', matchCase: true, }, replaceText: date, }, }, ]; google.options({auth: auth}); google .discoverAPI( 'https://docs.googleapis.com/$discovery/rest?version=v1&key={YOUR_API_KEY}') .then(function(docs) { docs.documents.batchUpdate( { documentId: '1yBx6HSnu_gbV2sk1nChJOFo_g3AizBhr-PpkyKAwcTg', resource: { requests, }, }, (err, {data}) => { if (err) return console.log('The API returned an error: ' + err); console.log(data); }); });
Python
customer_name = 'Alice' date = datetime.datetime.now().strftime("%y/%m/%d") requests = [ # One option for replacing all text is to specify all tab IDs. { 'replaceAllText': { 'containsText': { 'text': '{{customer-name}}', 'matchCase': 'true' }, 'replaceText': customer_name, 'tabsCriteria': { 'tabIds': [TAB_ID_1, TAB_ID_2, TAB_ID_3], }, }}, # Another option is to omit TabsCriteria if you are replacing across all tabs. { 'replaceAllText': { 'containsText': { 'text': '{{date}}', 'matchCase': 'true' }, 'replaceText': str(date), } } ] result = service.documents().batchUpdate( documentId=document_id, body={'requests': requests}).execute()
Quản lý mẫu
Đối với các tài liệu mẫu mà ứng dụng xác định và sở hữu, hãy tạo mẫu bằng cách sử dụng một tài khoản chuyên biệt đại diện cho ứng dụng. Tài khoản dịch vụ là một lựa chọn phù hợp và tránh được các vấn đề phức tạp liên quan đến chính sách của Google Workspace về việc hạn chế chia sẻ.
Khi tạo các bản sao của tài liệu từ mẫu, hãy luôn sử dụng thông tin đăng nhập của người dùng cuối. Điều này giúp người dùng có toàn quyền kiểm soát tài liệu kết quả và ngăn chặn các vấn đề về việc mở rộng quy mô liên quan đến giới hạn cho mỗi người dùng trong Drive.
Để tạo một mẫu bằng tài khoản dịch vụ, hãy thực hiện các bước sau bằng thông tin đăng nhập ứng dụng:
- Tạo tài liệu bằng cách sử dụng documents.create trong API Tài liệu.
- Cập nhật quyền để cho phép người nhận tài liệu đọc tài liệu đó bằng cách sử dụng permissions.create trong Drive API.
- Cập nhật quyền để cho phép tác giả mẫu ghi vào đó bằng cách sử dụng permissions.create trong Drive API.
- Chỉnh sửa mẫu theo yêu cầu.
Để tạo một phiên bản của tài liệu, hãy thực hiện các bước sau bằng thông tin đăng nhập của người dùng:
- Tạo bản sao của mẫu bằng cách sử dụng files.copy trong Drive API.
- Thay thế các giá trị bằng cách sử dụng documents.batchUpdate trong API Tài liệu.