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

★気に入ったらシェアをお願いします!


index

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

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

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

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

Google Apps Scriptでスプレッドシートの行を削除する2つの方法
Google Apps Scriptでスプレッドシートのデータを配列に格納して操作をする方法をお伝えしています。今回はGoogle Apps Scriptでスプレッドシートの行を削除する方法についてです。

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

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

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

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

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

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

JavaScriptでは配列内を検索する便利なメソッドがあります。

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

以下のように使います。

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

配列の先頭から最後に向かって検索して

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

を返します。

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

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

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

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

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

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

書き方は、indexOfメソッドと全く同様で

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

と書きます。

最後尾から検索をして

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

を返します。

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

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

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

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

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

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

例えば、以下のようなシートのデータであれば

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

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

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

indexOfメソッド、lastIndexOfメソッドは一次元配列にしか機能しませんので、一方向のみの検索となります。

つまり、行番号については固定のインデックス番号を指定して、行方向にのみ検索をするということができるというわけです。

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

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

後日追記:列方向に検索をしたい場合はzip.applyメソッドで行列転置

実際には、列方向に検索したいというケースが多いと思います。

その場合は、Underscore for GASライブラリのzip.applyメソッドによる行列転置を行うことで、indexOfメソッドが列方向に使えるようになります。

こちらの記事もどうぞご覧ください。

Google Apps Scriptで二次元配列の行と列を入れ替える方法とその革命的な効果
Google Apps Scriptでスプレッドシートのデータは二次元配列として操作できますが、列方向に検索したいときなどはUnderscoreのzipメソッドで行と列を入れ替えると革命的に便利です。

まとめ

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

これで

  • 一次元配列の検索
  • 行方向の二次元配列の検索

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

さて、しかしながら、スプレッドシートで検索をかけたいのって、「列方向」が多かったりするんですよね…

例えば、「IDのフィールドになっているA列から特定のIDの行を検索してその行番号を返す」などというものです。

このあたりをどう解決していくのか…ゆくゆく、お伝えしたいと思います。

さて、その前準備として、次回は超定番ライブラリUnderscore for GASの導入です。

Google Apps Scriptで100以上の便利関数が使える定番ライブラリUnderscore for GAS
Underscore for Google Apps Scriptは100を超える様々な便利関数が多数パッケージ化されている定番ライブラリです。今回はその特徴、導入方法、使い方などをお伝えします。

どうぞお楽しみに!

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

Google Apps Scriptでは配列操作が非常に重要です。というのも、SpreadsheetサービスのAPIを使えば使うほど、「Google Apps Scriptの5分の壁」にぶつかるからです。このシリーズでは、GASでスプレッドシートのデータを配列に格納して処理をする様々なテクニックをお伝えします。
  1. Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
  2. Google Apps Scriptでスプレッドシートにデータ行を挿入する2つの方法
  3. Google Apps Scriptでスプレッドシートの行を削除する2つの方法
  4. Google Apps Scriptで配列の検索をするindexOfメソッドとlastIndexOfメソッド
  5. Google Apps Scriptで100以上の便利関数が使える定番ライブラリUnderscore for GAS
  6. Google Apps Scriptで二次元配列の行と列を入れ替える方法とその革命的な効果