Google Apps Script

【GAS】スプレッドシートのセル範囲(二次元配列)を検索する

スプレッドシートのセル範囲を検索したい!

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

紹介していきます!

スプレッドシート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通りを紹介しました!

 

もり
もり
もっとカッコいい方法があったら教えてもらえるとうれしいな!泣いて喜ぶよ!
ノンプログラマーがプログラミングを学ぶ理由

ノンプログラマーがプログラミングを使えるようになると、「仕事の幅」が広がります。

日常生活にたとえると「車の運転」のイメージです。

多くの人は、大人になると自動車教習所に通って、運転の練習をしますね。F1レーサーやタクシードライバーなどの「プロ」になるわけではないのに。

車の運転ができれば、遠いところへ、速く・ラクに移動できて「生活の幅」が広がるからです。

プログラミングができるようになれば、今の仕事を速く・ラクに片づけて、「仕事の幅」を広げることができます。

「プロ」を目指す必要はありません。今の仕事をより豊かにするための「手段」、それがプログラミングです。

1週間のオンライン無料体験
いつでもどこでも今すぐ視聴OK