Google Docsの箇条書きのインデントを調整するGoogle Apps Script

背景

Google Docsでは段落スタイルから見出しごとに指定したスタイルを適用できます。しかし,2020/12現在,「箇条書き」や「番号付きリスト」にはスタイルを指定できないため,インデントはrulerで個別に調整しなければなりません。

そこで省力化のために,Google Apps Scriptを用いて,インデントを自動設定するスクリプトを書きました。

適用例

Before

f:id:ido_kara_deru:20201228174806p:plain:w398

After

f:id:ido_kara_deru:20201228175623p:plain:w362

上の例はDropbox paperを模したインデント幅にしています。私的にはAfterが読みやすいですが,ここらへんの好みは人に依ると思います。インデント幅はスクリプトの変数から任意に設定可能です。

ソースコード

使い方や関数の説明などはソースコードの次に記載しています。

function onOpen() {
  const ui = DocumentApp.getUi()
    .createMenu('MyScript')
    .addItem('Indent adjustment', 'indent')
    .addToUi();
}

function indent() {
  // Definition of rules
  // <levelDistance*(level+1)>●<stringDistance>level 0
  const levelDistance = 21.0;
  const stringDistance = 16.0;
  const rules = [];
  for (let i = 0; i < 9; i++) { //Max lavel : 8 (Definition of Google Documents)
    indentStart = (i + 1) * levelDistance;
    indentFirstLine = indentStart - stringDistance;
    rules.push([indentStart, indentFirstLine]);
  }

  const document = DocumentApp.getActiveDocument();
  const body = document.getBody();
  const listItems = body.getListItems();

  for (const listItem of listItems) {
    const level = listItem.getNestingLevel();
    const rule = rules[level];
    listItem.setIndentStart(rule[0]);
    listItem.setIndentFirstLine(rule[1]);
  }
}
  • 使い方
    1. Google Docsのメニューバーで ツール > スクリプトエディタ を開き,以下をコピペ
    2. ページを再読み込み
    3. MyScript > Indent adjustment を実行するとドキュメント内の「箇条書き」,「番号付きリスト」のインデントが変更される
  • 簡単な説明
    • onOpen関数: メニューバーに MyScript > Indent adjustment を追加
    • indent関数: アクティブドキュメント内の「箇条書き」,「番号付きリスト」のインデントを変更
  • 設定
    • indent関数のlevelDistancestringDistanceにてインデント幅を設定可能
    • 変数の意味 <levelDistance*(level+1)>●<stringDistance>level 0

残課題

  • Glyph(箇条書きの黒丸)が文字に対して大きすぎるため小さくしたい
    • listItem.setGlyphType()にてGlyphTypeを設定できますが,Enum型のため任意の文字は利用できません
    • GUIでは任意のGlyphが設定できますが,API上ではすべてBULLETとして扱われるようです。Glyphの文字コードを保持する拡張領域がある?
    • Glyphのサイズを変更するメソッドは見つからず...
  • 他Documentへの適用
    • 現状,本スクリプトを他ドキュメントに適用するにはソースコードをコピーする必要がある...
    • .gsファイルをリンクするにもがスクリプトエディタの編集が必要そう
    • スクリプトを埋め込んだドキュメントをテンプレート化すれば良い?