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 Ă [âŠ]

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âŻ:
- Document.addBookmark(position)
- Document.addFooter()
- Document.addHeader()
- Document.addNamedRange(name, range)
- Document.getBody()
- Document.getBookmark(id)
- Document.getBookmarks()
- Document.getFooter()
- Document.getFootnotes()
- Document.getHeader()
- Document.getNamedRangeById(id)
- Document.getNamedRanges()
- Document.getNamedRanges(name)
- Document.newPosition(element, offset)
- Document.newRange()
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âŻ:
- Vous pouvez obtenir la liste des onglets de plus haut niveau avec Document.getTabs()
- Vous pouvez obtenir un onglet spécifique avec Document.getTab(tabId)
- Vous pouvez obtenir lâonglet actif de lâutilisateur avec Document.getActiveTab() (uniquement avec un script liĂ©)
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 connexes
- Plus de l'auteur