Exploitez la puissance de l’API Google Docs au-delà du Document Service d’Apps Script

Google Apps Script propose deux outils puissants pour la gestion de documents Google : le Document Service (DocumentApp) pour les manipulations basiques, et l’API Google Docs pour un contrôle avancé et détaillé des éléments du document. Cet article fournit des exemples de scripts pour illustrer les capacités de l’API Google Docs.

Préparation : activer l’API Google Docs

Avant d’utiliser ces exemples, créez un document Google, obtenez son ID, et activez l’API Google Docs dans les services avancés de Google Apps Script.

Exemples de scripts pour l’API Google Docs

1. Changer l’orientation de la page

  • Description : Ce script modifie l’orientation d’une page entre “portrait” et “paysage”.
  • Utilité : Pratique pour formater des documents contenant des graphiques ou des tableaux nécessitant une orientation spécifique.
  • Script :
function changerOrientation() {
  const documentId = "###"; // Remplacez par l'ID du document.
  Docs.Documents.batchUpdate({
    requests: [{
      updateDocumentStyle: {
        documentStyle: { flipPageOrientation: true },
        fields: "flipPageOrientation",
      },
    }],
  }, documentId);
}

2. Fusionner des cellules dans un tableau

  • Description : Ce script fusionne des cellules adjacentes dans un tableau, selon les colonnes et les lignes définies.
  • Utilité : Utile pour regrouper des informations dans des tableaux complexes en unifiant certaines cellules.
  • Script :
function fusionnerCellules() {
  const documentId = "###";
  const obj = Docs.Documents.get(documentId).body.content;
  const table = obj.find((e) => e.table);
  if (!table) return;
  const requests = [];
  for (let r = 1; r < table.table.rows; r++) {
    requests.push({
      mergeTableCells: {
        tableRange: {
          columnSpan: 2,
          rowSpan: 1,
          tableCellLocation: {
            tableStartLocation: { index: table.startIndex },
            rowIndex: r,
            columnIndex: 1,
          },
        },
      },
    });
  }
  Docs.Documents.batchUpdate({ requests }, documentId);
}

3. Créer des notes de bas de page

  • Description : Insère des notes de bas de page en identifiant des espaces réservés dans le texte.
  • Utilité : Idéal pour ajouter des références ou des explications sans surcharger le corps du texte.
  • Script :
function ajouterNotesDeBasDePage() {
  const documentId = "###";
  const data = {
    "{{footnote1}}": { text: "Exemple de note 1", fontColor: "#ff0000" },
  };
  const obj = Docs.Documents.get(documentId).body.content;
  const requests = [];
  obj.forEach((e) => {
    if (e.paragraph) {
      e.paragraph.elements.forEach((f) => {
        if (f.textRun && data[f.textRun.content.trim()]) {
          requests.push(
            { createFootnote: { location: { index: f.startIndex } } },
            { deleteContentRange: { range: { startIndex: f.startIndex, endIndex: f.startIndex + f.textRun.content.length } } }
          );
        }
      });
    }
  });
  Docs.Documents.batchUpdate({ requests }, documentId);
}

4. Mettre en évidence les nombres en exposant dans les notes

  • Description : Ce script applique un fond coloré aux nombres en exposant dans les notes de bas de page.
  • Utilité : Améliore la lisibilité des références numérotées en les rendant plus visibles.
  • Script :
function surlignerExposants() {
  const documentId = "###";
  const obj = Docs.Documents.get(documentId).body.content;
  const requests = [];
  obj.forEach((e) => {
    if (e.paragraph) {
      e.paragraph.elements.forEach((f) => {
        if (f.footnoteReference) {
          requests.push({
            updateTextStyle: {
              range: { startIndex: f.startIndex, endIndex: f.endIndex },
              textStyle: { backgroundColor: { color: { rgbColor: { red: 1, green: 1, blue: 0 } } } },
              fields: "backgroundColor",
            },
          });
        }
      });
    }
  });
  Docs.Documents.batchUpdate({ requests }, documentId);
}

5. Réinitialiser les bordures et ombrages

  • Description : Supprime les bordures et les ombrages de tous les paragraphes d’un document.
  • Utilité : Reformatage utile pour donner un aspect uniforme au document après plusieurs modifications.
  • Script :
function resetBorduresEtOmbrages() {
  const documentId = "###";
  const obj = Docs.Documents.get(documentId).body.content;
  Docs.Documents.batchUpdate({
    requests: [{
      updateParagraphStyle: {
        range: { startIndex: 1, endIndex: obj[obj.length - 1].endIndex },
        paragraphStyle: {},
        fields: "borderBetween,borderBottom,borderTop,borderLeft,borderRight,shading"
      },
    }],
  }, documentId);
}

6. Créer des puces sous forme de cases à cocher

  • Description : Ajoute des cases à cocher comme puces à chaque élément de liste.
  • Utilité : Utile pour des listes de tâches ou de vérification dans un document partagé.
  • Script :
function creerPucesCasesACocher() {
  const documentId = "###";
  const items = ["Tâche 1", "Tâche 2", "Tâche 3"];
  const body = DocumentApp.openById(documentId).getBody();
  items.forEach(item => body.appendParagraph(item));
  const content = Docs.Documents.get(documentId).body.content;
  const requests = content.map((item, index) => ({
    createParagraphBullets: {
      bulletPreset: "BULLET_CHECKBOX",
      range: { startIndex: content[index].startIndex, endIndex: content[index].endIndex },
    }
  }));
  Docs.Documents.batchUpdate({ requests }, documentId);
}

7. Modifier les marges d’une section

  • Description : Ajuste les marges d’une section spécifique d’un document.
  • Utilité : Permet de personnaliser l’apparence des sections sans modifier tout le document.
  • Script :
function modifierMargeSection() {
  const documentId = "###";
  const sectionNumber = 1;
  const obj = Docs.Documents.get(documentId, {
    fields: "body(content(sectionBreak,startIndex,endIndex))",
  }).body.content.filter((e) => e.sectionBreak);
  const section = obj[sectionNumber - 1];
  const { startIndex, endIndex } = section;
  const requests = [
    { updateSectionStyle: { range: { startIndex, endIndex }, sectionStyle: { marginLeft: { unit: "PT", magnitude: 0 } }, fields: "marginLeft" } },
  ];
  Docs.Documents.batchUpdate({ requests }, documentId);
}

8. Empêcher le débordement des lignes d’un tableau

  • Description : Empêche les lignes de tableau de déborder sur plusieurs pages.
  • Utilité : Maintient le tableau sur une page pour une présentation cohérente.
  • Script :
function bloquerDebordementTable() {
  const documentId = "###";
  const tableNumber = 1;
  const tables = Docs.Documents.get(documentId).body.content.filter((e) => e.table);
  if (tables.length == 0) return;
  const table = tables[tableNumber - 1];
  Docs.Documents.batchUpdate({
    requests: [{
      updateTableRowStyle: {
        tableRowStyle: { preventOverflow: true },
        tableStartLocation: { index: table.startIndex },
        fields: "preventOverflow",
      },
    }],
  }, documentId);
}

Voici la suite et fin des exemples avec explications :

9. Définir un espacement personnalisé des lignes et paragraphes

  • Description : Ce script modifie l’espacement des lignes et des paragraphes dans le document.
  • Utilité : Pratique pour ajuster la lisibilité et donner un style spécifique à des sections de texte.
  • Script :
function espacementPersonnalise() {
  const documentId = "###";
  const obj = Docs.Documents.get(documentId).body.content.filter((e) => e.paragraph);
  const o1 = obj[0];
  const o2 = obj.pop();
  const requests = [
    { updateParagraphStyle: { paragraphStyle: { lineSpacing: 50 }, range: { startIndex: o1.startIndex, endIndex: o2.endIndex }, fields: "lineSpacing" } },
  ];
  Docs.Documents.batchUpdate({ requests }, documentId);
}

10. Remplacer les espaces réservés dans des paragraphes multiples

  • Description : Ce script remplace les espaces réservés (délimités par {{ }}) par du texte dans plusieurs paragraphes.
  • Utilité : Utile pour personnaliser des documents modèles, par exemple pour des courriers ou rapports générés automatiquement.
  • Script :
function remplacerEspacesReserves() {
  const documentId = "###";
  const replaceText = "supprimé";
  const doc = DocumentApp.openById(documentId);
  const matches = doc.getBody().getText().match(/\{\{[\s\S\w]+?\}\}/g);
  const requests = matches.map((text) => ({
    replaceAllText: { containsText: { matchCase: false, text }, replaceText },
  }));
  Docs.Documents.batchUpdate({ requests }, documentId);
}

11. Convertir les sauts de ligne souples en sauts de ligne durs et vice versa

  • Description : Ce script convertit les sauts de ligne souples en durs, ou inversement.
  • Utilité : Assure une présentation uniforme des paragraphes en unifiant les types de sauts de ligne.
  • Script :
function convertirSautsLigne() {
  const documentId = "###";
  Docs.Documents.batchUpdate({
    requests: [{
      replaceAllText: { replaceText: "\n", containsText: { text: "\u000b" } }
    }],
  }, documentId);
}

12. Gérer les bordures de tableau

  • Description : Ce script ajuste l’apparence des bordures d’un tableau, en définissant les styles, couleurs, et épaisseurs.
  • Utilité : Permet de structurer les informations dans les tableaux en fonction de leur importance.
  • Script :
function gererBorduresTableau() {
  const documentId = "###";
  const tables = Docs.Documents.get(documentId).body.content.filter((e) => e.table);
  const tableStart = tables[0].startIndex;
  const borders = ["borderTop", "borderBottom", "borderLeft", "borderRight"];
  const requests = [{
    updateTableCellStyle: {
      tableStartLocation: { index: tableStart },
      tableCellStyle: borders.reduce((o, e) => ((o[e] = { width: { magnitude: 0, unit: "PT" }, dashStyle: "SOLID", color: { color: { rgbColor: { blue: 0 } } } }), o), {}),
      fields: borders.join(","),
    },
  }];
  Docs.Documents.batchUpdate({ requests }, documentId);
}

13. Gérer les listes imbriquées

  • Description : Crée une liste imbriquée, avec des niveaux hiérarchiques visibles sous forme de retrait.
  • Utilité : Idéal pour structurer des informations de manière logique, en hiérarchisant les éléments.
  • Script :
function creerListesImbriquees() {
  const documentId = "###";
  const sampleList = ["Tâche 1", "  Sous-tâche 1.1", "  Sous-tâche 1.2", "Tâche 2"];
  const text = sampleList.reduce((t, e) => t += e.replace(/ /g, "\t") + "\n", "\n");
  const requests = [
    { insertText: { text, location: { index: 1 } } },
    { createParagraphBullets: { range: { startIndex: 2, endIndex: text.length + 1 }, bulletPreset: "NUMBERED_DECIMAL_NESTED" } },
  ];
  Docs.Documents.batchUpdate({ requests }, documentId);
}

14. Récupérer toutes les URL du document

  • Description : Ce script extrait toutes les URL présentes dans le document et les affiche en tant que tableau.
  • Utilité : Pratique pour créer une liste de toutes les références externes dans un document.
  • Script :
function recupererURLs() {
  const documentId = "###";
  const content = Docs.Documents.get(documentId).body.content;
  const urls = [];
  JSON.parse(JSON.stringify(content), (k, v) => { if (k == "url") urls.push(v); });
  console.log(urls);
}

Ces exemples montrent la flexibilité de l’API Google Docs, qui permet un contrôle avancé des documents pour des besoins variés, qu’il s’agisse de la présentation, de la gestion des données, ou de la personnalisation des documents modèles. En maîtrisant ces scripts, vous pouvez exploiter toute la puissance de Google Docs pour vos projets collaboratifs et professionnels.