質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Q&A

解決済

1回答

1456閲覧

スプレッドシートで複数のデータを抽出したい(GAS、関数)

beginner100

総合スコア15

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

0グッド

0クリップ

投稿2021/05/19 00:50

編集2021/05/19 03:17

前提・実現したいこと

スプレッドシートでデータを抽出したいです。

下記の画像のような状況で
A列を検索して別シートの右側の英単語を検索したいです。

111で抽出できるシートはいくつかあるのでそれらすべてを検索したいのですが、vlookupだと1つしか検索できず、query関数だと、検索した時に下に列が行くため、111が検索できても2行目の「222」が検索できなくなってしまいます。

GASや関数でうまく抽出できる方法はないでしょうか?

詳しい方ご教授いただけると助かります。
イメージ説明

◎補足
実際の作業ではシートが20枚程度あり、1枚に対して200行程度あるので可能な限り、重くないようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

書いてみました!

[検索]と[結果]の名前のシートの作成お願いします。
検索シートの配列はこれ↓
イメージ説明

これで検索値を入れて実行していただければ、
結果シートに出力されると思います。

200シートとなるとちょっと時間がかかるかも知れません。

gas

1 2function myfunc() { 3 4 var ss = SpreadsheetApp.openById('***'); //[todo]スプレッドシートのID 5 var sheetList =ss.getSheets() // 全シートの取得 6 7 //検索用のシート 8 var searchSheet = ss.getSheetByName('検索'); 9 var search = searchSheet.getDataRange().getValues() 10 //検索値の並び替え 11 var searchTrans = [] 12 search.forEach(e=>{ 13 if(e[0]!="検索したい数字"){ 14 searchTrans.push(e[0]) 15 } 16 }) 17 18  19 //結果入れる用の連想配列 20 var results = {} 21   22 //シートを一つ一つ確認 23 for(var sheet of sheetList){ 24 25 //検索シートと結果シートを除外 26 if(sheet.getSheetName()!="検索"&&sheet.getSheetName()!="結果"){ 27 28 //全データを取得 29 var values = sheet.getDataRange().getValues() 30 values.forEach(e=>{ 31      32     //検索したい単語があるかチェック 33 var index = searchTrans.indexOf(e[0]) 34 if(index != -1 ){ 35 if(!results[e[0]]){ 36 results[e[0]] = [] 37 } 38 results[e[0]].push([e[1],sheet.getSheetName()]) 39 } 40 41 }) 42 } 43 } 44 45 //検索結果を貼り付けられる形式に変換 46 var setValues = [["検索単語","単語","シート名"]] 47 for(var word in results){ 48 setValues.push([word,"",""]) 49 results[word].forEach(e =>{ 50 setValues.push(["",e[0],e[1]]) 51 }) 52 } 53   54  //結果シートへ貼り付け 55 var setSheet = ss.getSheetByName('結果'); 56 setSheet.clear() 57 setSheet.getRange(1,1,setValues.length,setValues[0].length).setValues(setValues) 58 59} 60 61

ちょっと僕の理解がずれているかもしれませんが、

検索する数字の入った[検索シート]と
検索する数字と英単語が記載された[シートA]と[シートB]があり、
検索する数字が一致した場合は、[シートA]と[シートB]の英単語とシート名を表示したい。
と、いうことであってますかね?

関数で行うのであればindexとmatchがよろしいかと。

B2セルにはこれが入ってます。
=index(A17:B22,MATCH(A2,A17:A22,0),2)
MATCH(A2,A17:A22,0)・・・A17:A22の中に、A2の値は何番目に入っているか? 
=>結果 1 と返ってきます。

index(A17:B22,MATCH(A2,A17:A22,0),2)... A17:B22の範囲内の何行目・何列目の値を返すか?
matchの結果の1行目、一番後ろにある 2(2列目)の値を返すことになるので、
=>結果 aaa と返ってきます。

あとは、範囲を適宜変更してあげてください。
エラーが気になるのであれば、エラーを回避する関数等で除外してください。

もちろんGASを使った方が柔軟に対応できますが、
習得までそこそこ時間はかかりますので、どうしてもGASということでなければ
関数をおすすめします。

イメージ説明

投稿2021/05/19 02:55

編集2021/05/19 04:33
Tatsunosuke

総合スコア599

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

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

beginner100

2021/05/19 03:25

ありがとうございます。 ただ、実際の作業ではシートが20枚程度あり、1枚に対して200行程度あります。 index+match関数も考えていたのですが、index+match関数では、 検索した時、右側にシートA~Tまで伸びてしまうので、パット見わからない状況になってしまうので、説明を失念していました。 GASで3行追加して、query関数で検索し、transpose関数で行と列を並び替えれば、できるとGAS作成まではしたのですが、それだと、A2のみの検索になってしまうので、どうにか検索をA列すべて検索する方法がないかと思って、質問させていただきました。 言葉足らずな部分が多く申し訳ありません。
Tatsunosuke

2021/05/19 03:27

失礼しました! そうしたら、確かにGASの方がいいかも知れませんね。 ちょっと書いてみますね。少々お待ちください。
beginner100

2021/05/19 08:01

本当にありがとうございます! これから自分で直したりできるようにこのコードを1行ずつ理解していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問