【GAS】文字列に指定文字列が含まれているかの確認(match / indexOf / lastIndexOf / search / includes)
Google Apps Script(GAS)プログラム処理やスプレッドシートを処理する際、特定の文字列を含んでいるか調べたり配列から部分一致で検索をかけて抽出したいシーン多いですよね。GASもそんな状況で使えるメソッドや関数がいくつか用意されています。
この記事ではGASを使って特定の文字列が含まれているかどうか検索をかける方法をご紹介します。
文字列が含まれているか検索する方法
GASで文字列が含まれているかどうかは、文字列に対して検索をするか、配列に対して検索するかで対応が異なってきます。各目的に対して主な手法は下記の通りです。
- match関数
- includesメソッド
- indexOfメソッド / lastIndexOfメソッド
- searchメソッド
- indexOfメソッド / lastIndexOfメソッド
- includesメソッド
文字列であればmatch関数、配列であればindexOfメソッドが良く使われますが、用途によっては他の方法の方が記述がシンプルになる場合もあります。本記事のサンプルを見ながらそれぞれの使い方を確認してみてください。
また、この記事では文字列に対する検索に絞ってご紹介します。配列に対する検索方法を確認したい場合は下記の記事をご覧ください。
文字列検索手法の引数と戻り値比較
各手法ともに基本的には期待したい役割は一緒ですが、引数にできるものや戻り値が異なるため、一覧で整理しておきます。
手法 | 引数 | 戻り値のデータ型 | 一致の場合 | 不一致の場合 |
---|---|---|---|---|
match関数 | String or Regex | Array | 検索結果の配列 | null |
includesメソッド | String | Boolean | TRUE | FALSE |
indexOfメソッド lastIndexOfメソッド | String | Integer | 一致した位置 | -1 |
searchメソッド | String or Regex | Integer | 一致した位置 | -1 |
それではここから各手法の使い方を確認していきましょう。
match関数
基本構文
String.match(searchPattern [option])
- String:指定文字列が含まれているかを検索したい対象の文字列
- searchPattern(必須):検索条件となる文字列(正規表現でも可)
- option(d/g/i) ※正規表現時のみ
└d:一致した文字列の位置を生成
└g:グローバル検索(一致する条件を複数回検索)
└i:大文字・小文字を区別しない - 戻り値:検索パターンが存在すれば検索結果の配列、存在しない場合はnull
let str_1 = '東京都';
let str_2 = '北海道';
let str_3 = '大阪府';
let str_4 = '京都府';
//「都」が含まれているかの検索
console.log(str_1.match('都')); // [ '都', index: 2, input: '東京都', groups: undefined ]
console.log(str_2.match('都')); // null
console.log(str_3.match('都')); // null
console.log(str_4.match('都')); // [ '都', index: 1, input: '京都府', groups: undefined ]
//「都」が最後の文字として含まれているかの検索
console.log(str_1.match(/都$/)); // [ '都', index: 2, input: '東京都', groups: undefined ]
console.log(str_2.match(/都$/)); // null
console.log(str_3.match(/都$/)); // null
console.log(str_4.match(/都$/)); // null
前半の文字列の指定では「都」が含まれているかどうかを判定しているだけなので「京"都"府」も該当してしまってますが、後半の正規表現指定では、『「都」で終わる文字列』を指定しているため「東京"都"」のみが該当しています。
活用方法
条件にマッチしない場合はnullを返してくれるため条件分岐処理が非常に楽です。
47都道府県のリストを読み込みんだ配列にmatch関数を適用し、特定の漢字が含まれる都道府県だけ検索・抽出してみます。
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let range = sheet.getDataRange();
let values = range.getValues().flat();
// 要素数分繰り返し
for(let i of values){
//「山」が含まれる都道府県のみアウトプット
if(i.match('山')){
console.log(i);
}
}
山形県
富山県
山梨県
和歌山県
岡山県
山口県
正規表現も駆使しながら任意の文字列が含まれるかどうかを判定できるので、条件分岐を含めた複雑な処理にも役立ちそうです。
matchメソッドは下記の記事で詳しく解説しています。
includesメソッド
基本構文
String.includes(searchPattern)
- String:指定文字列が含まれているかを検索したい対象の文字列
- searchPattern:検索条件となる文字列
- 戻り値:検索パターンが存在すれば「True」、しなければ「False」
let str_1 = '東京都';
let str_2 = '北海道';
let str_3 = '大阪府';
let str_4 = '京都府';
console.log(str_1.includes('都')); //true
console.log(str_2.includes('都')); //false
console.log(str_3.includes('都')); //false
console.log(str_4.includes('都')); //true
includesメソッドは挙動はmatch関数に似ていますが、違いとしては正規表現が使えないことと、戻り値は真偽であることです。trueとfalseで分岐させたいときなどはincludesメソッドの方が良いかもしれません。
trueとfalseで返してくれるので、反復処理もmatch関数同様にシンプルな記述ができます。
let ss = SpreadsheetApp.getActiveSpreadsheet();
let sheet = ss.getActiveSheet();
let range = sheet.getDataRange();
let values = range.getValues().flat();
// 要素数分繰り返し
for(let value of values){
//「山」が含まれる都道府県のみアウトプット
if(value.includes('山')){
console.log(value);
}
}
山形県
富山県
山梨県
和歌山県
岡山県
山口県
indexOfメソッド、lastindexOfメソッド
基本構文
String.indexOf(searchPattern
[,from])
String.lastIndexOf(searchPattern [,from])
- String:指定文字列が含まれているかを検索したい対象の文字列
- searchPattern(必須):検索条件となる文字列
- from(任意):検索を始める場所の指定、indexOfは先頭から、lastIndexOfは最後尾から数える
- 戻り値:検索パターンが存在すればその位置、存在しない場合は「-1」
let str_1 = '東京都';
let str_2 = '北海道';
let str_3 = '大阪府';
let str_4 = '京都府';
console.log(str_1.indexOf('都')); //2
console.log(str_2.indexOf('都')); //-1
console.log(str_3.indexOf('都')); //-1
console.log(str_4.indexOf('都')); //1
match関数でもマッチした位置は配列になって返されるので下記のような表現で同じ結果を得られます。一方、indexOfメソッドは正規表現は使えないので、使い勝手としてはmatch関数の方が便利かもしれません。
indexOfメソッドはマッチした位置を返してくれるので、それだけ取得したい場合は少し楽になりそうです。
let str_1 = '東京都';
console.log(str_1.indexOf('都')); //2
console.log(str_1.match('都').index); //2
//match関数の戻り値がnullだった場合はエラーになる
let str_2 = '北海道';
console.log(str_2.match('都').index); // TypeError: Cannot read property 'index' of null
引数を指定したときのindexOfとlastIndexOfの挙動の違い
lastIndexOfメソッドと引数を加えたときの挙動について確認しておきます。引数を指定するときとしない時でスタートの位置が異なるので若干注意が必要です。
- 引数指定なし→indexOfメソッドは先頭から、lastIndexOfメソッドは最後尾から検索開始
- 引数指定あり→indexOfメソッドとlastIndexOfメソッドともに引数で指定した位置から検索開始
let str = 'とうきょうとっきょ';
console.log(str.indexOf('と')); //0
console.log(str.lastIndexOf('と')); //5
console.log(str.indexOf('と',2)); //5
console.log(str.lastIndexOf('と',2)); //0
searchメソッド
基本構文
String.search(searchPattern)
- String:指定文字列が含まれているかを検索したい対象の文字列
- searchPattern(必須):検索条件となる文字列(正規表現でも可)
- 戻り値:検索パターンが存在すればその位置、存在しない場合は「-1」
indexOfとlastIndexOfはパラメータに正規表現は使えませんでしたが、searchメソッドは正規表現が使えます。戻り値はindexOfらと同様です。
活用方法
match関数と同じ例を使います。同様にif文の条件として使えますが、indexOfの指定条件にマッチしなくても「-1」という実数を返してくれるのでこのままでは条件分岐できません。
『indexOf条件!=-1』(「-1」ではない場合)で指定すれば問題なく実行できます。
// 要素数分繰り返し
for(let i of values){
//「山」が含まれる都道府県のみアウトプット
if(i.indexOf('山')!=-1){
console.log(i);
}
}
山形県
富山県
山梨県
和歌山県
岡山県
山口県
まとめ
GASで特定の文字列が含まれているかどうか検索する方法をご紹介しました。プログラムが記述しやすいように使い分けてみてください!
手法 | 引数 | 戻り値のデータ型 | 一致の場合 | 不一致の場合 |
---|---|---|---|---|
match関数 | String or Regex | Array | 検索結果の配列 | null |
includesメソッド | String | Boolean | TRUE | FALSE |
indexOfメソッド lastIndexOfメソッド | String | Integer | 一致した位置 | -1 |
searchメソッド | String or Regex | Integer | 一致した位置 | -1 |