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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

503閲覧

Googleスプレッドシートで範囲や条件を複数シート設定する方法

hiyo7

総合スコア10

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

2クリップ

投稿2018/10/05 02:17

編集2018/10/05 05:25

前提・実現したいこと

Googleスプレッドシートの1つのファイルに対し、複数シートを持っています。
1つのシートに、情報をまとめたいです。
filter機能のようなものが使いたかったんですが、範囲を複数シート指定することが出来ないのかなと思いましたので、
他に方法がないか教えてほしいです。

ファイルの中身ですが、例えば下記のようになっている場合どうしたら良いでしょうか。

Aシートは学生のIDリストとして使用していて、A列のみにID00001、ID00002のように順にテキストを手入力しています。

B、C、DシートはそれぞれB、C、Dクラスに属する情報のみ入力しています。
また、A列にはAシートのA列と同様に、Bクラスに該当する学生のIDのみ記載していて、B列以降は住所や成績等のDBが入力されています。

AシートのB列以降に、B、C、DシートのB列以降の情報を持ってきたいです。
且つ、AシートのA列と一致するIDがある情報を持ってきたいです。

もし可能であれば、B、C、Dシートをそれぞれ
B、C、Dファイルにしたくて、以下を試してみました。
①Aファイルに={QUERY('ファイルAリンク'!A4:AI,"where A!=''");QUERY('ファイルBリンク'!A4:AI,"where A!=''");QUERY('ファイルCリンク'!A4:AI,"where A!=''");,"where A!=''")}
→これだとA列はID順ではなく、ファイルB→C→Dの順になってしまいます。
ID順にすることは可能でしょうか。

発生している問題・エラーメッセージ

該当のソースコード

試したこと

=FILTER('シートA'!B4:AI,'シートA'!A4:A=A4 )
と入力すると、シートAに該当した場合は持ってこれますが、B、Cクラスの生徒の情報は持ってこれません。
複数シートの範囲、条件を指定できる方法はありますでしょうか。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

すでに解決済みになってしまいましたが、せっかく書いたので投稿します。
セルの関数ではできそうになかったので、Apps Script で書いてみました。

https://docs.google.com/spreadsheets/d/1OTy97IZzWkWBkBP65cMPKX0FZj71_1ktniA0js14n1w/edit#gid=0

スプレッドシートをコピーしてから実行してみてください。
[ツール]>[マクロ]>[mergeData]で実行できます。
初回のみ認証を聞いてきます。
[merged]という名前のシートに結果を書き込みます。
この名前を持つ既存のシートは削除されますので注意してください。

このスクリプトをご自分のスプレッドシートに組み込みたい場合、ご自分のシートで[ツール]>[スクリプトエディタ]を開き、デフォルトで入っているコードを全部消して、スクリプト全体を貼り付けて Ctrl+S で保存します。

新しいプロジェクト名を聞いてくるのでそのままで[OK]。
その後実行ボタン(右三角)を押して実行します。

データのシート側から実行する場合、[ツール]>[マクロ]>[import]で[関数を追加]します。
その後は[ツール]>[マクロ]配下に[mergeData]という関数名が見えるようになります。

Google

1/** 2 * 最初のシート:ID一覧(id_list) 3 * その他のシート:クラス詳細データ 4 */ 5function mergeData() { 6 var ss = SpreadsheetApp.getActiveSpreadsheet(); 7 var merged =ss.getSheetByName("Merged"); // 結果出力用シート 8 if (merged) { 9 ss.deleteSheet(merged); 10 } 11 var sheets = ss.getSheets(); 12 var id_list = sheets[0]; // ID一覧があるシート 13 // ID一覧取得 14 var numIds = id_list.getLastRow() - 1; // タイトル行は除く 15 var ids = id_list.getSheetValues(2, 1, numIds, 1); // 全ID数 16 Logger.log("numIds = " + numIds); 17 Logger.log("ids = " + ids); 18 var addrs = []; 19 var scores = []; 20 for (var i = 0; i < numIds; i++) { 21 addrs[i] = ""; 22 scores[i] = ""; 23 } 24 // 各シートのスキャン 25 var numClasses = sheets.length - 1;   // クラス数 26 Logger.log("numClasses = " + numClasses); 27 for (var i = 0; i < numClasses; i++) { 28 var curr = sheets[i + 1]; 29 var numStudents = curr.getLastRow() - 1; // このクラスの生徒数 30 Logger.log("numStudents = " + numStudents); 31 // ID, 住所, 成績を2次元配列で取得 32 var data = curr.getSheetValues(2, 1, numStudents, 3); 33 Logger.log("data =" + data); 34 for (var j = 0; j < numStudents; j++) { 35 for (var k = 0; k < numIds; k++) { 36 if (ids[k] == data[j][0]) { 37 addrs[k] = data[j][1]; 38 scores[k] = data[j][2]; 39 break; 40 } 41 } 42 } 43 } 44 Logger.log("addrs = " + addrs); 45 46 // 結果の書き出し 47// var ui = SpreadsheetApp.getUi(); 48// ui.alert("Writing results"); 49 var sheet = ss.insertSheet('Merged'); 50 sheet.getRange("A1:C1").setValues([["ID", "Addr", "Score"]]); 51 sheet.getRange(2, 1, numIds, 1).setValues(ids); 52 for (var i = 0; i < numIds; i++) { 53 sheet.getRange(2 + i, 2, 1, 1).setValue(addrs[i]); 54 sheet.getRange(2 + i, 3, 1, 1).setValue(scores[i]); 55 } 56 57} // mergeData() 58

投稿2018/10/07 02:05

hotta

総合スコア1613

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

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

0

自己解決

ID00001を読み込んでいるというやり方はやめました。

投稿2018/10/05 07:12

hiyo7

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問