こんにちは、おかちゃんせんせいです!
最近仕事の依頼で、Googleドキュメントで作られた文章の中で特定文字列を一括置換して、PDF作成することになりました。
その中で、なぜかエラーになった箇所があって、ネットで検索しても解決策がヒットしませんでしたので、文字列一括置換でエラーになってしまう現象について整理することにしました。
目次
なぜか検索パターンに数字が含まれるとエラーに・・・
細かいコードの解説は省きますが、
実現したいことはGoogleドキュメントにある特定箇所(文字列)を、指定の文字列に変換したい。
そのためには、まずドキュメントを取得後、Body要素を取り出し、replaceTextで置換する必要があります。
body.replaceText(searchPatturn,replacement)
function myFunction() {
//ドキュメントをIDで開く
let doc = DocumentApp.openById("1tv-g7DsuVn-mR5Y9GfKC48qnU3nCh2AzDAIkArkqWGY");
//ドキュメントからBody要素を取得し、bodyに代入する
let body = doc.getBody();
let testArr = {
"{name}":"アルファベットのみ",
"{名前}":"漢字のみ",
"{なまえ}":"ひらがなのみ",
"{ナマエ}":"カタカナのみ",
"{name1}":"アルファベット+数字",
"{名前1}":"漢字+数字",
"{123}":"数字のみ"
};
//for文で配列の中からkey(置換対象)を取り出し、Valueに置換する
for (let arr in testArr) {
body.replaceText(arr, testArr[arr]);
};
}
このreplaceTextが活用できる例としては、
契約書などで入力の必要がある「会社名」「代表者名」「契約開始日」などの項目をsearchPattrnとして、変換したい文字列をreplacementとして置換できるようにする。
そうすることで、仮に「会社名」に該当する箇所が複数箇所あったとしても、replaceTextで一括置換ができるようになりとても便利です。
なので、searchPatturnを記入したドキュメントをテンプレートとして用意して、GASでテンプレートをコピーした上で一括変換すれば書類作成を自動化できるようになる、ということになります。
そこで、今回replaceTextで契約書自動作成を実現しようとしたところ、まさかのエラーが発生!?
その発生箇所は、{数字}となっているsearchPatturnでした。
ネットで検索しても、{}で囲われた数字のみのsearchPatturnの場合にエラーとなる、というような記事は見つからず。。。
GoogleドキュメントでsearchPatturnを準備しておく。
Exception: Invalid regular expression pattern {123}
解決ポイントは、検索対象(searchPatturn)は正規表現が使えること
あれこれ検索しても解決方法が見つからず途方に暮れていたところ、原点にもう一度戻ってreplaceTextの引数を見直すことに。
そうしたところ、searchPatturnは正規表現が使えるということがポイントだと考察。
カッコで囲われている文字列のうち、漢字・ひらがな・カタカナ・アルファベットのみは問題ないけれど、数字のみはNG。
ということは、もしかしたら数字を「正規表現として扱う」と明記すればエラーが回避できるのではと推察。
そこで、{/123/}のように数字をスラッシュ(/)で囲ってみることに。
すると——
推察した通り数字を正規表現として扱うように明記したことで、エラーが回避できました!
ちなみに、{}で囲わずに数字のみの場合にはエラーになりません。
ただ、数字のみにしてしまうと、予期せぬ個所まで置換されてしまう可能性があるため、括弧で囲って他の箇所とは違うようにする工夫は必要かと思います。
正規表現の理解が乏しいため、なぜエラーになってしまったかについて説明はできませんが、もし同じ現象で困っている方がいましたら、数字をスラッシュで囲んでみてくださいね。
replceTextで{数字}
- replceTextで{数字}を検索対象にするとエラーになる。
- 数字をどうしても検索対象にしたいときには、数字をスラッシュ(/)で囲んで正規表現として扱えるようにする