Numeriblog Google Workspace Google Docs, traitement de texte collaboratif Google Docs : numérotez les titres de façon hiérarchisée et reportez les numérotations dans le sommaire

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 […]

4.3(3)
personnes ont consulté cet article

3 minutes

Rédigé par Antoine MARTIN - il y a 4 ans

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.


Google Docs avant et après la numérotation des titres
Avant / aprés la numérotation

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 ».

Menu outil / editeur de scripts Google Docs
  • 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.

Image de référence

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 »

Comment lancer la numérotation

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 similaires

  • Articles connexes
  • Plus de l'auteur

Rédacteur

Photo de profil de l'auteur
Antoine MARTIN

Consultant et formateur sur les outils bureautiques, j'ai intégré l'équipe de Numericoach en 2020. J'accompagne les utilisateurs de Google Workspace à trouver des solutions répondant à leurs besoins. Mes domaines de prédilections sont les outils Sheets, Docs, Slides et Google Apps Script.

S’abonner
Notification pour

4.3

Note du cours

(1)

(2)

(0)

(0)

(0)

18 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Elisa B

MERCI Antoine

Jean Krazouk

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, "");
}

Jean Krazouk

Merci Antoine M. et Thierry V. 😉

Antoine

Merci pour cet ajout !

sandrine dz

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 ?

Antoine

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.

Matt N

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?

Benoit

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.

Jeremie

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

Jérémie

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

Stef2Caen
Votre note :
     

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

Thierry Vanoffe

Au top ça a été la note finale ?

Marc RUELLET
Votre note :
     

/*
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

Nicolas Martin
Votre note :
     

Merci Antoine. C’est top !