ADVERTISEMENT

【Googleドキュメント】Apps Scriptで差し込み文書の改行が崩れる時の修正方法

【Googleドキュメント】Apps Scriptで差し込み文書の改行が崩れる時の修正方法
🛡️ 超解決

GoogleドキュメントとGoogle Apps Scriptを組み合わせて差し込み文書を作成していると、改行が意図しない形で崩れるトラブルに遭遇することがあります。例えば、スプレッドシートのセル内で改行されて入力されたデータをドキュメントに挿入すると、改行が無視されたり、余計な空白行が入ったり、文字化けのように見えたりするケースです。この問題は、スクリプト内での改行コードの扱い方や、ドキュメントの段落スタイルの違いに起因することがほとんどです。本記事では、改行崩れの原因を具体的に解説し、現場で即座に試せる修正手順をステップごとに紹介します。また、よくある失敗パターンや管理者へ伝えるべき情報もまとめていますので、トラブルシューティングの参考にしてください。

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

  • 最初に見る場所: スプレッドシートの元データとスクリプト内の改行コード(\n, \r\n,
    など)
  • 切り分けの軸: データ側の問題か、スクリプトの処理ロジックの問題か、ドキュメントの書式設定の問題か
  • 注意点: 会社PCでスクリプトエディタに勝手な変更を加える前に、共有ドライブのバックアップや管理者の承認を得る

ADVERTISEMENT

差し込み文書で改行が崩れる原因と仕組み

改行トラブルの根本原因は、データの改行コードとドキュメントの改行表現のミスマッチです。スプレッドシートのセル内で改行されたテキストは、内部的には「\n」(ラインフィード)として保存されます。一方、Googleドキュメントの段落区切りは「\r\n」または段落ブレーク(改行+改段落)で管理されます。Apps Scriptで差し込みを行う際に、単純に文字列を置換すると、改行コードがそのままドキュメントに反映されず、意図しない行間や段落になることがあります。

もう一つの原因は、テンプレートドキュメントの段落スタイルです。ドキュメント内で「改行」として扱われるのは、Shift+Enterによる強制改行(ラインブレーク)と、Enterによる段落区切り(パラグラフブレーク)の2種類があります。スプレッドシートの「\n」をラインブレークに変換するか、パラグラフブレークに変換するかで見た目が変わります。スクリプトの処理を誤ると、すべての改行が無視されたり、逆に空の段落が大量に挿入されたりします。

まず確認すべきこと: データとテンプレートの状態

修正に入る前に、問題の切り分けのために以下の3点を確認してください。これにより、対策の方向性が明確になります。

スプレッドシートのセル内改行の有無

差し込み元のスプレッドシートで、改行を含むセルを選択し、数式バーで確認します。改行がある場合、セル内では「改行」という文字で表現されます(例:”1行目\n2行目”)。この「\n」が実際の改行コードです。セル内で手動改行(Alt+Enter)したかどうかも確認してください。

スクリプトの改行処理コード

Apps Scriptのエディタを開き、差し込みを行っている関数を確認します。例えば、body.replaceText('{{placeholder}}', value) のようなコードでは、value内の改行が自動的に処理されない場合があります。特に、value をそのまま使っていると、改行が無視されることが多いです。

ドキュメントのプレースホルダー位置

テンプレートドキュメント内でプレースホルダー(例:{{name}})が段落の途中にあるか、独立した段落になっているかも影響します。プレースホルダーが段落内にある場合、差し込み後の改行がその段落内のラインブレークとして扱われるか、新しい段落として扱われるかが変わります。

改行を正しく保持する修正手順

以下に、具体的な修正手順を5つのステップで示します。この手順は、スプレッドシートのデータ内の改行(\n)をGoogleドキュメントのラインブレーク(段落内改行)に変換する方法です。必要に応じてパラグラフブレークに変更することもできます。

  1. Apps Scriptエディタを開き、差し込み処理を行う関数を特定します。
  2. 差し込む値(例:var value = sheet.getRange(row, col).getValue();)を取得した後、次の行で改行コードを変換します。
    value = value.replace(/\n/g, '
    ');
    ただし、このままではHTMLの改行タグとして認識されないため、ドキュメントの Body クラスのメソッドを使う必要があります。
  3. 実際には、body.replaceText() の代わりに body.editAsText().replaceText() を使用し、正規表現で改行をラインブレーク文字( や特殊な段落区切り)に変換するのが確実です。以下のコード例を参照してください。
    // 改行を段落内改行(ラインブレーク)に変換
    function insertWithLineBreaks(body, placeholder, value) {
      var text = body.editAsText();
      var replaced = value.replace(/\n/g, String.fromCharCode(10)); // ラインフィード
      text.replaceText(placeholder, replaced);
    }
  4. ただし、replaceText() は改行コードをそのまま扱えない場合があるため、段落を分けて挿入する方法も検討します。例えば、改行ごとに段落を分割し、body.insertParagraph() で順次追加するアプローチです。
  5. 最後に、修正後のスクリプトをテスト実行し、ドキュメントの出力を確認します。改行が正しく反映されていることを検証したら、本番データでも同様にテストしてください。

補足: 改行コードをパラグラフブレークにしたい場合

差し込み後のテキストの各行を独立した段落にしたい場合は、改行コードを段落区切りとして扱う必要があります。その場合は、以下のように body.replaceText() で直接改行を段落に変換するのではなく、文字列を分割して段落要素として追加します。こちらも代表的な手法です。

// 改行ごとに段落を分けて挿入
function insertAsParagraphs(body, placeholder, value) {
  var lines = value.split('\n');
  var rangeElement = body.findText(placeholder);
  if (rangeElement) {
    var parent = rangeElement.getElement().getParent();
    var index = body.getChildIndex(parent);
    // プレースホルダーを削除
    rangeElement.getElement().removeFromParent();
    // 各行を段落として挿入
    for (var i = 0; i < lines.length; i++) {
      var paragraph = body.insertParagraph(index + i, lines[i]);
      paragraph.setLineSpacing(1.15); // 適宜スタイル設定
    }
  }
}

よくある失敗パターンと注意点

実際の現場でよく見られる失敗例を表にまとめました。同じケースに陥っていないか確認してください。

パターン 現象 原因 対策
改行がすべて削除される 差し込み後にテキストが一行に連なる replaceText()が改行を無視するため 上記の手順で明示的に改行変換を行う
異常な空白行が多数入る 改行が段落区切りとして解釈され空の段落が生成される スプレッドシートのデータに空行(連続改行)が含まれている 事前にデータの空行を削除 or 正規表現で連続改行を1つに
改行が文字化け(四角い記号など)で表示される 画面上に□や特殊記号が現れる 改行コードを直接文字列として埋め込んでしまった String.fromCharCode(10) など正しい方法で改行を設定する

また、注意点として、会社の共有ドライブに保存されたスクリプトを修正する場合は、必ずバックアップを取ってから変更してください。管理者によってはスクリプトの編集権限が制限されていることもあります。また、スクリプトの実行ログ(View > Logs)で改行コードの変化をデバッグすると、原因の特定が容易です。

管理者へ確認する情報

組織内でApps Scriptを利用している場合、改行問題の解決には以下の情報を管理者に伝えるとスムーズです。

  • 差し込み文書のテンプレートファイル(Googleドキュメント)のIDと、スクリプトがバインドされているかスタンドアロンか
  • 問題が発生する具体的なデータのサンプル(スプレッドシートの行をエクスポートしたもの)
  • スクリプトのエラーログや、期待する出力と実際の出力のスクリーンショット
  • 管理者側でGoogle Workspaceの設定変更が必要かどうか(例えば、Apps Scriptのランタイムバージョンやスコープの確認)

特に、Google Workspace for EducationやBusiness Plusなど、組織によってはApps Scriptの実行制限が異なる場合があります。改行処理に影響する制限はほとんどありませんが、スクリプトの実行時間やトリガー設定に関する制約が間接的に影響することも考えられます。

よくある質問(QA)

Q1: 改行コードを\r\nに変換しても直りません

A: Googleドキュメントでは、\r\nは段落区切りとして解釈されることが多いです。見た目が崩れる原因は、改行コードではなく、挿入方法にあります。body.replaceText() はテキスト内の改行を認識しないため、段落を分割する方法(上記のinsertAsParagraphs関数)を試してください。

Q2: 差し込み後に書式(フォントサイズなど)がリセットされる

A: プレースホルダーを削除して新規段落を挿入すると、その段落にデフォルトの書式が適用されるためです。これを防ぐには、insertParagraph() の後に setAttributes() で書式をコピーするか、既存の段落を複製して内容だけを書き換える方法を検討してください。

Q3: スプレッドシートの改行をそのまま保持したいだけなのに、なぜこんなに複雑なのですか?

A: アプリケーション間で改行の扱いが異なるためです。スプレッドシートの改行は単なるラインフィードですが、ドキュメントでは段落構造を持つため、そのままでは適切にレンダリングされません。目的に応じてラインブレークかパラグラフブレークかを選択する必要があります。一度実装してしまえば、テンプレートを増やす際にも再利用できるので、初期の学習コストとして考えてください。

まとめ

GoogleドキュメントのApps Scriptによる差し込み文書で改行が崩れる問題は、改行コードの変換と段落の挿入方法を適切に選択することで解決します。まずはデータとスクリプトの現状を確認し、本記事で紹介した「ラインブレーク変換」または「パラグラフ分割」のコードを試してください。改行がすべて消える、空白行が増える、文字化けするといった症状ごとに、表で示した対策を参考にすると効率的です。管理者と連携しながら、組織内のテンプレート資産を安定して運用するための基盤を整えましょう。


ADVERTISEMENT

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

超解決 第一編集部

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

ADVERTISEMENT