Bu kılavuzda, bir veya daha fazla harici veri kaynağındaki bilgileri mevcut bir şablon dokümanında birleştirmek için Google Dokümanlar API'sinin nasıl kullanılacağı açıklanmaktadır.
Şablon, sabit metin ve dinamik içerik için yer tutucular içeren bir belge türüdür. Örneğin, bir sözleşme şablonu, alıcının adı ve adresi için yer tutucular içeren sabit metinler içerebilir. Uygulama daha sonra, son belgeyi oluşturmak için kullanıcıya özel verileri şablonla birleştirir.
Bu yaklaşımın faydalı olmasının birkaç nedeni vardır:
Tasarımcılar, Google Dokümanlar'ı kullanarak bir dokümanın tasarımında ince ayarlar yapabilir. Bu, oluşturulan düzeni ayarlamak için uygulamanızdaki parametreleri ayarlamaktan daha basittir.
İçeriği sunumdan ayırmak, birçok avantajı olan iyi bilinen bir tasarım ilkesidir.
Belge birleştirme özelliğinin işleyiş şekli
Dokümanlar API'sini kullanarak verileri bir dokümanda nasıl birleştirebileceğinize dair bir örneği aşağıda bulabilirsiniz:
Tasarım ve biçimlendirme konusunda size yardımcı olması için yer tutucu içerik kullanarak dokümanınızı oluşturun. Değiştirmek istediğiniz tüm metin biçimlendirmeleri korunur.
Ekleyeceğiniz her öğe için yer tutucu içeriği bir <tag> ile değiştirin. Normalde oluşması muhtemel olmayan dizeler kullandığınızdan emin olun. Örneğin,
{{account-holder-name}}iyi bir etiket olabilir.Kodunuzda, dokümanın kopyasını oluşturmak için Google Drive API'yi kullanın.
Kodunuzda, doküman adıyla birlikte Docs API'nin
batchUpdateyöntemini kullanın ve birReplaceAllTextRequestekleyin.
Doküman kimlikleri bir dokümana referans verir ve URL'den türetilebilir:
https://docs.google.com/document/d/DOCUMENT_ID/edit
Şablonları yönetin
Uygulamanın tanımladığı ve sahip olduğu şablon belgeler için, uygulamayı temsil eden özel bir hesap kullanarak şablon oluşturun. Hizmet hesapları iyi bir seçimdir ve paylaşımı kısıtlayan Google Workspace politikalarıyla ilgili sorunları önler.
Şablonlardan doküman örnekleri oluştururken her zaman son kullanıcı kimlik bilgilerini kullanın. Bu sayede kullanıcılar, ortaya çıkan doküman üzerinde tam kontrol sahibi olur ve Google Drive'daki kullanıcı başına sınırlarla ilgili ölçeklendirme sorunları önlenir.
Hizmet hesabı kullanarak şablon oluşturmak için uygulama kimlik bilgileriyle aşağıdaki adımları uygulayın:
- Docs API'de
documents.createkullanarak doküman oluşturun. - Drive API'de
permissions.createkullanarak doküman alıcılarının dokümanı okumasına izin verecek şekilde izinleri güncelleyin. - İzinleri, şablon yazarlarının Drive API'deki
permissions.createkullanarak şablona yazmasına izin verecek şekilde güncelleyin. - Şablonu gerektiği gibi düzenleyin.
Dokümanın bir örneğini oluşturmak için kullanıcı kimlik bilgileriyle aşağıdaki adımları uygulayın:
- Drive API'de
files.copykullanarak şablonun bir kopyasını oluşturun. - Docs API'de
documents.batchUpdatekullanarak değerleri değiştirin.
Örnek: Verileri şablonda birleştirme
Aşağıdaki kod örneğinde, tamamlanmış bir belge oluşturmak için şablondaki tüm sekmelerde iki alanın gerçek değerlerle nasıl değiştirileceği gösterilmektedir:
Bu birleştirme işlemini gerçekleştirmek için aşağıdaki kodu kullanın:
Java
String customerName = "Alice"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String date = formatter.format(LocalDate.now()); // Make a copy of the template document using the Drive API. String copyTitle = "Merged Document"; File copyMetadata = new File().setName(copyTitle); File documentCopyFile = driveService.files().copy(DOCUMENT_ID, copyMetadata).execute(); String documentCopyId = documentCopyFile.getId(); Listrequests = 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(documentCopyId, 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, }, }, ]; // Make a copy of the template document using the Drive API. let copyTitle = 'Merged Document'; driveService.files.copy({ fileId: '1yBx6HSnu_gbV2sk1nChJOFo_g3AizBhr-PpkyKAwcTg', resource: { name: copyTitle, }, }, (err, driveResponse) => { if (err) return console.log('The Drive API returned an error: ' + err); let documentCopyId = driveResponse.data.id; 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: documentCopyId, 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") # Make a copy of the template document using the Drive API. copy_title = 'Merged Document' body = { 'name': copy_title } drive_response = drive_service.files().copy( fileId=DOCUMENT_ID, body=body).execute() document_copy_id = drive_response.get('id') 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_copy_id, body={'requests': requests}).execute()
Dinamik listeleri ve tabloları işleme
Standart belge birleştirme, tek seferlik yer tutucuları (ör. {{customer-name}} veya {{date}}) değiştirmek için ReplaceAllTextRequest kullanır. Ancak verilerinizde dinamik bir öğe listesi (ör. faturadaki satırlar, sipariş edilen ürünlerin listesi veya dinamik bir tablo) varsa şablon tasarımı sırasında öğe sayısı bilinmediğinden standart metin değiştirme özelliğini kullanamazsınız.
Dinamik liste içeriğini işlemek için aşağıdaki stratejilerden birini kullanın.
1. seçenek: Satırları bir şablon tablosuna ekleme
Şablon belgenizde zaten biçimlendirilmiş bir tablo varsa (örneğin, başlık satırı ve tek bir yer tutucu satır içeren), listenizdeki her öğe için satırları dinamik olarak klonlayıp doldurabilirsiniz:
- Şablon yapısını okuyun: Tabloyu bulmak ve şablon satırının
documents.getyöntemini kullanarak dizinini belirlemek için kullanın. - Yeni satırlar ekleme: Verilerinize göre listedeki her öğe için (mevcut şablon satırını yeniden kullanabilen ilk öğe hariç)
InsertTableRowRequestişlevini çağırarak şablon satırının altına yeni bir satır ekleyin. - Hücre verilerini doldurma: Şablon satırındaki hücreleri yer tutucularını değiştirerek doldurun. Yeni oluşturulan satırlarda, ilgili metni her hücrenin koordinat konumuna eklemek için
InsertTextRequestkullanın.
Tablo satırlarını ekleme örnekleri için Tablolarla çalışma başlıklı makaleyi inceleyin.
2. seçenek: Etiketi oluşturulan bir tabloyla değiştirme
Tabloyu programlı bir şekilde sıfırdan oluşturmak istiyorsanız:
- Yer tutucu etiket yerleştirin: Listenin nereye gideceğini işaretlemek için şablon belgesinde tek bir etiket (ör.
{{invoice-table}}) kullanın. - Yer tutucuyu bulun: Etiketin başlangıç dizinini bulmak için arama işlemi kullanın.
- Yer tutucuyu silme:
DeleteContentRangeRequestkullanarak{{invoice-table}}metnini kaldırın. - Tabloyu ekleyin: Başlangıç dizininde
InsertTableRequestgönderin. Satır ve sütun sayısını veri kaynağınıza göre belirleyin. - Değerleri yazma: Her tablo hücresini sırayla doldurun.
Tabloları programatik olarak ekleme örnekleri için Tablolarla çalışma başlıklı makaleyi inceleyin.