Googleドキュメントで長文を作成するとき、目次があると便利です。しかし、見出しを追加したり変更したりしても、目次は自動で反映されません。「目次を更新」をクリックし忘れて、古い目次が残ったままという経験はありませんか。この記事では、Apps Scriptを使って目次の更新を自動化する方法を解説します。スクリプトを関数化することで、メンテナンス性も高められます。
【要点】Apps ScriptのTableOfContents.update()メソッドで目次を自動更新
- updateTOC関数: 現在のドキュメントの目次を最新の見出し構造に自動的に更新します。
- 時間主導型トリガー: スクリプトにトリガーを設定すれば、定期的に目次を更新し続けます。
- 関数化のメリット: コードをモジュール化することで、複数ドキュメントでの再利用やエラー処理の追加が容易になります。
ADVERTISEMENT
目次
目次の自動更新が必要な理由
Googleドキュメントの目次は、ドキュメントに挿入した時点の見出し構造をもとに生成されます。その後、見出しを追加・削除・変更しても、目次は自動的に追従しません。手動で目次を右クリックし「目次を更新」を選ぶ必要があります。この作業を忘れると、ドキュメントの内容と目次が一致しなくなり、読者が混乱する原因になります。長文ドキュメントや共同編集を行っているドキュメントでは、更新漏れが特に発生しやすいです。Apps Scriptを使えば、この更新作業を完全に自動化できます。一度スクリプトを仕込めば、手動操作なしで常に最新の目次を保てるようになります。
Apps Scriptで目次を自動更新する手順
ここでは、最もシンプルな方法として、TableOfContentsクラスのupdate()メソッドを使用します。このメソッドは、ドキュメント内の既存の目次を現在の見出しに基づいて再構築します。目次が存在しない場合はエラーになるため、事前にチェックを行うことも重要です。
- スクリプトエディタを開く
目次を自動更新したいGoogleドキュメントを開きます。メニューの「拡張機能」から「Apps Script」を選択してください。新しいタブでスクリプトエディタが開きます。 - コードを記述する
デフォルトで表示されている「コード.gs」に以下の関数を入力します。function updateTOC() {
var doc = DocumentApp.getActiveDocument();
var toc = doc.getTableOfContents();
if (toc) {
toc.update();
}
}
この関数は、現在のドキュメントの目次を取得し、存在する場合にだけupdate()を実行します。if文でチェックすることで、目次がないドキュメントでエラーが発生するのを防げます。 - スクリプトを保存して実行する
スクリプトエディタの上にある保存アイコンをクリックし、関数名が「updateTOC」になっていることを確認してから実行ボタン(▶)を押します。初回実行時には権限の承認を求められます。内容を確認し「権限を確認」→「許可」をクリックしてください。実行後、元のドキュメントに戻って目次が更新されていることを確認しましょう。 - トリガーを設定して自動化する
スクリプトエディタの左側のメニューから「トリガー」アイコン(時計マーク)をクリックし、「トリガーを追加」を選びます。以下の設定を行います。
・実行する関数:updateTOC
・イベントのソース:時間主導型
・時間ベースのトリガーのタイプ:分刻みのタイマー(または時間単位)
・時間の間隔:10分ごと(お好みで)
これで、設定した間隔で自動的に目次が更新されるようになります。
関数化してメンテナンス性を高める方法
上記のコードはシンプルですが、エラー処理や複数ドキュメントへの対応を加えることで、より実用的になります。関数化のメリットは、コードの再利用性・可読性・保守性が向上する点です。以下に、改善例をいくつか紹介します。
エラーハンドリングの追加
スクリプトがエラーで止まらないように、try…catchで囲みます。また、実行結果をログに残すと便利です。
function updateTOC() {
try {
var doc = DocumentApp.getActiveDocument();
var toc = doc.getTableOfContents();
if (toc) {
toc.update();
Logger.log('目次を更新しました');
} else {
Logger.log('目次が見つかりませんでした');
}
} catch (e) {
Logger.log('エラー: ' + e.message);
}
}
ドキュメントIDを引数で受け取る関数
複数のドキュメントで同じスクリプトを使いたい場合、ドキュメントIDを引数として渡せるようにします。これにより、一つのスクリプトで様々なドキュメントの目次を更新できます。
function updateTOCForDoc(docId) {
try {
var doc = DocumentApp.openById(docId);
var toc = doc.getTableOfContents();
if (toc) {
toc.update();
Logger.log('ドキュメント ' + docId + ' の目次を更新しました');
} else {
Logger.log('ドキュメント ' + docId + ' に目次がありません');
}
} catch (e) {
Logger.log('エラー: ' + e.message);
}
}
さらに、複数のドキュメントIDを配列で管理し、ループで一括更新するメイン関数を作成すれば、大量のドキュメントを効率的にメンテナンスできます。
ADVERTISEMENT
注意点とよくあるトラブル
目次が存在しない場合の対処
スクリプトは、ドキュメント内に目次が挿入されていないと動作しません。目次がないドキュメントで実行すると、getTableOfContents()がnullを返すため、update()は呼ばれません(上記のコードではif文で回避)。ただ、目次を最初から挿入する方法はApps Scriptでは提供されていません。そのため、初回だけは手動で目次を挿入する必要があります。あるいは、見出しをリスト化して代用する別のスクリプトを作成することも可能です。
権限と承認
スクリプトを初めて実行する際、ドキュメントの閲覧・編集権限を求められます。承認画面で内容をよく確認し、信頼できるスクリプトであることを確かめてから許可してください。組織のアカウントでは、管理者がApps Scriptの実行を制限している場合もあるため、事前に確認が必要です。
トリガーの制限
無料のGoogleアカウントでは、トリガーの実行時間に合計90分/日の制限があります。短い間隔でトリガーを設定しすぎると、制限に達してスクリプトが停止する可能性があります。通常、目次の更新は1回数秒で完了するため、1時間ごとや数時間ごとの設定で問題ありません。大量のドキュメントを処理する場合は、間隔を長めに調整しましょう。
まとめ
この記事では、Googleドキュメントの目次をApps Scriptで自動更新する方法を解説しました。TableOfContents.update()メソッドを使えば、わずか数行のコードで目次の更新を自動化できます。さらに、関数化してエラー処理や引数対応を追加すれば、複数のドキュメントにも柔軟に対応できるようになります。次は、トリガーを設定して定期実行を試してみてください。また、見出しリストを生成する代替スクリプトや、他のドキュメント操作と組み合わせる応用にも挑戦してみると良いでしょう。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleドキュメントの人気記事ランキング
- 【Googleドキュメント】上付き・下付き文字の入力方法!ショートカットと手動切替
- 【Googleドキュメント】ルビ(ふりがな)を振る方法!代替ツールとアドオンの活用
- 【Googleドキュメント】文字間隔(字間)を調整する方法!カーニングの代替手段
- 【Googleドキュメント】図表番号の自動採番!Figure 1, Table 2 の連番
- 【Googleドキュメント】Docs→Wordへエクスポート!docx出力での書式維持
- 【Googleドキュメント】縦書き表示を実現する方法!代替ツールと回避策
- 【Googleドキュメント】インデントを正確に調整する方法!ルーラーとタブストップの使い方
- 【Googleドキュメント】罫線を縦・横に挿入する方法!Wordの罫線機能との比較
- 【Googleドキュメント】共有後に閲覧履歴を確認!誰がいつ開いたかの追跡
- 【Googleドキュメント】共有先の名前が表示されない時の対処!匿名動物アイコンの正体
