Google Apps Script

【GAS】スプレッドシートの二次元配列データを検索する方法(5選)

GAS二次元配列の検索

スプレッドシートの二次元データを検索したい!

GAS二次元配列検索って、どうやるの…??

ノンプロ研のGAS担当・えとう研究員(@etau0422)に指導いただき、5通りのコードを書いてみました。

✔ この記事で紹介するコード

スプレッドシートA1~C3の9セルに「数字の3が存在するか」検索する。存在する場合、「存在する」とログ出力する

gas-searcharr1

indexOfメソッドは一次元配列しか検索できない?

もり
もり
indexOfで配列を検索できるよね?

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

戻り値

・検索値が存在する場合 … 最初に見つかった要素のインデックス
・検索値が存在しない場合 … -1

→戻り値が「-1でなければ」存在すると判定できる

モリ
モリ
indexOfメソッドは一次元配列しか検索できないぞ

スプレッドシートの行方向検索・列方向検索はできますが、3×3のような二次元の範囲には使えないのです・・・

 

もり
もり
そうなんだ・・・残念
モリ
モリ
おい、落ち込んでるヒマがあったら、二次元配列の検索方法をできるだけたくさん考えろ!

二次元配列を検索する方法【5選】

前提:グローバル関数の定義

sheet,dataの2つの変数を定義しておきます。※スプレッドシートのシート名は「検索」

【方法1】二重ループで検索

 

もり
もり
まずはこれでどう?
モリ
モリ
ダメだ、ダサいぞ

 

for文で検索する作戦ですね。

for (変数 in オブジェクト)

オブジェクト(一次元配列)の各要素を検索する

変数i, jで二重ループにすると、3×3のマスをもれなく検索できます。

①~⑨は検索の順番を表しています(Zの順序ですね)

gas-searcharr2

 

もし10×10で100セルあったら、if文を100回判定することになるので、非効率的ですね。次の方法を考えましょう。

 

モリ
モリ
二重ループでの検索はダサいけど、for…in文は他でも使えるから覚えておくといいぞ!

【方法2】forEachメソッドで一次元配列をループ検索

 

もり
もり
forEachメソッドを使うのはどうかな?

Arrayオブジェクト.forEach(コールバック関数)

forEachメソッド・・・配列内の各要素について、処理を実行する

(コールバック関数については、長くなるので別記事で紹介します)

indexOfメソッドは、検索値が見つからない場合の戻り値が「-1」です。つまり、戻り値が「-1でなければ」存在すると判定します。

「~でなければ」の判定に、比較演算子 !== を使用しています。

forEachメソッド内でのLogger.log(value)の出力結果です。行方向の一次元配列を取得します。
[, 2.0, 3.0]
[4.0, , 6.0]
[7.0, 8.0, ]

それぞれの一次元配列valueに対して、indexOfメソッドで検索します。

gas-searcharr3
モリ
モリ
うーん、悪くはないけど、やぼったいな

【方法3】for文で一次元配列をループ検索

 

もり
もり
for文のほうがスッキリするね

for文を使用して、一次元配列data[i]を検索する作戦ですね。

gas-searcharr4
モリ
モリ
ふーん、まぁまぁかな

【方法4】二次元配列を文字列に変換して検索

 

もり
もり
ねぇ、これ知ってる?
モリ
モリ
なんだ!この書き方は!!

 

二次元配列に空文字を結合すると、「ただの文字列」になるのです。

 

二次元配列を文字列に変換して、matchメソッドで検索する作戦です。

Stringオブジェクト.matchメソッド(正規表現)

matchメソッドは、正規表現にマッチした文字列を取得します。ここでは、数字の3を検索するだけなので、match(3)としています。

【方法5】applyメソッドで二次元配列を一次元配列に変換して検索

 

もり
もり
これで最後だ!

二次元配列を一次元配列に変換してindexOfメソッドで検索する作戦です。

関数名.apply(this, 配列)

applyメソッド…他のオブジェクトの関数を呼び出す(※引数は配列で渡す

applyメソッドを使用する関数がコチラ

String.prototype.concat()

文字列に別の文字列を連結して、新しい文字列を返す

この2つを組み合わせると、空の配列[]に、3つの一次元配列が連結されます。

一次元配列①[, 2.0, 3.0]
一次元配列②[4.0, , 6.0]
一次元配列③[7.0, 8.0, ]

→①~③の一次元配列を、空配列[]と連結します。
[, 2.0, 3.0, 4.0, , 6.0, 7.0, 8.0, ]

 

モリ
モリ
おぉ…なんだこの書き方は…カッコいいな

 

きぬあさ(@kinuasa)さんの記事がコチラです

[Google Apps Script]スプレッドシートのセル範囲に指定した値が含まれているかを判定する

検索でヒットしたセルに対して何らかの処理をしたい時に使えます!

以上、5通りを紹介しました!

 

もり
もり
もっとカッコいい方法があったら教えてもらえるとうれしいな!泣いて喜ぶよ!
非エンジニアもプログラミングを学習する時代!

「プログラミング」ってエンジニアとかプログラマーの人がするものでしょ?文系の私には関係ないや~って思っていませんか?

いまは、非エンジニアもプログラミングを学習する時代です!

「プログラミングの必修化」をご存知ですか?

  • 2020年~ 小学校で開始
  • 2021年~ 中学校で開始
  • 2022年~ 高等学校で開始
  • 2024年~ 高校受験科目に新設

学校での必修化に向けて、すでに子ども向けプログラミングスクールが多数開校されています。

あと数年もすれば、あたりまえにプログラミングができる新入社員がやってくる時代になります。

プログラミングってなに?どんなもの?まずは無料体験から試してみませんか?

 

1週間の無料体験あり!
オンラインスクール実績No.1!