Ce guide explique comment utiliser l'API Google Docs pour fusionner des informations provenant d'une ou de plusieurs sources de données externes dans un document modèle existant.
Un modèle est un type de document contenant du texte fixe et des espaces réservés pour le contenu dynamique. Par exemple, un modèle de contrat peut contenir du texte fixe avec des espaces réservés pour le nom et l'adresse du destinataire. L'application fusionne ensuite les données spécifiques à l'utilisateur dans le modèle pour créer le document final.
Cette approche est utile pour plusieurs raisons :
Les concepteurs peuvent affiner la conception d'un document à l'aide de Google Docs. Cette méthode est plus simple que le réglage des paramètres dans votre application pour définir la mise en page rendue.
La séparation du contenu et de la présentation est un principe de conception bien connu qui présente de nombreux avantages.
Fonctionnement de la fusion de documents
Voici un exemple d'utilisation de l'API Docs pour fusionner des données dans un document :
Créez votre document à l'aide d'un contenu d'espace réservé pour vous aider à concevoir et à mettre en forme. Toute mise en forme de texte que vous souhaitez remplacer est conservée.
Pour chaque élément que vous insérerez, remplacez le contenu de l'espace réservé par une balise. Veillez à utiliser des chaînes qui ne sont pas susceptibles de se produire normalement. Par exemple,
{{account-holder-name}}peut être une bonne balise.Dans votre code, utilisez l'API Google Drive pour créer une copie du document.
Dans votre code, utilisez la méthode
batchUpdatede l'API Docs avec le nom du document et incluez unReplaceAllTextRequest.
Les ID de document font référence à un document et peuvent être dérivés de l'URL :
https://docs.google.com/document/d/DOCUMENT_ID/edit
Gérer les modèles
Pour les documents modèles que l'application définit et possède, créez le modèle à l'aide d'un compte dédié représentant l'application. Les comptes de service sont un bon choix et évitent les complications liées aux règles Google Workspace qui limitent le partage.
Lorsque vous créez des instances de documents à partir de modèles, utilisez toujours les identifiants de l'utilisateur final. Les utilisateurs peuvent ainsi contrôler pleinement le document résultant et éviter les problèmes de scaling liés aux limites par utilisateur dans Google Drive.
Pour créer un modèle à l'aide d'un compte de service, procédez comme suit avec les identifiants de l'application :
- Créez un document à l'aide de
documents.createdans l'API Docs. - Mettez à jour les autorisations pour permettre aux destinataires du document de le lire à l'aide de
permissions.createdans l'API Drive. - Mettez à jour les autorisations pour permettre aux auteurs du modèle d'y écrire à l'aide de
permissions.createdans l'API Drive. - Modifiez le modèle selon vos besoins.
Pour créer une instance du document, procédez comme suit avec les identifiants de l'utilisateur :
- Créez une copie du modèle à l'aide de
files.copydans l' API Drive. - Remplacez les valeurs à l'aide de
documents.batchUpdatedans l'API Docs.
Exemple : Fusionner des données dans un modèle
L'exemple de code suivant montre comment remplacer deux champs dans tous les onglets d'un modèle par des valeurs réelles pour générer un document final :
Pour effectuer cette fusion, utilisez le code suivant :
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()
Gérer les listes et les tables dynamiques
Une fusion de documents standard utilise ReplaceAllTextRequest pour remplacer des espaces réservés individuels
ponctuels (tels que {{customer-name}} ou
{{date}}). Toutefois, si vos données incluent
une liste dynamique d'éléments (tels que des lignes dans une facture, une liste de produits commandés
ou un tableau dynamique), vous ne pouvez pas utiliser le remplacement de texte standard, car
le nombre d'éléments est inconnu lors de la conception du modèle.
Pour gérer le contenu de la liste dynamique, utilisez l'une des stratégies suivantes.
Option 1 : Ajouter des lignes à un tableau de modèle
Si votre document modèle contient déjà un tableau mis en forme (par exemple, avec une ligne d'en-tête et une seule ligne d'espace réservé), vous pouvez cloner et remplir dynamiquement des lignes pour chaque élément de votre liste :
- Lire la structure du modèle : utilisez la méthode
documents.getpour localiser le tableau et identifier l' index de la ligne du modèle. - Insérer de nouvelles lignes : pour chaque élément de votre liste de données (à l'exception du premier
élément, qui peut réutiliser la ligne de modèle existante), appelez
InsertTableRowRequestpour insérer une nouvelle ligne sous la ligne de modèle. - Remplir les données des cellules : remplissez les cellules de la ligne de modèle en remplaçant ses espaces réservés. Pour les lignes nouvellement créées, utilisez
InsertTextRequestpour insérer le texte correspondant dans l'emplacement des coordonnées de chaque cellule.
Pour obtenir des exemples d'insertion de lignes de tableau, consultez Utiliser des tableaux.
Option 2 : Remplacer une balise par un tableau généré
Si vous souhaitez créer le tableau de toutes pièces par programmation :
- Placer une balise d'espace réservé : utilisez une seule balise (telle que
{{invoice-table}}) dans le document modèle pour indiquer où la liste doit être placée. - Localiser l'espace réservé : utilisez une opération de recherche pour trouver l'index de début de la balise.
- Supprimer l'espace réservé : utilisez
DeleteContentRangeRequestpour supprimer le texte{{invoice-table}}. - Insérer le tableau : envoyez une
InsertTableRequestà cet index de début, en spécifiant le nombre de lignes et de colonnes en fonction de votre source de données. - Écrire des valeurs : remplissez chaque cellule du tableau de manière séquentielle.
Pour obtenir des exemples d'insertion de tableaux par programmation, consultez Utiliser des tableaux.