ADVERTISEMENT

【Googleドキュメント】Apps Scriptで本文の書式が崩れる時の段落指定確認

【Googleドキュメント】Apps Scriptで本文の書式が崩れる時の段落指定確認
🛡️ 超解決

GoogleドキュメントでApps Scriptを使って帳票や報告書を自動作成する際、本文の書式が意図しない形で崩れることがよくあります。特に、フォントサイズや行間、インデントが正しく設定されず、手動で修正する手間が発生するケースが少なくありません。この問題の多くは、段落に対する属性設定の方法が間違っているか、ドキュメントの継承スタイルを考慮していないことが原因です。本記事では、具体的な原因と確認手順、正しいコード例を交えて解説します。

【要点】この記事で確認すること

  • 最初に見る場所: スクリプト内で使用している属性名が正しい定数(DocumentApp.Attributeの列挙値)かどうか。
  • 切り分けの軸: 端末側(ブラウザの描画)ではなく、スクリプトのロジックとドキュメントのデフォルトスタイルに問題がないか。
  • 注意点: 会社のテンプレートドキュメントが段落スタイルを強制している場合、スクリプトで上書きする前にスタイルをクリアする必要があります。また、スクリプトの実行権限やドキュメントへのアクセス権限も管理者に確認してください。

ADVERTISEMENT

なぜApps Scriptで段落書式が崩れるのか

Apps Scriptで段落の書式を設定するには、ParagraphオブジェクトのsetAttributesメソッドを使用します。ところが、このメソッドに渡す属性オブジェクトのキーを誤ると、書式が一切反映されません。また、ドキュメントには「デフォルト段落スタイル」が存在し、新しく追加した段落は自動的にそのスタイルを継承します。スクリプトで明示的に属性を上書きしない限り、テンプレートや前の段落の書式が引き継がれて崩れる原因になります。

具体的には、以下の3つの要因が重なると書式崩れが発生します。

  1. 属性名の間違い(文字列 vs 列挙型定数)
  2. 属性設定のタイミング(段落追加前か後か)
  3. ドキュメントのデフォルトスタイルやテーマの影響

確認すべき段落属性と正しい設定方法

Apps Scriptでは、段落の書式を制御する属性がDocumentApp.Attributeに定義されています。以下に主要な属性とその正しい使い方を説明します。

フォント関連の属性

フォントファミリー、サイズ、太字、斜体、色などは、以下のように指定します。重要なのは、属性名として文字列(例:’fontFamily’)ではなく、必ずDocumentApp.Attribute.FONT_FAMILYなどの定数を使うことです。

const style = {};
style[DocumentApp.Attribute.FONT_FAMILY] = 'Arial';
style[DocumentApp.Attribute.FONT_SIZE] = 12;
style[DocumentApp.Attribute.BOLD] = true;
style[DocumentApp.Attribute.ITALIC] = false;
style[DocumentApp.Attribute.FOREGROUND_COLOR] = '#000000';
paragraph.setAttributes(style);

配置とインデントの属性

段落の配置(左揃え、中央揃え、右揃え、両端揃え)は、DocumentApp.Attribute.ALIGNMENTにAlignment列挙値を指定します。インデントはINDENT_START(左インデント)、INDENT_END(右インデント)、INDENT_FIRST_LINE(一行目のインデント)で制御します。

style[DocumentApp.Attribute.ALIGNMENT] = DocumentApp.HorizontalAlignment.CENTER;
style[DocumentApp.Attribute.INDENT_START] = 36;  // 0.5インチ
style[DocumentApp.Attribute.INDENT_FIRST_LINE] = 18; // 0.25インチ

行間と段落間隔の属性

行間はLINE_SPACINGで、通常1.0~3.0の数値(倍率)か、LineSpacing型の定数も使えます。段落前後のスペースはSPACING_BEFOREとSPACING_AFTERで、ポイント単位で指定します。

style[DocumentApp.Attribute.LINE_SPACING] = 1.5;
style[DocumentApp.Attribute.SPACING_BEFORE] = 12;
style[DocumentApp.Attribute.SPACING_AFTER] = 6;

実際のスクリプト例と失敗パターン

ここでは、よくある失敗パターンを3つ紹介します。それぞれの原因と対策を確認してください。

パターン1: 属性名を文字列で指定してしまう

初心者に多いミスです。’fontSize’や’bold’のようにプロパティ名を文字列で書くと、setAttributesはそれらを無視します。記述自体はエラーになりませんが、書式が設定されません。

/* 間違い */
paragraph.setAttributes({fontSize: 12, bold: true});
/* 正しい */
paragraph.setAttributes({[DocumentApp.Attribute.FONT_SIZE]: 12, [DocumentApp.Attribute.BOLD]: true});

パターン2: 段落を追加する前に属性を設定しようとする

appendParagraphメソッドは新しいParagraphオブジェクトを返しますが、そのメソッドを呼び出す前の段階では段落は空です。空の段落に属性を設定しても意味がありません。必ず追加後のオブジェクトに対してsetAttributesを実行します。

/* 間違い */
var p = body.appendParagraph('');
p.setAttributes(style);
p.setText('テキスト');
/* 正しい */
var p = body.appendParagraph('テキスト');
p.setAttributes(style);

パターン3: テンプレートの段落スタイルを継承してしまう

会社のテンプレートドキュメントでは、段落スタイル(Normal Text, Heading 1など)に特定の書式が設定されていることがあります。スクリプトでappendParagraphすると、そのスタイルが継承されるため、追加後にすべての属性を明示的に上書きしないと崩れます。対策として、新しい段落を作成する前にその段落のスタイルを「Normal Text」にリセットするか、setAttributesで必要な属性すべてを指定します。

// 継承を防ぐためにすべての属性を明示
var style = {};
style[DocumentApp.Attribute.HEADING] = DocumentApp.ParagraphHeading.NORMAL;
style[DocumentApp.Attribute.FONT_FAMILY] = 'Arial';
style[DocumentApp.Attribute.FONT_SIZE] = 11;
style[DocumentApp.Attribute.LINE_SPACING] = 1.15;
style[DocumentApp.Attribute.SPACING_AFTER] = 6;
// 他も同様に
paragraph.setAttributes(style);

正しいコード例と手順

以下は、書式崩れを防ぐための正しいスクリプトの流れです。この手順に沿ってコーディングしてください。

  1. ドキュメントの本文を取得する: var body = DocumentApp.getActiveDocument().getBody();
  2. 段落オブジェクトを追加する: var paragraph = body.appendParagraph('サンプルテキスト');
  3. 属性オブジェクトを作成し、必要な属性を定数で指定する: var attrs = {}; attrs[DocumentApp.Attribute.FONT_FAMILY] = 'Meiryo';
  4. 段落に属性を設定する: paragraph.setAttributes(attrs);
  5. 必要に応じて、その他の段落も同様に追加・設定する。繰り返し処理の場合は、毎回新しい属性オブジェクトを作成するか、ディープコピーして使う。

特に注意すべきは、属性オブジェクトをループ内で再利用する場合、前の設定値が残るため、毎回新しいオブジェクトにするか、Object.assignなどでコピーしてください。

比較表:正しい属性指定と間違った属性指定

設定項目 正しい指定(定数) 間違った指定(文字列) 設定結果
フォントファミリー DocumentApp.Attribute.FONT_FAMILY ‘fontFamily’ 無視され、デフォルトフォントのまま
フォントサイズ DocumentApp.Attribute.FONT_SIZE ‘fontSize’ 無視され、デフォルトサイズのまま
太字 DocumentApp.Attribute.BOLD ‘bold’ 無視され、通常の太さのまま
斜体 DocumentApp.Attribute.ITALIC ‘italic’ 無視され、通常のまま
配置 DocumentApp.Attribute.ALIGNMENT ‘alignment’ 無視され、左揃えのまま
行間 DocumentApp.Attribute.LINE_SPACING ‘lineSpacing’ 無視され、デフォルト行間のまま
段落前スペース DocumentApp.Attribute.SPACING_BEFORE ‘spacingBefore’ 無視され、0のまま
段落後スペース DocumentApp.Attribute.SPACING_AFTER ‘spacingAfter’ 無視され、0のまま
インデント開始 DocumentApp.Attribute.INDENT_START ‘indentStart’ 無視され、0のまま
インデント終了 DocumentApp.Attribute.INDENT_END ‘indentEnd’ 無視され、0のまま
一行目のインデント DocumentApp.Attribute.INDENT_FIRST_LINE ‘indentFirstLine’ 無視され、0のまま
文字色 DocumentApp.Attribute.FOREGROUND_COLOR ‘foregroundColor’ 無視され、黒のまま
背景色 DocumentApp.Attribute.BACKGROUND_COLOR ‘backgroundColor’ 無視され、透明のまま

管理者に確認すべき設定

会社のGoogle Workspace環境では、以下の点を管理者に確認しておくとトラブルを回避できます。

  • テンプレートドキュメントのデフォルトスタイル: 組織で統一のドキュメントテンプレートを使用している場合、そのテンプレートに強力な段落スタイルが設定されていることがあります。スクリプトで上書きしようとしても、テンプレートのスタイルが優先される場合があるため、テンプレート自体の見直しが必要です。
  • スクリプトの実行権限: Apps Scriptの実行には適切な承認が必要です。特に、他のドキュメントを編集する場合や、トリガーを使う場合は権限が不足していないか確認してください。
  • ドキュメントの共有範囲: スクリプトを実行するユーザーがドキュメントに対して編集権限を持っているか確認してください。読み取り専用のドキュメントでは書式変更はできません。

よくある質問(FAQ)

Q: setAttributesを使っても書式がまったく反映されません

A: 属性名が正しい定数かどうか確認してください。また、段落オブジェクトが正しく取得できているか、スクリプトのログ(console.log)で属性オブジェクトの内容を出力してみましょう。多くの場合、文字列で指定していることが原因です。

Q: 既存の段落の書式を変更したいが、なぜか変わらない

A: 既存の段落に対してsetAttributesを実行する場合、その段落が別の親要素(リストアイテムなど)の中にあると変更が適用されないことがあります。また、ドキュメントが「表示のみ」モードで開かれていると編集がブロックされるため、ドキュメントの状態も確認してください。

Q: テンプレートドキュメントの段落スタイルをスクリプトで上書きするにはどうすればいいか

A: テンプレートの段落スタイルは、ドキュメントのルートレベルで定義されています。スクリプトで上書きするには、appendParagraphする前にbody.setParagraphStyle()を使うか、段落ごとにすべての属性を明示的に設定する必要があります。ただし、そのテンプレートのスタイルを完全に無視する設定はできないため、管理者と相談の上、テンプレートのスタイル自体を変更するのが確実です。

Q: スクリプト実行後に余分な空白行が入ってしまう

A: appendParagraphを繰り返す際に、空の段落を追加していないか確認してください。また、SPACING_AFTERやSPACING_BEFOREが大きい値になっていないか、LINE_SPACINGが極端に大きくないかが原因です。各属性の値を適切に設定し、必要なければ0にしてください。

まとめ

Google ドキュメントのApps Scriptで段落書式が崩れる原因は、属性名の誤り、設定タイミング、デフォルトスタイルの継承の3つに集約されます。正しい定数(DocumentApp.Attributeの列挙値)を使用し、段落追加後にsetAttributesを実行することで、多くの問題は解決します。また、会社のテンプレートが影響している場合には、管理者と連携してテンプレートのスタイル設定を見直すことも検討してください。スクリプトの属性設定を一箇所にまとめ、再利用可能な関数化しておくと、メンテナンス性が向上し、書式崩れのリスクを減らせます。


ADVERTISEMENT

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

超解決 第一編集部

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

ADVERTISEMENT