Jednym z przydatnych zastosowań interfejsu Google Docs API jest scalanie informacji z co najmniej 1 źródła danych w dokumencie.
Na tej stronie dowiesz się, jak pobrać dane ze źródła zewnętrznego i wstawić je do istniejącego dokumentu szablonu.
Szablon to specjalny typ dokumentu zawierający ten sam stały tekst we wszystkich dokumentach utworzonych na jego podstawie, a także wyznaczone symbole zastępcze, w których można umieszczać inny tekst dynamiczny. Na przykład szablon umowy może zawierać stałą treść oraz miejsca na imię i nazwisko odbiorcy, adres i inne szczegóły. Aplikacja może następnie scalić dane konkretnego klienta z szablonem, aby utworzyć gotowe dokumenty.
To podejście jest przydatne z kilku powodów:
Projektanci mogą łatwo dopracować wygląd dokumentu za pomocą edytora Dokumentów Google. Jest to znacznie łatwiejsze niż dostosowywanie parametrów w aplikacji w celu ustawienia renderowanego układu.
Oddzielenie treści od prezentacji to znana zasada projektowania, która ma wiele zalet.
Podstawowy przepis
Oto przykład użycia interfejsu Docs API do scalania danych w dokumencie:
Utwórz dokument, używając treści zastępczych, aby ułatwić sobie projektowanie i formatowanie. Zachowane zostanie dowolne formatowanie tekstu, które chcesz zastąpić.
W przypadku każdego elementu, który chcesz wstawić, zastąp tekst zastępczy tagiem. Używaj ciągów znaków, które raczej nie występują normalnie. Na przykład dobrym tagiem może być
{{account-holder-name}}
.W kodzie użyj interfejsu Google Drive API, aby utworzyć kopię dokumentu.
W kodzie użyj metody interfejsu Docs API
batchUpdate()
z nazwą dokumentu i uwzględnijReplaceAllTextRequest
.
Identyfikatory dokumentów odwołują się do dokumentu i można je uzyskać z adresu URL.
https://docs.google.com/document/d/documentId/edit
Przykład
Rozważmy ten przykład, w którym 2 pola we wszystkich kartach szablonu są zastępowane rzeczywistymi wartościami, aby wygenerować gotowy dokument.
Aby przeprowadzić to scalanie, możesz użyć poniższego kodu.
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()
Zarządzaj szablonami
W przypadku dokumentów szablonu, które są zdefiniowane i należą do aplikacji, utwórz szablon przy użyciu dedykowanego konta reprezentującego aplikację. Konta usługi są dobrym wyborem i pozwalają uniknąć komplikacji związanych z zasadami Google Workspace, które ograniczają udostępnianie.
Gdy tworzysz instancje dokumentów na podstawie szablonów, zawsze używaj danych logowania użytkownika. Daje to użytkownikom pełną kontrolę nad dokumentem wynikowym i zapobiega problemom ze skalowaniem związanym z limitami na użytkownika na Dysku.
Aby utworzyć szablon za pomocą konta usługi, wykonaj te czynności, używając danych logowania aplikacji:
- Utwórz dokument za pomocą metody documents.create w interfejsie Docs API.
- Zaktualizuj uprawnienia, aby umożliwić odbiorcom dokumentu odczytanie go za pomocą funkcji permissions.create w interfejsie Drive API.
- Zaktualizuj uprawnienia, aby umożliwić autorom szablonów zapisywanie w nim danych za pomocą metody permissions.create w interfejsie Drive API.
- W razie potrzeby zmień szablon.
Aby utworzyć instancję dokumentu, wykonaj te czynności, używając danych logowania użytkownika:
- Utwórz kopię szablonu za pomocą metody files.copy w interfejsie Drive API.
- Zastąp wartości za pomocą metody documents.batchUpdate w interfejsie Docs API.