【Googleドキュメント】Apps Scriptで自動目次の章番号挿入!Heading連動の番号管理

【Googleドキュメント】Apps Scriptで自動目次の章番号挿入!Heading連動の番号管理
🛡️ 超解決

Googleドキュメントで長文を作成していると、見出しごとに章番号を手動で振るのは面倒です。特に目次を自動生成する場合、見出しに番号がなければ階層がわかりにくくなります。そこで、Apps Scriptを使って見出しのスタイルに連動した自動番号管理を実現する方法をご紹介します。この記事を読めば、スクリプト一つで見出しを解析し、Heading 1には「1.」「2.」、Heading 2には「1.1」「1.2」といった番号を自動で付与できるようになります。さらに、その番号を反映した目次もワンクリックで挿入できるため、ドキュメント全体の構成管理が格段に楽になります。

【要点】Apps Scriptと見出しスタイルで番号と目次を自動生成

  • Apps Scriptのスクリプトエディタ: ツール→スクリプトエディタから開き、コードを貼り付けて実行します。見出しの段落を取得し、スタイルに応じた番号を付けます。
  • 見出しスタイル(Heading 1~3): スクリプトは段落スタイルを判定し、階層に応じて「1.」「1.1」などの番号を自動生成します。スタイルが適用されていない段落は対象外です。
  • 目次の挿入: 番号付き見出しを元に、先頭に目次を生成します。見出しのテキストをそのままリスト化するため、内容の変更に合わせて再実行するだけで更新できます。

ADVERTISEMENT

Apps Scriptで見出しを自動番号管理する仕組み

Googleドキュメントの各段落には「見出し1」「見出し2」といったスタイルが割り当てられます。Apps ScriptはDocumentAppクラスを使ってこれらの段落を走査し、スタイルに応じて数値のカウンターを進めます。例えば、見出し1が出現するたびに第1レベルのカウンターを増やし、見出し2が出現すると第2レベルのカウンターをインクリメントします。この仕組みにより、階層構造を保持したまま章番号を自動的に付与できるのです。

スクリプトは見出しのテキストを一度クリアしてから番号を先頭に挿入します。すでに番号が付いている場合でも上書きするため、常に最新の状態に保てます。また、目次を生成する部分では、見出しのテキストから番号部分を抽出してハイパーリンク付きの箇条書きを作成します。これにより、クリックで該当の見出しにジャンプできる目次が完成します。

見出しに自動で章番号を付ける手順

ここでは、実際にスクリプトを作成して実行する流れを説明します。初めての方でも迷わないよう、コードの内容も詳しく解説します。

  1. スクリプトエディタを開く
    Googleドキュメントを開いたら、メニューの「ツール」→「スクリプトエディタ」をクリックします。新しいタブでApps Scriptのエディタが開きます。デフォルトのコード.gsファイルにスクリプトを記述します。
  2. コードを記述する
    以下のコードをコピーして貼り付けます。このコードはドキュメントの見出しを解析し、番号を付与した上で目次を先頭に挿入します。
function addHeadingNumbersAndTOC() {
  var doc = DocumentApp.getActiveDocument();
  var body = doc.getBody();
  var paragraphs = body.getParagraphs();
  
  // カウンターの初期化(レベル1~3)
  var counters = [0, 0, 0];
  var tocItems = []; // 目次用の配列
  
  // すべての段落を処理
  for (var i = 0; i < paragraphs.length; i++) {
    var para = paragraphs[i];
    var type = para.getHeading();
    var text = para.getText();
    
    // 見出しスタイルに応じた処理
    var level = -1;
    if (type === DocumentApp.Heading.HEADING1) level = 0;
    else if (type === DocumentApp.Heading.HEADING2) level = 1;
    else if (type === DocumentApp.Heading.HEADING3) level = 2;
    
    if (level !== -1) {
      // カウンターを更新(上位レベルが変わったらリセット)
      if (level === 0) {
        counters[0]++;
        counters[1] = 0;
        counters[2] = 0;
      } else if (level === 1) {
        counters[1]++;
        counters[2] = 0;
      } else if (level === 2) {
        counters[2]++;
      }
      
      // 番号文字列を作成(例: "1.1.2")
      var numberStr = counters.slice(0, level + 1).join('.');
      // 既存の番号を削除(先頭が数字+ピリオドの場合)
      var cleanedText = text.replace(/^[\d.]+\s*/, '');
      // 新しいテキストを設定
      para.setText(numberStr + '. ' + cleanedText);
      // 目次用に保存(本文の先頭に挿入するため、後で位置を調整)
      tocItems.push({level: level, text: numberStr + '. ' + cleanedText, paragraph: para});
    }
  }
  
  // 目次を生成して先頭に挿入
  var tocParagraphs = [];
  for (var j = 0; j < tocItems.length; j++) {
    var item = tocItems[j];
    var indent = item.level * 2; // インデント用のスペース
    var tocText = '';
    for (var s = 0; s < indent; s++) tocText += ' ';
    tocText += item.text;
    // 見出しの段落IDを取得してリンク用のIDを作成
    var headingId = item.paragraph.getAttributes().headingId;
    // スクロール位置はリンクで指定しないため、単純にテキストとして追加
    // 代わりに、見出しの本文内の位置を利用する方法もあるが、ここでは簡易版
    tocParagraphs.push(tocText);
  }
  
  // 先頭の段落に目次を挿入(既存の内容はそのまま、最初にまとめて追加)
  if (tocParagraphs.length > 0) {
    // 目次タイトル
    var titlePara = body.insertParagraph(0, '【目次】');
    titlePara.setHeading(DocumentApp.Heading.HEADING1);
    // 目次アイテムを挿入(逆順で挿入するため後ろから)
    for (var k = tocParagraphs.length - 1; k >= 0; k--) {
      var tocPara = body.insertParagraph(1, tocParagraphs[k]);
      tocPara.setHeading(DocumentApp.Heading.NORMAL);
    }
  }
  
  doc.saveAndClose();
  DocumentApp.getUi().alert('見出し番号と目次の生成が完了しました。');
}
  1. プロジェクトを保存して実行する
    コードを貼り付けたら、フロッピーディスクアイコンをクリックして保存します。次に、実行ボタン(▶)をクリックし、初回は権限の承認が必要です。アカウントを選択し、「許可」をクリックしてください。スクリプトが実行されると、見出しに番号が付き、文書の先頭に目次が追加されます。
  2. 結果を確認する
    ドキュメントに戻ると、見出しのテキストが「1. はじめに」「1.1 背景」のように変わっているはずです。先頭部分には【目次】という見出しの下に、各見出しのテキストが階層的にリストされています。目次の各項目はハイパーリンクになっていませんが、番号は本文と一致しているため、参照しやすくなります。

スクリプト使用時の注意点とよくあるトラブル

実行権限の承認が必要な場合がある

スクリプトを初めて実行するときは、Googleアカウントの権限承認ダイアログが表示されます。「このアプリは確認されていません」という警告が出ることもありますが、自分用のスクリプトなので「詳細」→「安全ではないページに移動」をクリックして許可しても問題ありません。ただし、機密ドキュメントで実行する場合は、スクリプトの内容を十分に確認した上で承認してください。

見出しスタイルが正しく設定されていないと動作しない

スクリプトは「見出し1」「見出し2」「見出し3」のいずれかのスタイルが適用された段落のみを処理します。標準テキストや「タイトル」スタイルは対象外です。事前に見出しに適切なスタイルを設定しておかないと、番号が付与されません。見出しスタイルは、段落を選択してツールバーのスタイルドロップダウンから変更できます。

スクリプトを再実行すると番号が重複する

コードでは既存の番号を削除する正規表現(/^[\d.]+\s*/)を適用しているため、再実行しても問題なく上書きされます。ただし、目次は毎回先頭に追加されるため、2回目以降は「【目次】」が複数生成されます。対策として、スクリプト実行前に既存の目次を削除する処理を追加するか、手動で一度削除してから実行してください。また、スクリプトの先頭で古い目次を検索して削除するコードを追加することも可能です。

目次項目にリンクを付与したい場合

今回のスクリプトでは目次を単なるテキストとして挿入しています。ハイパーリンク付きの目次にしたい場合は、見出しにブックマークを設定し、そのIDをリンク先とする高度な処理が必要です。ただし、Googleドキュメントの標準の目次機能(挿入→目次)の方がリンク付きで更新も容易です。このスクリプトは番号付き見出しを生成することが主目的であり、標準の目次機能を併用する方法もあります。

ADVERTISEMENT

手動で番号を振る場合と自動スクリプトの比較

項目 手動で番号を振る Apps Scriptで自動化
作業時間 数十分~数時間(文書量による) 数秒
ミスの発生 番号飛びや重複が起きやすい ほぼゼロ
目次との連動 手動で番号を合わせる必要がある 番号と目次が自動で同期する
更新時の手間 章構成を変えるたびに全番号を振り直し スクリプトを再実行するだけ

上記の比較から、特に長文や頻繁に更新するドキュメントでは、Apps Scriptによる自動化が大きなメリットをもたらします。一度スクリプトをセットアップすれば、あとはボタン一つで番号管理が完結します。

まとめ

この記事では、GoogleドキュメントのApps Scriptを利用して、見出しスタイルに連動した自動章番号の挿入と目次生成の方法を解説しました。使用したスクリプトはHeading 1から3までの階層を認識し、適切な番号を付与して文書の先頭に目次を追加します。手動での番号振りから解放されるため、ドキュメントの構成変更にも柔軟に対応できます。また、今回のスクリプトをベースに、目次にハイパーリンクを追加したり、見出し4以降に対応させたりと、用途に合わせてカスタマイズすることも可能です。ぜひ実際にスクリプトを試して、ドキュメント作成の効率を向上させてください。


ADVERTISEMENT

📄
Googleドキュメントトラブル完全解決データベースこの記事以外にも、書式・共有・Apps Script・引用など様々な困りごとへの解決策をまとめています。逆引きに活用してください。
この記事の監修者
✍️

超解決 第一編集部

疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。

SPONSORED