前提・実現したいこと
スプレッドシートでデータを抽出したいです。
下記の画像のような状況で
A列を検索して別シートの右側の英単語を検索したいです。
111で抽出できるシートはいくつかあるのでそれらすべてを検索したいのですが、vlookupだと1つしか検索できず、query関数だと、検索した時に下に列が行くため、111が検索できても2行目の「222」が検索できなくなってしまいます。
GASや関数でうまく抽出できる方法はないでしょうか?
◎補足
実際の作業ではシートが20枚程度あり、1枚に対して200行程度あるので可能な限り、重くないようにしたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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総合スコア599
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/19 03:25
2021/05/19 03:27
2021/05/19 08:01