How to number the headings in a Google Docs/Drive document?

Is it possible to number the headings in a Google Docs/Drive document?


Solution 1:

If you want something more easy, there is a Google Add-On called "Table of Contents" that will allow you to number your headings.

To install this add-on:

  1. Click on the Add-Ons > Get Add-Ons.
  2. Click on the "Table of Contents" icon or search for this addon to install it

Then your Table of Contents should appear in your sidebar. Click on Heading Numbers Format menu, and choose 1.2.3

You have to reformat your document if you have an old one in order to 'refresh' the numbers, but actually the addon works very well.

I've seen the answer in this forum.

Solution 2:

Update: now available in github.

Update 2: now handling empty headings and blank lines thanks to 2 pull requests on github.

Update 3: github and code below fixed to handle new Docs HEADING identification.


I modified the script mentioned by Mikko Ohtamaa and created a Google Apps Script that adds a Headings tools Document menu that allows you to:

  • auto number Heading
  • clear Headings numbers

How to auto number Google Documents Headings:

  1. Open your document > Tools > Script editor...
  2. Start a blank project
  3. Paste the the code below and save with your preffered name
  4. Select Run > onOpen and authorize the script for the first time
  5. Select Run > onOpen
  6. Change to your Document and try the functions on the Headings tools custom menu created.

~~Disclaimer: you may have issues with empty Headings.. But you can always fix them and run action again.~~

Code to copy and paste:

function onOpen() {
  DocumentApp.getUi().createMenu('Headings Tools')
  .addItem('Auto Number Headings', 'numberHeadingsAdd')
  .addItem('Clear Heading Numbers', 'numberHeadingsClear')
  .addToUi();
}

function numberHeadingsAdd(){
  numberHeadings(true);
}

function numberHeadingsClear(){
  numberHeadings(false);
}

function numberHeadings(add){
  var document = DocumentApp.getActiveDocument();
  var body = document.getBody();
  var paragraphs = document.getParagraphs();
  var numbers = [0,0,0,0,0,0,0];
  for (var i in paragraphs) {
    var element = paragraphs[i];
    var text = element.getText()+'';
    var type = element.getHeading()+'';

    // exclude everything but headings
    if (!type.match(/HEADING\d/)) {
      continue;
    }

    // exclude empty headings (e.g. page breaks generate these)
    if( text.match(/^\s*$/)){
      continue;
    }

    if (add == true) {
      var level = new RegExp(/HEADING(\d)/).exec(type)[1];
      var numbering = '';

      numbers[level]++;
      for (var currentLevel = 1; currentLevel <= 6; currentLevel++) {
        if (currentLevel <= level) {
          numbering += numbers[currentLevel] + '.';
        } else {
          numbers[currentLevel] = 0;
        }
      }
      Logger.log(text);
      var newText = numbering + ' ' + text.replace(/^[0-9\.\s]+/, '');
      element.setText(newText);
      Logger.log([newText]);
    } else {
      Logger.log(text);
      element.setText(text.replace(/^[0-9\.\s]+/, ''));
    }
  }

}

Solution 3:

Since writing (April 2020), a lot of proposed apps are obsolete or do not working anymore.

The method for numbered headings I've found working is the following:

  1. Go to Get add-ons
  2. Search and install Markdown Tools

Markdown Tools has an option to use numbered headings. Works like a charm with the built-in Table of Contents of Google.

To create a table of contents:

  1. Go to menu item Insert and select Table of Contents