
photo credit: Craig Stanfill Greeting Jeter via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptでスプレッドシートのデータを配列に格納して操作をする方法を色々とお伝えするシリーズです。
前回は、以下の記事でスプレッドシートの行を削除する方法についてお伝えしました。
これまで紹介したテクニックも便利なのですが、今回からいよいよ配列操作にする醍醐味とも言ってもいい「データの検索」について紹介をしていきたいと思います。
シートの検索…普通にgetValueとか使っちゃうと、とーっても遅いんですよね。
それを配列で超高速にやってしまおう!ということです。
まず、手始めにGoogle Apps Scriptで配列の検索をするindexOfメソッド、lastIndexOfメソッドの使い方についてお伝えします。
では、行ってみましょう!
indexOfメソッドで配列内を検索する
JavaScriptでは配列内を検索する便利なメソッドがあります。
まず、配列の先頭の要素から検索をするのがindexOfメソッドです。
以下のように使います。
配列の先頭から最後に向かって検索して
- 値が見つかれば、最初に見つけた要素のインデックス番号
- 値が見つかれなければ-1
を返します。
以下、サンプルスクリプトで、コメントに出力される値を記載しています。
function indexNumber() { var arrData = [2,4,6,8,10,2,4,6,8,10]; Logger.log(arrData.indexOf(8)); //3 Logger.log(arrData.indexOf(2)); //0 Logger.log(arrData.indexOf(0)); //-1 }
配列のインデックス番号は0からになりますので、
- 先頭から最初に登場する8はインデックス番号3の要素
- 先頭の2はインデックス番号0の要素
- 0は配列に含まれていない
ということになりますね。
lastIndexOfメソッドで配列内を最後から検索する
lastIndexOfメソッドも配列内を検索するメソッドなのですが、こちらは配列の末尾から検索をします。
書き方は、indexOfメソッドと全く同様で
と書きます。
最後尾から検索をして
- 値が見つかれば最初に見つけた要素のインデックス番号
- 値が見つからなければ-1
を返します。
以下、サンプルスクリプトで、コメントに出力される値を記載しています。
function indexNumber() { var arrData = [2,4,6,8,10,2,4,6,8,10]; Logger.log(arrData.lastIndexOf(8)); //8 Logger.log(arrData.lastIndexOf(10)); //9 Logger.log(arrData.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() { var wsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート3"); var arrData = wsData.getDataRange().getValues(); Logger.log(arrData[0].indexOf('C')); //2 Logger.log(arrData[1].indexOf(4)); //1 Logger.log(arrData[0].lastIndexOf('C')); //2 Logger.log(arrData[1].lastIndexOf(4)); //3 }
これで、スプレッドシートの行方向についての検索は、配列とindexOfメソッドまたはlastIndexOfメソッドで簡単に処理することができる、ということになります。
まとめ
以上、Google Apps Scriptで配列の検索をするindexOfメソッド、lastIndexOfメソッドの使い方についてお伝えしました。
これで
- 一次元配列の検索
- 行方向の二次元配列の検索
については、配列を使って高速に、そして簡単な記述によって実現できるようになりました。
さて、しかしながら、スプレッドシートで検索をかけたいのって、「列方向」が多かったりするんですよね…
例えば、「IDのフィールドになっているA列から特定のIDの行を検索してその行番号を返す」などというものです。
次回以降、このあたりをどう解決していくのかお伝えしたいと思います。
どうぞお楽しみに!