MENU

GASで文書の差し込み文字を置換する

当ページのリンクには広告(PR)が含まれていることがあります。
GASで文書の差し込み文字を置換する。文書の差し込み、記号を区別、置換結果を確認の処理例。

Googleドキュメントの{{部署名}}をGASで置き換えたい場合、replaceTextへ渡す検索文字列は正規表現として扱われます。括弧やドットなどを含む文字を、そのまま単なる文字として渡したつもりにならないようにします。

元のテンプレートを残したコピーで、見つかった差し込み文字だけを置換します。以下の例は1タブの練習用文書が対象です。複数タブやヘッダーへ勝手に広げず、検索範囲を明確にします。

目次

差し込み文字を文字列として探す

公式のBody.replaceTextは、検索パターンを文字列で受け取り、RE2という正規表現の仕組みを使います。JavaScriptの正規表現オブジェクトをそのまま渡す指定ではありません。

練習用文書を手動でコピーし、本文へ「部署:{{部署名}}」「対象月:{{対象月}}」と入れます。{{部署名}}のような目印の途中に改行を入れず、まず1つの連続した文字列で用意してください。

コピーした文書のIDを使い、元テンプレートのIDをコードに入れないようにします。この例はコピーの作成までは自動化せず、置換する対象の確認から始めます。

置換前に目印があるか確認する

次の関数は全目印を先に探し、見つからない項目があれば書き換える前に止めます。置換文字列に$やバックスラッシュがある場合も、この練習例の対象外として拒否します。

function escapeSearchText(text) {
  return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

function replacePracticeTokens(doc, replacements, apply) {
  const tabs = doc.getTabs();
  if (tabs.length !== 1 || tabs[0].getChildTabs().length !== 0) {
    throw new Error('子タブのない1タブの練習用文書を指定してください');
  }
  const body = tabs[0].asDocumentTab().getBody();
  const entries = Object.entries(replacements);
  entries.forEach(function ([token, value]) {
    if (typeof value !== 'string' || /[\\$]/.test(value)) {
      throw new Error('この例は$とバックスラッシュを含む置換値を扱いません');
    }
    if (!body.findText(escapeSearchText(token))) throw new Error('目印がありません: ' + token);
  });
  if (apply === true) {
    entries.forEach(([token, value]) => body.replaceText(escapeSearchText(token), value));
    doc.saveAndClose();
  }
  return {tokens: entries.map(entry => entry[0]), changed: apply === true};
}

function previewDocumentReplacement() {
  const APPLY = false;
  const doc = DocumentApp.openById('コピーした練習用文書ID');
  console.log(JSON.stringify(replacePracticeTokens(doc,
    {'{{部署名}}': '営業部', '{{対象月}}': '2026-11'}, APPLY)));
}

APPLY:falseでは目印の確認までです。コピーのIDと目印が正しいことを確認し、置換を試すときだけtrueにします。結果は「部署:営業部」「対象月:2026-11」になる想定です。処理の途中で失敗した場合は、コピーの現在の内容を見てからやり直します。

文字の区切りで見つからない場合

公式資料は、パターンが要素内の各テキストブロックに対して個別に照合されると説明しています。目印が別のテキストブロックへ分かれていると、見た目がつながっていても見つからない場合があります。

まず練習用コピーで目印を打ち直し、改行や書式の切り替わりとの関係を確かめます。見つからないからと、文書全体の文字を取り出して上書きすると、表や書式を失う可能性があります。必要な置換範囲だけを扱います。

ヘッダーやフッターは、このコードが取得したBodyとは別です。差し込み文字が本文外にある場合は、対象の要素を明示して扱う必要があります。複数タブへ広げるときも、対象タブを列挙してから変更します。

置換できたことと帳票の完成は別

文字列が変わっても、桁が長くなって改ページしたり、表の幅からはみ出したりする場合があります。最終的な文書やPDFの表示は、元のテンプレートと比べて確認します。

ローカルでは代用Bodyで、正規表現記号のエスケープ、目印の欠落、previewの無変更、置換・保存の順番、対象外文字を確認しました。Google Docsの書式やRE2による実際の置換は未実行です。帳票をPDFへ出力する流れやDriveの保存先管理と、置換の確認を分けて進めてください。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次