【GAS】配列に指定文字列が含まれているか検索する(includes / indexOf / lastIndexOf / filter)
Google Apps Script(GAS)プログラムのあらゆる場面で、配列(Arrayオブジェクト)が重要な役割を果たすため、処理対象の配列に求めている値があるのかや、配列内の検索結果に対する分岐処理をうまく行えると全体の効率が大幅にアップします。
この記事では、配列内の要素に対して完全一致・部分一致・正規表現で検索する方法をご紹介します。
配列に文字列が含まれているか検索する方法
GASで配列に文字列が含まれているかどうかを検索する主な方法は下記の通りです。
- includesメソッド(完全一致)
- indexOfメソッド / lastIndexOfメソッド(完全一致)
- filterメソッド&matchメソッド(完全一致・部分一致・正規表現)
どのような結果を取得したいかによって使用する手法を使い分けてみてください。
手法 | 検索条件 | 戻り値 |
---|---|---|
includesメソッド | 完全一致 | 検索した文字列が配列に含まれてれば「True」、なければ「False」を返す |
indexOfメソッド lastIndexOfメソッド | 完全一致 | 検索した文字列が配列に含まれてればそのインデックス番号、なければ「-1」を返す |
filterメソッド & matchメソッド | 部分一致 正規表現 完全一致 | 検索条件が一致する要素を含む配列 ※すべての要素が条件を満たさなければ空の配列を返す |
本記事では配列に対する処理方法をご紹介しますが、GASでは特定の文字列に対して指定文字列が含まれているかを検索したいシーンも多いです。文字列に対する検索方法は下記の記事をご覧ください。
includesメソッド
Array.includes(searchPattern)
- searchPattern(必須):検索条件となる文字列
- 戻り値:検索した文字列が配列に含まれてれば「True」、なければ「False」を返す
let lesson_day1 = ['langage', 'math', 'science', 'PE'];
console.log(lesson_day1.includes('langage')); //true
console.log(lesson_day1.includes('lang')); //false
使い方は文字列への適応と同様で、検索条件を引数として対象の配列に対してincludesメソッドを実行します。戻り値は真偽です。
文字列にincludesメソッドを実行するときは文字列の部分一致が真偽判定されましたが、配列に適応する際は、検索条件の文字列と完全一致する要素がその配列に含まれているかが検索対象であることに注意してください。
trueとfalseで返してくれるので、反復処理や条件分岐がシンプルになります。
構文を記載する前に活用シーンから紹介してしまいますが、「指定文字列がある配列に含まれているかどうかの検索」が最も力を発揮するシーンはスプレッドシート操作時だと個人で気には考えています。
膨大なセル数の値を読み込んだ際も、本記事でご紹介するようなメソッドを使えば、指定の値が存在するのかという審議判定やどの行列に含まれているかの抽出操作が格段に楽になります。
indexOfメソッド / lastindexOfメソッド
Array.indexOf(searchPattern
[,from])
Array.lastIndexOf(searchPattern [,from])
- val(必須):検索したい文字列
- from(任意):検索開始位置を指定するインデックス番号
※例:indexOf()で3つ目の要素から最後まで検索してほしければ「2」を指定
※指定位置が配列数より大きければ「-1」を返す。また指定位置が負の値であれば逆向きにカウントされる - 戻り値:検索した文字列が配列に含まれてればそのインデックス番号、なければ「-1」を返す
let lesson_day2 = ['langage', 'math', 'science', 'langage', 'math', 'math'];
console.log(lesson_day2.indexOf('math')); //1
console.log(lesson_day2.indexOf('math',2)); //4
console.log(lesson_day2.indexOf('PE')); //-1
インデックスに指定した場所から検索を始めるので、2つ目のconsoleでは2個目(インデックス1)に格納されている’math’は検索対象にならず、5個目(インデックス4)の’math’に初めてヒットしています。
indexOfメソッド、lastIndexOfメソッドはインデックス番号を返してくれるため、配列に適応するときには探している要素の抽出が楽になります。
let lesson_day2 = ['langage', 'math', 'science', 'langage', 'math', 'math'];
if(lesson_day2.indexOf(fav_lesson) > -1){
console.log(`${fav_lesson}は${lesson_day2.indexOf(fav_lesson)+1}時間目にあります`);
}else{
console.log(`${fav_lesson}はありません`);
}
if(lesson_day2.indexOf(unfav_lesson) > -1){
console.log(`${unfav_lesson}は${lesson_day2.indexOf(unfav_lesson)+1}時間目にあります`);
}else{
console.log(`${fav_lesson}はありません`);
}
PEはありません
scienceは3時間目にあります
filterメソッド & matchメソッド
GASで配列(Array)に対して、要素の部分一致検索を直接適応できるメソッドはなく、配列要素の反復処理を活用して実現します。方法は複数ありますが、一番わかりやすいのは部分一致検索用の関数をカスタムで作成して、配列に対してその関数を引数にFilterメソッドを適応する方法でしょう。
Array.filter(fnc)
- fnc(必須):配列の要素が満たす条件を表す関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:一つの要素でも条件を満たせば条件に該当する要素の配列、すべて満たさなければ空の配列を返す
let lessons = ['Japanese', 'langage', 'economics', 'science', 'music', 'math', 'PE', 'art', ];
function stringParticalMatch(value) {
return value.match('c'); // 「c」が含まれる
}
console.log(lessons.filter(stringParticalMatch)); //[ 'economics', 'science', 'music' ]
配列に対して正規表現検索を行いたい場合、matchメソッドの引数を正規表現にしてあげればOKです。
let lessons = ['Japanese', 'langage', 'economics', 'science', 'music', 'math', 'PE', 'art', ];
function stringRegexMatch(value) {
return value.match(/s.*c/); // 「s *** c」が含まれる
}
console.log(lessons.filter(stringRegexMatch)); // [ 'science', 'music' ]
上記の例ではmatchメソッドを使いましたが、真偽で帰ってくれば良いので例えばincludesメソッドなどでも同じ結果となります。
let lessons = ['Japanese', 'langage', 'economics', 'science', 'music', 'math', 'PE', 'art', ];
function stringParticalMatch(value) {
return value.includes('c'); // 「c」が含まれる
}
console.log(lessons.filter(stringParticalMatch)); //[ 'economics', 'science', 'music' ]
ここまででお気づきの方もいるかと思いますが、正規表現を使えるということは正規表現で完全一致を指定すればfilterメソッドとmatchメソッドでも配列の完全一致を表現できます。
お好みでincludesメソッド・indexOfメソッド / lastIndexOfメソッドと使い分けてみてください。
let lessons = ['Japanese', 'langage', 'economics', 'science', 'music', 'math', 'PE', 'art', 'home economics'];
function stringPerfectMatch_1(value) {
return value.match(/economics/); // 「economics」が含まれる
}
function stringPerfectMatch_2(value) {
return value.match(/^economics$/); // 「economics」完全一致
}
console.log(lessons.filter(stringPerfectMatch_1)); // [ 'economics', 'home economics' ]
console.log(lessons.filter(stringPerfectMatch_2)); // [ 'economics' ]
条件に該当する要素数をカウントする
filterメソッド適応で条件に該当する要素の配列を返してくれるので、戻り値の配列の長さを求めます。
let lessons = ['Japanese', 'langage', 'economics', 'science', 'music', 'math', 'PE', 'art', 'home economics'];
function multiStringMatch(value){
return value.match(/economics|science/);
}
//条件に該当する要素の配列
console.log(lessons.filter(multiStringMatch));
//条件に該当する要素数をカウント
console.log(lessons.filter(multiStringMatch).length); // 3
まとめ
GASにおける配列に対する文字列の検索方法をご紹介しました。ぜひ活用してみてください。
手法 | 検索条件 | 戻り値 |
---|---|---|
includesメソッド | 完全一致 | 検索した文字列が配列に含まれてれば「True」、なければ「False」を返す |
indexOfメソッド lastIndexOfメソッド | 完全一致 | 検索した文字列が配列に含まれてればそのインデックス番号、なければ「-1」を返す |
filterメソッド & matchメソッド | 部分一致 正規表現 完全一致 | 検索条件が一致する要素を含む配列 ※すべての要素が条件を満たさなければ空の配列を返す |