Google Apps Scriptで配列の検索をするindexOfメソッドとlastIndexOfメソッド

index

photo credit: Craig Stanfill Greeting Jeter via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptでスプレッドシートのデータを配列に格納して操作をする方法を色々とお伝えするシリーズです。

前回は、以下の記事でスプレッドシートの行を削除する方法についてお伝えしました。

301 Moved Permanently

これまで紹介したテクニックも便利なのですが、今回からいよいよ配列操作にする醍醐味とも言ってもいい「データの検索」について紹介をしていきたいと思います。

シートの検索…普通にgetValueとか使っちゃうと、とーっても遅いんですよね。

それを配列で超高速にやってしまおう!ということです。

まず、手始めにGoogle Apps Scriptで配列の検索をするindexOfメソッド、lastIndexOfメソッドの使い方についてお伝えします。

では、行ってみましょう!

スポンサーリンク

indexOfメソッドで配列内を検索する

JavaScriptでは配列内を検索してインデックスを返すという便利なメソッドがあります。

まず、配列の先頭の要素から検索をするのがindexOfメソッドです。

以下のように使います。

Arrayオブジェクト.indexOf(値)

配列の先頭から最後に向かって検索して、以下のような戻り値を返します。

  • 値が見つかれば、最初に見つけた要素のインデックス番号
  • 値が見つかれなければ-1

以下、サンプルスクリプトで、コメントに出力される値を記載しています。

function indexNumber() {
  const values = [2,4,6,8,10,2,4,6,8,10];
  console.log(values.indexOf(8)); //3
  console.log(values.indexOf(2)); //0
  console.log(values.indexOf(0)); //-1
}

配列のインデックス番号は0からになります。

  • 先頭から最初に登場する8はインデックス番号3の要素
  • 先頭の2はインデックス番号0の要素
  • 0は配列に含まれていない

ということになりますね。

lastIndexOfメソッドで配列内を最後から検索する

lastIndexOfメソッドも配列内を検索するメソッドなのですが、こちらは配列の末尾から検索をします。

書き方は、indexOfメソッドと全く同様で、書式はこちらです。

Arrayオブジェクト.lastIndexOf(値)

最後尾から検索をして、以下のように戻り値を返します。

  • 値が見つかれば最初に見つけた要素のインデックス番号
  • 値が見つからなければ-1

以下、サンプルスクリプトで、コメントに出力される値を記載しています。

function indexNumber() {
  const values = [2,4,6,8,10,2,4,6,8,10];
  console.log(values.lastIndexOf(8)); //8
  console.log(values.lastIndexOf(10)); //9
  console.log(values.lastIndexOf(0)); //-1
}

配列の要素数は10で、配列のインデックス番号は0から始まるので、末尾のインデックス番号は9になります。

従って、それぞれの返り値に関しては以下のように説明することができます。

  • 末尾から最初に登場する8はインデックス番号8の要素
  • 末尾の10はインデックス番号9の要素
  • 0は配列に含まれていない

二次元配列についてindexOfとlastIndexOfを使う

Google Apps Scriptの場合、シートの値を二次元配列に格納して計算をすることが多いですよね。

例えば、以下のようなシートのデータがあるとします。

配列に格納するスプレッドシートのデータ

getValuesメソッドで、以下のような配列として取得することができますよね。

[
  ['A','B','C','D','E'],
  [2,4,6,4,2],
  [1,3,5,7,9],
  [10,20,30,40,50]
]

では、二次元配列に対してindexOfメソッド、lastIndexOfメソッドで検索をしたい場合はどのようにすればよいでしょうか。

indexOfメソッド、lastIndexOfメソッドは一次元配列にしか機能しません。

つまり、行番号については固定のインデックス番号を指定して、その行内のみを検索対象とするということになります。

以下、サンプルスクリプトです。

function indexNumber2() {
  const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  console.log(values[0].indexOf('C')); //2
  console.log(values[1].indexOf(4)); //1
  console.log(values[0].lastIndexOf('C')); //2
  console.log(values[1].lastIndexOf(4)); //3
}

スプレッドシートの行方向についての検索は、配列とindexOfメソッドまたはlastIndexOfメソッドで簡単に処理することができる、ということになります。

列について検索をしたい場合

なお、列方向に検索をしたい場合はどうすればよいでしょうか。

列範囲を二次元配列で取得しつつ、flatメソッドで一次元化することで、indexOfメソッドまたはlastIndexOfメソッドを使うことができるようになります。

サンプルスクリプトを掲載します。

function indexNumber3() {
  
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange(1, 3, sheet.getLastRow()).getValues().flat();
  
  console.log(values); //[ 'C', 6, 5, 30 ]
  console.log(values.indexOf('C')); //0
  console.log(values.lastIndexOf(5)); //2

}

これについては、以下の記事が参考になりますので、ご参考ください。

GASで二次元配列に特定の要素が含まれているかを判定する方法
Google Apps Scriptでフォーム送信メールからデータを抽出してスプレッドシートに登録するツールを作成しております。今回はGASで二次元配列に特定の要素があるかを判定する方法をお伝えします。

まとめ

以上、Google Apps Scriptで配列の検索をするindexOfメソッド、lastIndexOfメソッドの使い方についてお伝えしました。

一次元配列の検索については、配列を使って高速に、そして簡単な記述によって実現できるようになりました。

以降、また配列を使ったテクニックについてお伝えしていきますね。

どうぞお楽しみに!

連載目次:GASで6分の壁と戦うための配列を扱うテクニック

Google Apps Scriptでは配列操作が非常に重要です。というのも、SpreadsheetサービスのAPIを使えば使うほど、「Google Apps Scriptの6分の壁」にぶつかるからです。このシリーズでは、GASでスプレッドシートのデータを配列に格納して処理をする様々なテクニックをお伝えします。
  1. Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
  2. Google Apps Scriptでスプレッドシートにデータ行を挿入する2つの方法
  3. Google Apps Scriptでスプレッドシートの行を削除する2つの方法
  4. Google Apps Scriptで配列の検索をするindexOfメソッドとlastIndexOfメソッド
タイトルとURLをコピーしました