Numeriblog â€ș Hors-sujet â€ș Apps Script : GĂ©rer les onglets dans Docs

Apps Script : Gérer les onglets dans Docs

Si vous utilisez Google Docs rĂ©guliĂšrement, vous n’avez pas pu passer Ă  cĂŽtĂ© de cette mise Ă  jour : dĂ©sormais, vous avez accĂšs Ă  des onglets dans votre document ! L’ensemble des onglets se trouve dĂ©sormais Ă  [
]

personnes ont consulté cet article

4 minutes

Rédigé par Quentin Garcia - il y a 6 mois et modifié le 15/11/2024 à 16:23

Ce que vous allez découvrir

  • Un changement de structure et de comportement
  • AccĂ©der aux onglets et les manipuler
  • Position du curseur et sĂ©lection actuelle
  • Aller plus loin

Apps Script : Gérer les onglets dans Docs

Si vous utilisez Google Docs rĂ©guliĂšrement, vous n’avez pas pu passer Ă  cĂŽtĂ© de cette mise Ă  jour : dĂ©sormais, vous avez accĂšs Ă  des onglets dans votre document ! L’ensemble des onglets se trouve dĂ©sormais Ă  gauche de votre document, et chaque onglet se comporte en quelque sorte comme son propre document, l’ensemble des onglets formant le document dans son ensemble. Un changement appropriĂ© lorsque les documents numĂ©riques n’ont plus tant vocation Ă  ĂȘtre imprimĂ©s, et qu’une telle organisation rend ainsi la lecture plus digeste et le texte plus facile Ă  parcourir.

Un exemple de document Google Docs avec de nombreux onglets sur le cÎté

Mais pour chaque nouvelle fonctionnalitĂ© des outils Google Workspace vient la question fatidique : que peut-on faire avec Apps Script ? Une question plus que pertinente dans notre cas, car un tel changement bouleverse complĂštement la structure des documents pour Apps Script ! Faisons un petit tour de tout cela, et voyons les fonctions offertes aux dĂ©veloppeurs pour manipuler ces onglets.

Un changement de structure et de comportement

Si vous avez fait des scripts manipulant Google Docs, l’annonce de l’arrivĂ©e des onglets n’a pas dĂ» trop vous surprendre. En effet, plusieurs mails ont prĂ©venu que cette nouvelle fonctionnalitĂ© pourrait modifier significativement le comportement de scripts dĂ©jĂ  existants. Pourquoi cela ? Tout simplement parce que les documents ne sont plus organisĂ©s de la mĂȘme façon, et donc que le code pour accĂ©der aux diffĂ©rents Ă©lĂ©ments rĂ©plique ce changement !

Ainsi, la classe Document, centrale pour manipuler le document, possĂšde un certain nombre de mĂ©thodes qui permettaient d’accĂ©der ou de modifier directement des Ă©lĂ©ments texte. La liste de ces mĂ©thodes est fournie ici :

Toutes ces mĂ©thodes sont toujours fonctionnelles, mais avec l’arrivĂ©e des onglets, elles n’opĂšrent plus de la mĂȘme maniĂšre. Deux possibilitĂ©s :

  • Si votre script est liĂ© au document, alors ces mĂ©thodes s’appliqueront Ă  l’onglet actif du document.
  • Si votre script n’est pas liĂ© Ă  un document, alors ces mĂ©thodes s’appliqueront au premier onglet du document.

Si vos documents n’ont pas changĂ©, vos scripts sont donc toujours fonctionnels, puisque tout document comporte toujours un onglet par dĂ©faut. Toutefois, si vos utilisateurs changent vos anciens documents en rajoutant des onglets, prenez bien garde Ă  ce que vos scripts fassent bien ce qui est attendu d’eux ! Cela devrait ĂȘtre le cas en gĂ©nĂ©ral, mais il peut valoir le coup de repasser dessus pour vĂ©rifier.

Accéder aux onglets et les manipuler

IntĂ©ressons-nous dĂ©sormais aux onglets en eux-mĂȘmes. Y accĂ©der est extrĂȘmement simple, et est similaire Ă  l’accĂšs aux Sheets de SpreadsheetApp :

L’identifiant d’un onglet se trouve dans l’adresse, derriĂšre tab=. Par exemple, le premier onglet a toujours l’identifiant t.0. Vous pouvez aussi rĂ©cupĂ©rer l’identifiant d’un onglet avec la mĂ©thode Tab.getId().

Toutefois, une question se pose : qu’est-ce que j’entends par « les onglets de plus haut niveau » ?

Vous avez pu le remarquer, les onglets ne sont pas organisĂ©s comme des feuilles dans Sheets : il est possible de rajouter des sous-onglets Ă  tout onglet, et ce indĂ©finiment. Un onglet peut donc avoir un sous-onglet qui peut lui-mĂȘme avoir un sous-onglet qui
 bref. La structure des onglets est ici ce qu’on appelle en informatique un arbre, chaque onglet Ă©tant potentiellement un nƓud (ou parent) menant Ă  plusieurs autres branches (ses enfants).

Comment faire aller pour accĂ©der Ă  l’ensemble des onglets ? Il y a plusieurs solutions, en fonction du rĂ©sultat attendu, mais toutes les deux font appel Ă  la rĂ©cursion. La solution la plus simple, qui consiste Ă  simplement parcourir chaque onglet et rĂ©cupĂ©rer ses enfants (et ce de maniĂšre rĂ©cursive) et ajouter l’ensemble Ă  la liste des onglets trouvĂ©s est donnĂ©e en exemple par Google :

/**

 * Returns a flat list of all tabs in the document, in the order

 * they would appear in the UI (i.e. top-down ordering). Includes

 * all child tabs.

 */

function getAllTabs(doc) {

  const allTabs = [];

  // Iterate over all tabs and recursively add any child tabs to

  // generate a flat list of Tabs.

  for (const tab of doc.getTabs()) {

    addCurrentAndChildTabs(tab, allTabs);

  }

  return allTabs;

}

/**

 * Adds the provided tab to the list of all tabs, and recurses

 * through and adds all child tabs.

 */

function addCurrentAndChildTabs(tab, allTabs) {

  allTabs.push(tab);

  for (const childTab of tab.getChildTabs()) {

    addCurrentAndChildTabs(childTab, allTabs);

  }

}

Toutefois, faire ainsi vous fait perdre l’arbre. Si vous devez rĂ©aliser une opĂ©ration uniquement sur les onglets les plus bas, ou uniquement ceux du premier niveau, par exemple, une telle liste ne vous permet pas de retrouver rapidement cette information. Une autre façon de faire permettant de garder la notion d’arbre tout en ayant l’ensemble des onglets peut ĂȘtre celle-ci :

/**

 * Retourne un arbre de tous les onglets du document donnĂ© (ou de l’onglet donnĂ©). Chaque nƓud est reprĂ©sentĂ© en tant qu’objet avec deux propriĂ©tĂ©s : currentTab, contenant une instance de Tab reprĂ©sentant notre onglet, et childTabs, un tableau de nƓuds similaires (vides s’il n’y a pas d’onglets enfants).

 */

function getTabsTree(docOrTab){

  const tabs = Object.hasOwn(docOrTab, « getTabs Â») ? docOrTab.getTabs() : docOrTab.getChildTabs();

  return tabs.map(tab => ({

    currentTab: tab,

    childTabs: getTabsTree(tab)

  }))

}

À noter qu’un onglet Tab n’est pas la mĂȘme chose que DocumentTab ! L’onglet Tab est en quelque sorte la « coquille » autour de l’onglet. Pour obtenir son contenu, il faudra utiliser la mĂ©thode spĂ©cifique  Tab.asDocumentTab(), de la mĂȘme maniĂšre que Element doit ĂȘtre rĂ©cupĂ©rĂ© avec (par exemple) asParagraph() pour obtenir un paragraphe. PĂ©nible, mais on s’y fait.

Position du curseur et sélection actuelle

L’ajout des onglets a aussi lĂ©gĂšrement complexifiĂ© la notion de curseur et de la sĂ©lection, mais d’une maniĂšre qui reste intuitive. Le rĂ©sumĂ© est le suivant :

  • Document.getCursor(): Renvoie la position du curseur (la barre clignotante) dans l’onglet actif.
  • Document.getSelection(): Renvoie la plage de sĂ©lection dans l’onglet actif.
  • Document.setCursor(position): Fixe la position du curseur Ă  une position donnĂ©e. Cette position est toujours relative Ă  un onglet, et si cet onglet n’est pas l’onglet actif, alors il le devient.
  • Document.setSelection(range): Fixe la sĂ©lection Ă  celle donnĂ©e. De la mĂȘme maniĂšre, si la sĂ©lection en question est dans un onglet inactif, alors celui-ci devient l’onglet actif.

Par exemple, si vous souhaitez un script qui ajoute un paragraphe de texte dans le deuxiĂšme onglet du document actif et place le curseur Ă  la fin de ce paragraphe, vous devrez utiliser la mĂ©thode  DocumentTab.newPosition(element, offset) pour obtenir la position en question, et la fixer mettra l’utilisateur sur cet onglet. Voici le code Ă©quivalent :

/**

 * Ajoute un paragraphe au deuxiĂšme onglet (s’il existe, sinon le code plantera) du document, puis place le curseur de l’utilisateur Ă  la fin de ce paragraphe.

 */

function addParagraphToSecondTab(){

  const doc = DocumentApp.getActiveDocument();

  const secondDocumentTab = doc.getTabs()[1].asDocumentTab();

  const newParagraph = secondDocumentTab.getBody().appendParagraph(« Ceci est un nouveau paragraphe de texte. Â»);

  const newPosition = secondDocumentTab.newPosition(newParagraph.getChild(0), newParagraph.getText().length);

  doc.setCursor(newPosition);

}

Aller plus loin

Comme vous pouvez le constater, si les onglets ont rajoutĂ© une lĂ©gĂšre complexitĂ© pour nos scripts, ce n’est rien d’insurmontable, et cela reste assez proche des manipulations que l’on fait dĂ©jĂ  avec Google Sheets. Il y a quelques petites subtilitĂ©s avec la notion d’arbre et la diffĂ©rence entre Tab et DocumentTab, mais on s’y fait vite.

Si tout cela vous dĂ©passe toujours, en revanche, et que vous ne savez pas du tout comment faire pour arriver Ă  faire fonctionner votre code, pas d’inquiĂ©tude ! Vous pouvez poser vos questions sur notre forum, ou, si vous le souhaitez, faire directement appel Ă  nos services, soit avec une formation Apps Script dĂ©diĂ©e, soit en prenant rendez-vous avec nous pour que nous puissions discuter de votre projet. Nous serons toujours ravis de vous aider !

Articles similaires

  • Articles connexes
  • Plus de l'auteur

Rédacteur

Photo de profil de l'auteur
Quentin Garcia

Quentin est avant tout un dĂ©veloppeur, spĂ©cialisĂ© dans les technologies du web, mais il lui arrive parfois d’écrire des articles sur les aspects les plus techniques de Google Workspace, gĂ©nĂ©ralement sur des sujets liĂ©s Ă  ses activitĂ©s. Il adore aussi le mĂ©tahumour et parler de lui Ă  la troisiĂšme personne.

S’abonner
Notification pour
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires