【GAS】replaceメソッドで文字列の置換・削除を行う
スプレッドシートから取得した文字列や、スクレイピングしたHTMLテキストで特定の文字列など、Google Apps Script(GAS)で一部の文字を他の文字に置換したいケースがよくあります。
- 「株式会社ABC」を「(株)ABC」に一括で置換したい
- 全角スペースを半角スペースに修正したい
- 「2021-11-29」を「2021/11/29」に表記変更したい
上記のようにある文字列を別の文字列に置換(置き換え)をしたい場合、GASではreplaceメソッドを使うことで解決できます。この記事では、replaceメソッドの基本的な使い方や活用方法をご紹介します。
replaceメソッドとは
基礎構文
String.replace(searchPattern, replacement)
- Srting:置換対象の文字列
- searchPattern(string/regex、必須):検索パターン文字列または正規表現、一致するものが置換される
- replacement(必須):置換文字列
- 戻り値:置換後の文字列
GASで文字列を置換するにはreplaceメソッドを使います。Stringオブジェクトに対して、String.replace(searchPattern, replacement) とシンプルに記述でき、どのような処理の中でも汎用的に活用できます。
let str = '株式会社ABC';
str = str.replace((株式会社','(株)') // 「株式会社」→「(株)」
console.log(str); // (株) ABC
replaceメソッドを使った文字の削除
String.replace(searchPattern, ")
文字の置き換えではなく、文字を削除したい場合は、replacementを、String.replace(searchPattern, ")のように空にします。
let str = '株式会社ABC';
str = str.replace(株式会社','') // 「株式会社」を削除
console.log(str); // ABC
replaceメソッドは正規表現が使える
replaceメソッドの基礎構文はString.replace(searchPattern, replacement)ですが、searchPatternには正規表現が使えます。
let str_1 = '株式会社ABC';
let str_2 = 'カブシキガイシャABC';
let str_3 = '(株)ABC';
let str_4 = '(カブシキガイシャ)ABC';
console.log(str_1.replace(/(\(.*\))|カブシキガイシャ/,'株式会社')); // 株式会社ABC
console.log(str_2.replace(/(\(.*\))|カブシキガイシャ/,'株式会社')); // 株式会社ABC
console.log(str_3.replace(/(\(.*\))|カブシキガイシャ/,'株式会社')); // 株式会社ABC
console.log(str_4.replace(/(\(.*\))|カブシキガイシャ/,'株式会社')); // 株式会社ABC
正規表現はそれ自体が少し難しいですが、活用できれば処理できる幅がぐっと広がると思うのでぜひ覚えてみてください。
以下でreplaceメソッドの活用方法をご紹介します。
配列の各要素にreplaceメソッドを適応する方法
ある配列の文字列要素すべてにreplaceメソッドを適応したいことも多いです。その場合、配列にそのままreplaceメソッドを適用すればすべての要素に実行されるのではと期待してしまいますが、残念ながら、String.replace(・・・)のようにArray.replace(・・・)といった記述を行うことはできません。
手法はいくつかありますが、下記のようなループ処理を使って各要素ごとにreplaceメソッドを適応させる方法が一番イメージしやすいと思います。
let str_1 = '吾輩は猫 である。';
let str_2 = '吾輩は 猫である。';
let str_3 = '吾輩 は猫である。';
let array = [str_1, str_2, str_3];
console.log(array); //[ '吾輩は猫 である。', '吾輩は 猫である。', '吾輩 は猫である。' ]
let replaced_array = [];
for(value of array){
let idnex = array.indexOf(value);
replaced_array[idnex] = value.replace(' ','');
}
console.log(replaced_array); //[ '吾輩は猫である。', '吾輩は猫である。', '吾輩は猫である。' ]
または関数の理解が必要ですが、map関数を使うとシンプルな記述ができます。
let replaced_array = array.map((value) => {return value.replace(' ','')});
console.log(replaced_array); //[ '吾輩は猫である。', '吾輩は猫である。', '吾輩は猫である。' ]
スプレッドシート上の文字列をreplaceメソッドを使って置換する
GAS上でreplaceメソッドと正規表現を活用してスプレッドシートの値を修正してみます。今回は下記のような会社名・担当者名・アドレスが格納されたデータを想定します。
フォーム等を自分で入力してもらうと表記ゆれがおおいですよね。A列には株式会社を示す表記が複数の略式が使われているので、これらを「株式会社」に統一してみます。手順としては置換対象の文字列を配列として取得し、各要素ごとに置換を実行しながらスプレッドシートに格納していきます。
let sheet = SpreadsheetApp.getActiveSheet();
let lastrow = sheet.getLastRow();
let range = sheet.getRange(2,1,lastrow-1,1);
let values = range.getValues().flat();
for(let value of values){
let index = values.indexOf(value);
sheet.getRange(2+index,2,1,1).setValue(value.replace(/(\(株\))|(\(株\))/,'株式会社'));
replaceメソッドで複数の文字列を置換する
同じ条件で複数の文字列を置換する場合
例えば、 「2021-11-29」を「2021/11/29」に変えたい場合はどのように記述すればよいでしょうか。2つの「-」が2つの「/」に置き換わっているだけなので、先程と同様の記述で問題ないでしょうか。
let str_2 = '2021-11-16';
console.log(str_2); // 2021-11-16
str_2 = str_2.replace('-', '/') // 「-」を「/」に置換
console.log(str_2); // 2021/11-16
最初の「-」しか置換されませんでした。これはreplaceメソッドがデフォルトでは、最初に一致した指定文字列のみを置換するためです。
該当するすべて文字列を置換する場合は、 String.replace(/searchPattern/g, replacement) と正規表現とグローバル検索オプションで指定する必要があります。
let str_3 = '2021-11-16';
Logger.log(str_3); // 2021-11-16
str_3 = str_3.replace(/-/g, '/') // すべての「-」を「/」に置換
console.log(str_3); // 2021/11/16
異なる条件で複数の文字列を置換する場合
異なる条件で置換を繰り返す場合には、シンプルにreplaceメソッドを連続で記述します。
let str_4 = '2021年11月16日';
console.log(str_4); // 2021年11月16日
str_4 = str_4.replace('年','/').replace('月','/') .replace('日','')
console.log(str_4); // 2021/11/16
まとめ
replaceメソッドで文字列を置換する方法をご紹介しました。
- replaceメソッドはStringオブジェクトに対して「String.replace(searchPattern, replacement)」と記述できる
- 検索した文字列を削除したい場合は、置換先の指定を「"」と空にする
- replaceメソッドで、置換対象の文字列検索には正規表現が使える
- 配列の各要素にreplaceメソッドを適応するには、ループ処理で各要素に逐次実行するかmap関数を使う
- スプレッドシートに記載されている内容の修正や、複数の文字列の置換もできる