Google Docs : numérotez les titres de façon hiérarchisée et reportez les numérotations dans le sommaire
Google Docs est un formidable éditeur de texte collaboratif. Pour autant nous pouvons encore regretter des lacunes de fonctionnalités qui semblent pourtant essentielles dans un outil sensé gérer des textes. Par exemple, il n’est pas […]
Ce que vous allez découvrir
- Le document
- Le script complet
- Lancez le script
Google Docs : numérotez les titres de façon hiérarchisée et reportez les numérotations dans le sommaire
Google Docs est un formidable éditeur de texte collaboratif. Pour autant nous pouvons encore regretter des lacunes de fonctionnalités qui semblent pourtant essentielles dans un outil sensé gérer des textes. Par exemple, il n’est pas possible actuellement de numéroter les titres hiérarchiquement de façon pérenne et de faire apparaitre cette numérotation dans le sommaire…
Certes les listes numérotées répondent à ce besoin, mais cela demande pas mal de manipulations, parfois il faut redémarrer la numérotation, et celle-ci n’est pas intégrée dans le style du titre… et surtout, le numéro n’apparaît pas dans le sommaire automatique ! (nb : C’était le cas au moment de la rédaction de cet article, depuis la numérotation automatique apparaît dans la table des matières.)
Heureusement, les scripts nous permettent de palier ces difficultés en attendant que le géant américain intègre ces optimisations dans son logiciel. Voici un script dont le but est d’ajouter des numéros de titres aux Titre 1, Titre 2 et Titre 3, sous le format 1., 1.1 et 1.1.a. de sorte que les numérotations s’intègrent dans le sommaire.
Remarque : le module complémentaire « table of Contents » remplit la mission, mais ce script décortique le processus et vous permet de l’adapter à vos besoins.
Le document
Créez un document, hiérarchisez-le en utilisant les styles de titres. Insérez la table de matière en début de document.
Ouvrez l’éditeur de scripts depuis le document : menu « Outils / Éditeur de scripts ».
- Remplacez le code donné par défaut par celui donné ci-dessous.
- Enregistrez le script en cliquant sur la disquette.
- Fermez la fenêtre du script et relancez la fenêtre google Docs.
- Patientez quelques secondes, un nouveau lien doit apparaître dans le menu de Google Docs :
Vous pouvez aussi ouvrir le document ci-dessous.
Le script complet
/* NUMÉROTER LES TITRES script soumis aux droits d'auteur - utilisation possible dans un cadre non rémunéré. Crédit : Antoine Martin / ThierrryVanoffe.com / 2021 */ // variables placées en constante pour resservir dans plusieurs fonctions. const ui = DocumentApp.getUi(); const thisDoc = DocumentApp.getActiveDocument(); const body = thisDoc.getBody() ; const paragraphs = body.getParagraphs(); // Expression régulière pour repérer les numérotations déjà créées const pattern = "([0-9]{1,3}\.|[0-9]{1,3}\.[0-9]{1,3}\.|[0-9]{1,3}\.[0-9]{1,3}\.[a-z]{1}\.)[ ]{1}"; function onOpen() { let ui = DocumentApp.getUi(); ui.createMenu("+ OUTILS") .addSubMenu(ui.createMenu("Numéroter les titres") .addItem("Numéroter titre 1 à 3", "numeroterTitre") .addItem("Supprimer la numérotation des titres","supprimerNumTitre") ) .addToUi(); } function numeroterTitre() { //Supprimer tous les numéros d'une numérotation précédente supprimerNumTitre(); // Définir les variable Numero de ligne à 0 let nh1 = 0 ; let nh2 = 0; let nh3 = 0 ; let lettres = ["","a","b","c","d","e","f","g","h","i","j"] ; // Boucle sur les paragraphes du texte for (let i=0 ; i< paragraphs.length ; i++) { let thisParagraph = paragraphs[i]; let heading = thisParagraph.getHeading(); if (heading === DocumentApp.ParagraphHeading.HEADING1) { // si le paragraphe est un Titre 1 : // incrémenter le numero de Titre 1 nh1++; // réinitialiser le numéro de Titre 2 et Titre 3 à 0 nh2 = 0; nh3 = 0 ; // Insérer devant le texte le numéro en cours, un "." et un espace thisParagraph.editAsText().insertText(0 , nh1+". "); } if (heading === DocumentApp.ParagraphHeading.HEADING2) { nh2++; nh3 = 0 ; thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+". "); } if (heading === DocumentApp.ParagraphHeading.HEADING3) { nh3++; thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+"."+lettres[nh3]+". "); } } } function supprimerNumTitre() { body.replaceText(pattern, ""); }
Lancez le script
Le script crée un nouveau bouton « + OUTILS », cliquez sur « Numéroter les titres > Numéroter titres 1 à 3 »
Les titres sont numérotés de façon hiérarchique.
Actualisez le sommaire pour y afficher les numéros.
Relancez la numérotation si vous avez changé le plan de votre document. Il n’est pas possible de créer un déclencheur automatique Google Docs… 🙁
Je vous laisse découvrir à quoi sert le bouton « Supprimer la numérotation des Titres ». Le suspens est insoutenable ! 🙂
Merci pour vos commentaires si ce script répond à votre besoin. N’hésitez pas aussi à soumettre vos suggestions d’amélioration !
Besoin d'un peu plus d'aide sur Docs ?
Des formateurs sont disponibles toute l'année pour vous accompagner et optimiser votre utilisation de Docs, que ce soit pour votre entreprise ou pour vos besoins personnels !
Découvrir nos formations Docs
- Articles connexes
- Plus de l'auteur
4.3
Note du cours
(1)
(2)
(0)
(0)
(0)
MERCI Antoine
Pour la version à 4 niveaux de titres :
/*
NUMÉROTER LES TITRES
script soumis aux droits d’auteur – utilisation possible dans un cadre non rémunéré.
Crédit : Antoine Martin / ThierrryVanoffe.com / 2020 – modifié Ciavarella /12-2020 ajout numérotation à Titres 1 à 4
*/
// variables placées en constante pour resservir dans plusieurs fonctions.
const ui = DocumentApp.getUi();
const thisDoc = DocumentApp.getActiveDocument();
const body = thisDoc.getBody() ;
const paragraphs = body.getParagraphs();
// Expression régulière pour repérer les numérotations déjà créées
const pattern = « ([0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.)[ ]{1} »;
// Numérotation Titres 1-4 avec lettres [a-j] sur le Titre 4
// const pattern = « ([0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\\.[a-z]{1}\.)[ ]{1} »;
function onOpen()
{
let ui = DocumentApp.getUi();
ui.createMenu(« + OUTILS »)
.addSubMenu(ui.createMenu(« Numéroter les titres »)
.addItem(« Numéroter titre 1 à 4 », « numeroterTitre »)
.addItem(« Supprimer la numérotation des titres », »supprimerNumTitre »)
)
.addToUi();
}
function numeroterTitre() {
//Supprimer tous les numéros d’une numérotation précédente
supprimerNumTitre();
// Définir les variable Numero de ligne à 0
let nh1 = 0 ;
let nh2 = 0 ;
let nh3 = 0 ;
let nh4 = 0 ;
let lettres = [« », »a », »b », »c », »d », »e », »f », »g », »h », »i », »j »] ;
// Boucle sur les paragraphes du texte
for (let i=0 ; i< paragraphs.length ; i++)
{
let thisParagraph = paragraphs[i];
let heading = thisParagraph.getHeading();
if (heading === DocumentApp.ParagraphHeading.HEADING1)
{
// si le paragraphe est un Titre 1 :
// incrémenter le numero de Titre 1
nh1++;
// réinitialiser le numéro de Titre 2 et Titre 3 à 0
nh2 = 0 ;
nh3 = 0 ;
nh4 = 0 ;
// Insérer devant le texte le numéro en cours, un "." et un espace
thisParagraph.editAsText().insertText(0 , nh1+". ");
}
if (heading === DocumentApp.ParagraphHeading.HEADING2)
{
nh2++;
nh3 = 0 ;
thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+". ");
}
if (heading === DocumentApp.ParagraphHeading.HEADING3)
{
nh3++;
nh4 = 0 ;
// Numérotation de niveau 3 avec des lettres utiliser la ligne suivante :
// thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+"."+lettres[nh3]+". ");
// Numérotation de niveau 3 avec des chiffres utiliser la ligne suivante :
thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+"."+nh3+". ");
}
if (heading === DocumentApp.ParagraphHeading.HEADING4)
{
nh4++;
thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+"."+nh3+"."+nh4+". ");
// Numérotation de niveau 4 avec des lettres utiliser la ligne suivante :
// thisParagraph.editAsText().insertText(0 , nh1+"."+nh2+"."+nh3+"."+lettres[nh4]+". ");
}
}
}
function supprimerNumTitre() {
body.replaceText(pattern, "");
}
Merci Antoine M. et Thierry V. 😉
Merci pour cet ajout !
Merci Antoine. Je viens de le faire pour 2 documents; j’ai une galère : certains nombre dans le corps du document sont effacés à chaque re-numérotation.
Pouvez-vous m’aider ?
Essaye de modifier le pattern
const pattern = « ^([0-9]{1,3}\.|[0-9]{1,3}\.[0-9]{1,3}\.|[0-9]{1,3}\.[0-9]{1,3}\.[a-z]{1}\.)[ ]{1} »;
Pour forcer la recherche en debut de ligne
Je ne peux pas tester mais ca devrait marcher.
Bonjour,
Tout d’abord merci à vous pour ce script.
J’ai un soucis lorsque j’ai des nombres en début de phrases ou dans un tableau suivi d’un espace.
Par exemple mes titres sont comme cela: ( _ = espace)
1._
1.1_
1.1.1_
1.1.1.a_
Lorsqu’en début de phrase j’ai 500_ , le 500 est supprimé. Le problème peut être régler en supprimant l’espace
Par contre quand dans mon tableau je copie un titre pour renvoyer vers cette partie là, le 1.1.1.a est supprimé
ou
Si j’ai par exemple 500 DaN/mé, le 500 est supprimé (en début de phrase ou dan mon tableau)
Avez vous une solution s’il vous plait?
Bonjour Matt, merci pour votre message.
Effectivement le script supprime tous les nombres en début de phrase, ce qui est bizarre c’est qu’il ne devrait supprimer que les nombres suivi d’un « . ». Vous serait-il possible d’ajouter un « # » devant vos nombres à ne pas supprimer ? ou un signe permettant d’indiquer que ce ne sont pas des numérotations ?
Pas idéal, mais en l’état je ne vois pas trop…
Bonjour,
Je ne comprends pas comment insérer le script. Où faut-il le coller? Dans le corps du document à numéroter? Au début? A la fin?
Je l’ai inséré à la fin et le menu +OUTILS n’apparaît pas. Donc impossible de lancer le script.
Et si la table des matières se situe à la fin de mon doc, est-ce que cela marche quand-même?
Merci.
Bonjour Benoît, merci pour votre message. J’ai ajouté dans la partie « document » le processus d’installation du script.
Le script fonctionne quelque soit l’emplacement du sommaire.
Bonjour,
Une solution a-t-elle été trouvée pour ne supprimer la numérotation que sur le texte de type HEADING, et pas dans le « normal text » ?
Merci
Pour compléter mon message, si par exemple vous avez :
__________________
1. Titre 1
1.1. Titre 2
Normal text
5% 3.12 Normal text
Normal text 5.1.
8.9.1.
1.1.1. Titre 3
__________________
Le script va bien supprimer au niveau des titres, mais il va aussi supprimer le 5% 3.12, alors qu’il ne va pas supprimer le 8.9.1.
Je suis preneur de toute idée permettant de ne supprimer qu’au niveau des Titres 🙂
Merci
Merci, tu viens de me sauver, enfin surtout ma moitié qui rédige son rapport de stage via Google docs (plus simple pour récupérer le document sur mon PC). Je venez de m’arracher les cheveux avant de voir ta proposition de script, je vais donc tester ça ce soir
Au top ça a été la note finale ?
/*
NUMÉROTER LES TITRES
script soumis aux droits d’auteur – utilisation possible dans un cadre non rémunéré.
Crédit : Antoine Martin / ThierrryVanoffe.com / 2020 – modifié Ciavarella /12-2020 ajout numérotation à Titres 1 à 4
*/
// variables placées en constante pour resservir dans plusieurs fonctions.
const ui = DocumentApp.getUi();
const thisDoc = DocumentApp.getActiveDocument();
const body = thisDoc.getBody() ;
const paragraphs = body.getParagraphs();
// Expression régulière pour repérer les numérotations déjà créées
const pattern = « ([0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.)[]{1} « ;
// Numérotation Titres 1-4 avec lettres [a-j] sur le Titre 4
// const pattern = « ([0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.|[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\\.[a-z]{1}\.)[ ]{1} »;
function onOpen()
{
let ui = DocumentApp.getUi();
ui.createMenu(« + OUTILS « )
.addSubMenu(ui.createMenu( » Numéroter les titres « )
.addItem( » Numéroter titre 1 à 4 « , » numeroterTitre « )
.addItem( » Supprimer la numérotation des titres « , « supprimerNumTitre « )
)
.addToUi();
}
function numeroterTitre() {
//Supprimer tous les numéros d’une numérotation précédente
supprimerNumTitre();
// Définir les variable Numero de ligne à 0
let nh1 = 0 ;
let nh2 = 0 ;
let nh3 = 0 ;
let nh4 = 0 ;
let lettres = [ » « , « a « , « b « , « c « , « d « , « e « , « f « , « g « , « h « , « i « , « j « ] ;
// Boucle sur les paragraphes du texte
for (let i=0 ; i< paragraphs.length ; i++)
{
let thisParagraph = paragraphs[i];
let heading = thisParagraph.getHeading();
if (heading === DocumentApp.ParagraphHeading.HEADING1)
{
// si le paragraphe est un Titre 1 :
// incrémenter le numero de Titre 1
nh1++;
// réinitialiser le numéro de Titre 2 et Titre 3 à 0
nh2 = 0 ;
nh3 = 0 ;
nh4 = 0 ;
// Insérer devant le texte le numéro en cours, un « . » et un espace
thisParagraph.editAsText().insertText(0 , nh1+« . « );
}
if (heading === DocumentApp.ParagraphHeading.HEADING2)
{
nh2++;
nh3 = 0 ;
thisParagraph.editAsText().insertText(0 , nh1+« . »+nh2+« . « );
}
if (heading === DocumentApp.ParagraphHeading.HEADING3)
{
nh3++;
nh4 = 0 ;
// Numérotation de niveau 3 avec des lettres utiliser la ligne suivante :
// thisParagraph.editAsText().insertText(0 , nh1+ ». »+nh2+ ». »+lettres[nh3]+ ». « );
// Numérotation de niveau 3 avec des chiffres utiliser la ligne suivante :
thisParagraph.editAsText().insertText(0 , nh1+« . »+nh2+« . »+nh3+« . « );
}
if (heading === DocumentApp.ParagraphHeading.HEADING4)
{
nh4++;
thisParagraph.editAsText().insertText(0 , nh1+« . »+nh2+« . »+nh3+« . »+nh4+« . « );
// Numérotation de niveau 4 avec des lettres utiliser la ligne suivante :
// thisParagraph.editAsText().insertText(0 , nh1+ ». »+nh2+ ». »+nh3+ ». »+lettres[nh4]+ ». « );
}
}
}
function supprimerNumTitre() {
body.replaceText(pattern, « »);
}
Voici mon code, et lorsque j’essaie de numéroter les titres, j’ai le message d’erreur suivant qui s’affiche « Fonction de script introuvable : numeroterTitre »
Quelqu’un de clément pour éclairer ma lanterne ?? bien à vous, Marc
Bonjour Marc, l’erreur indique que la fonction appelée dans onOpen() dans la ligne
.addItem( « Numéroter titre 1 à 4 » , « numeroterTitre » )
n’est pas reconnue.
pourtant il existe bien une fonction « numeroterTitre » dans la ligne :
function numeroterTitre() {…}
Vérifie bien que les 2 « numeroterTitre » sont écrits exactement pareil, dans onOpen et dans function numeroterTitre() {…}
Merci Antoine. C’est top !
Heureux que ce script t’ai été utile 😉