Quantcast
Channel: いつも隣にITのお仕事
Viewing all articles
Browse latest Browse all 2076

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

$
0
0
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

を返します。

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

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メソッドと全く同様で

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

と書きます。

最後尾から検索をして

  • 値が見つかれば最初に見つけた要素のインデックス番号
  • 値が見つからなければ-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の行を検索してその行番号を返す」などというものです。

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

どうぞお楽しみに!

連載目次: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メソッド

Viewing all articles
Browse latest Browse all 2076

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>