🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

6623閲覧

[GAS]二次元配列の範囲から条件にあった配列を探索したい

mtringo

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/01/14 09:42

編集2021/01/14 10:17

Googleスプレッドシートから範囲(二次元配列)を抜き出したものに
定義している条件に完全一致する配列位置を知りたいです。

GAS

1var dat=[ 2 [ 111, 'groupA' ], 3 [ 111, 'groupC'], 4 [ 333, 'groupA'], 5 [ 222, 'groupB'], 6 [ 111, 'groupB'], 7 [ 222, 'groupC'], //検索したい 8 [ 333, 'groupB'], 9]; 10 11var find=[222,'groupC'];//条件 12

・値、グループの順序は不定です
・「同一値かつ同一グループ」は2回以上は出ない前提です

index(上記の場合は戻り値 5 としたい)を探索したい場合、
どう検索すればよろしいかご教示いただけますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

実装はできるのですが gas の場合、位置を知ってうれしいことはあまりないので、これを知って何をやりたいかを伺いたいです。

javascript

1const dat=[ 2 [ 111, 'groupA' ], 3 [ 111, 'groupC'], 4 [ 333, 'groupA'], 5 [ 222, 'groupB'], 6 [ 111, 'groupB'], 7 [ 222, 'groupC'], //検索したい 8 [ 333, 'groupB'], 9]; 10const key = [222, 'groupB']; 11dat.findIndex(e=>key.every((f,i)=>f===e[i]));

投稿2021/01/15 07:59

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2021/01/15 08:00

sawa様のコードがなぜか見えてませんでした。ほぼほぼ同じコードになってしまいました。失礼。
sawa

2021/01/15 08:12

こういう時にeveryが使えるのですね。勉強になります。
papinianus

2021/01/15 08:23

sawa 様には蛇足ですが。 あくまで gas である前提で、もとのデータはシート上で表を表現しているはずなので、位置が同じ==意味が同じと推測してこうしました。(ついでに位置がしりたいというのを、getRange につかう RowNumber がほしいのではないかと邪推して、そのうえで index をしってメリットはないと考えています) また、状況的に探すキー側を基準に every でマッチしたほうが、getDataRange みたいなのでまるっととった表に対して有効であるとも仮定しています。 なので、一般にjsで2次元配列を要素比較するときに every をつかうかは要検討です。
sawa

2021/01/15 08:35

>一般にjsで2次元配列を要素比較するときに every をつかうかは要検討です。 アドバイスありがとうございます。一般的なjsを書く機会はあまりないですが、その際には注意します。
mtringo

2021/01/26 13:11

回答ありがとうございます。 >>位置がしりたいというのを、getRange につかう RowNumber がほしいのではないか 仰るとおりで、このスプリクトはウェブアプリケーションとして、 外部から受け取ったkeyに対して、 シート上のデータベースを範囲として、一致したkeyの隣りにある列を(getRange.setValue0したりして)更新するというスクリプトで、位置が知りたいというものでした。 結果として、無事に実装して解決したので良かったです。
guest

0

自分ならというかベタな手法だと 配列を文字列化して indexOf ですが、もっとスマートな方法があるかもしれません。

javascript

1function arraymatch(){ 2 var dat=[ 3 [ 111, 'groupA' ], 4 [ 111, 'groupC'], 5 [ 333, 'groupA'], 6 [ 222, 'groupB'], 7 [ 111, 'groupB'], 8 [ 222, 'groupC'], //検索したい 9 [ 333, 'groupB'], 10]; 11 12var find=[222,'groupC'];//条件 13 14var index = dat.map(v => JSON.stringify(v)).indexOf(JSON.stringify(find)); 15console.log(index); // 5 16 17}

draqさんのアドバイスをいただいて findIndex を使ったコードを追記。
アロー関数の部分が自分の書き方だとイマイチな気がしますが。。

javascript

1function arraymatch2(){ 2 var dat=[ 3 [ 111, 'groupA' ], 4 [ 111, 'groupC'], 5 [ 333, 'groupA'], 6 [ 222, 'groupB'], 7 [ 111, 'groupB'], 8 [ 222, 'groupC'], //検索したい 9 [ 333, 'groupB'], 10]; 11 12var find=[222,'groupC'];//条件 13 14var index = dat.findIndex(v => v[0]===find[0] && v[1]===find[1]); 15console.log(index); // 5 16 17}

投稿2021/01/14 12:40

編集2021/01/15 00:37
sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

draq

2021/01/14 23:56

Array.findIndex 使った方がスマートな気がします。
sawa

2021/01/15 00:26 編集

draqさん コメントありがとうございます。なるほどです。 findIndexの方が汎用性も高いですしスマートですね。勉強になります。 よろしければ findIndexを使うケース(文字列化しなくてよい?)のコードを回答入れていただけますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問