コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

074.【Id】見出しをセクションマーカーにする

f:id:haraguai_is_bad:20210226204827p:plain:w300
こんな感じの柱をつくるとき、セクションマーカーを使うことが多いです。
セクションマーカーはとても便利なのですが、
「一つ一つマーカーを設定するのはめんどくさい…」
「項目の増減があったときに設定し忘れそう…」
といった不満や不安がありました。
そこで、特定の段落スタイルが登場したらそのページをセクションの開始ページとし、セクションマーカーを設定するスクリプトを作成しました。

特徴としては、

  • 柱の内容が「大見出し+小見出し」になる場合にも対応しています。小見出しを括弧で括ったりもできます。
  • 柱の文言を見出し以外の言葉にしたい(例えば「1章目.inddは見出しは無いけれど『はじめに』という柱にしたい」みたいな)ときもあるので、そういったこともできるようにしました。
  • 見出しの通し番号やスペース、注番号を削除するなどの整形もできるようにしています。

見出しの段落スタイルや整形内容などの指定はコード内でやっています(テキストを読み込むかたちにすればよかったかな…)。

挙動

  1. ブックを開いた状態で起動する(複数開いていた場合、1つめのブックが対象となります)
  2. 1つめのinddを開く
  3. 最初以外のセクションを全て削除し、最初のセクションもマーカーをリセットする
  4. 大見出しの段落スタイルで正規表現検索し、ページ昇順でセクションマーカーを設定していく
    (1ページ目に見出しが無い場合は、引き続き同じコンテンツが掲載されていると考えて前のinddの最後のセクションマーカーと同じ内容でマーカーを設定する)
  5. 小見出しの段落スタイルで正規表現検索し、ページ降順でセクションマーカーを設定していく

コード

メモ

分かったこと

doc.pages.nextItem()やpreviousItem()は、documentではなくspreadに属するpagesコレクション内での次/前という扱いになる(pageのindexと同じ)。
直感的な意味での次のページ/前のページを取得したい場合は別のアプローチが必要。

分からなかったこと

ページ外のアイテムのparentPageを参照するなど、アクセスした時点でエラーを吐かれる可能性があるときの回避策。
falsyな値にならないので、条件分岐でどうやって逃げたものか分からなかった。 今回はtry~catchで回避したが、ページ外のアイテムにparentPageが無いのはエラーではなく仕様なので、こういうときにtry~catchを使うのは妥当なんだろうか…?という思ってしまう。

積み残し

1ページ内に見出しが複数あった場合の処理。