スプレッドシートの複数シート・別ファイルを、毎回コピーせず1つにまとめる方法(VSTACK・IMPORTRANGE・QUERY・GAS)

スプレッドシートの複数シート・別ファイルを、毎回コピーせず1つにまとめる方法(VSTACK・IMPORTRANGE・QUERY・GAS)

記事
ビジネス・マーケティング
担当者ごと、店舗ごとにシートを分けて入力してもらっている。
そして月末や週末に、それを1つの表にコピーして集計している。

そんな作業をしていませんか?

・シートを1つずつ開いて、範囲を選んでコピーして、まとめ用の表に貼る
・貼る場所を1行まちがえて、数字がずれる
・担当者が増えるたびに、手順が1つ増える

この記事では、複数のシートを1つにまとめる方法を、手軽なものから順に3つご紹介します。
関数だけで足りるケースも多いので、まずはそこからお読みください。

方法1:同じファイルの中のシートなら「VSTACK」


「田中」「高橋」「伊藤」のように、1つのファイルの中にシートが分かれている場合は、まとめ用のシートを1枚作り、1行目に見出しを書いて、A2 のセルに次の数式を1つ入れるだけで、複数シートが縦につながります。

=VSTACK('田中'!A2:D, '高橋'!A2:D, '伊藤'!A2:D)

(シート名を「'」で囲んでおくと、名前に空白が入っていてもエラーになりません)

ただ、このままだと、各シートの空いている行もいっしょに並んでしまいます。
空の行を除くには、FILTER を組み合わせます。

=FILTER(VSTACK('田中'!A2:D, '高橋'!A2:D, '伊藤'!A2:D), VSTACK('田中'!A2:A, '高橋'!A2:A, '伊藤'!A2:A)<>"")

これは「A列(ここでは日付)が空でない行だけを残す」という意味です。A列を書き忘れた行は、ほかの列に入力があっても除かれるので、どの行にも入力がある列を条件にしてください。
なお、3枚とも空のときは「#N/A」と表示されますが、データを入れれば消えます。
また、数式の下と右が空いていないと、エラー(#REF!)になります。まとめ用のシートには、ほかのものを書かないでおくと安心です。

どちらも、元のシートを書き換えると、まとめ側も自動で変わります。

方法2:別のファイルに分かれているなら「IMPORTRANGE」


店舗ごとに別のファイルになっている場合は、IMPORTRANGE で別ファイルの範囲を読み込めます。

=IMPORTRANGE("読み込みたいファイルのURL", "売上!A2:D")

初めて使うときは、セルに「#REF!」と出て、その上に「アクセスを許可」が表示されるので、押して許可します。
読み込めるのは、自分のGoogleアカウントで開けるファイルだけです。また、一度許可すると、まとめ側のファイルを編集できる人は、元のファイルの内容も読めるようになります。まとめ側を誰と共有しているかは、確かめておきましょう。

IMPORTRANGE で複数のファイルをまとめるなら、先にファイルごとに上の数式を1回ずつ入れて許可を済ませてから、QUERY と VSTACK を組み合わせます。

=QUERY(VSTACK(IMPORTRANGE("1つ目のファイルのURL", "売上!A2:D"), IMPORTRANGE("2つ目のファイルのURL", "売上!A2:D")), "select * where Col1 is not null order by Col1", 0)

「Col1 is not null」は「1列目が空の行を除く」、「order by Col1」は「1列目(日付)の順に並べる」という意味です。VSTACK でつないだ表では、列を A・B ではなく Col1・Col2 と書くのがポイントです。1列目が日付ではなく文字(担当者名など)の場合は、「Col1 is not null」の代わりに「Col1 <> ''」と書きます。
なお、QUERY は1つの列に数字と文字が混ざっていると、少ないほうの値が空になることがあります。金額の列に「未定」などの文字を入れないようにすると安心です。

関数でまとめるときの注意


関数だけで済むなら、それが一番手軽です。
ただ、次のような場合は、関数だと手間が増えたり、うまくいかなかったりします。

・担当者やファイルが増えるたびに、数式を書き足す必要がある
・シートごとに列の並びが少しずつ違う(「日付」と「金額」の順番が逆など)
・どのシートから来た行なのか、区別できるようにしたい
・「毎朝8時の時点の内容」のように、決まった時刻の状態を残したい(関数は、元が変わるとすぐに変わります)
・読み込むファイルや行が多くて、表示が重くなってきた

方法3:GASで「毎朝、自動でまとめる」


こうした場合は、GAS(Google Apps Script)という、Googleのサービスに付いている自動化のしくみを使う方法があります。

見本として、「1つのファイルの中にある担当者別の3枚のシートを、まとめ用のシートに集める」ものを作りました。

画像1_まとめる前と後.png

画像2_まとめたシート.png


・シートが増えても、まとめの対象に自動で入る(まとめたくないシートは、設定で除外する)
・先頭の列に「どのシートから来たか」を入れる
・メニューから「今すぐまとめる」で実行できる。毎朝の自動実行も、メニューから1回設定すれば、毎朝8時台に動く

関数と違って、実行した時点の内容を書き出すので、表示が重くなりにくく、まとめ側は次に実行するまで「その朝の時点の内容」のままです。
反対に、元のシートを直しても、次に実行するまではまとめ側に反映されません。また、実行のたびにまとめ用のシートを書き直すので、まとめ側に手で書いたメモは消えます。
このあたりは、どちらが合うかを使い方に合わせて選びます。

この見本は、列の並びがそろったシートを、同じファイルの中でまとめるものです。
列の並びがシートごとに違う場合は「見出しの名前で列を合わせる」処理を、別ファイルをまとめる場合は「ファイルを順に読み込む」処理を、今の表に合わせて追加して作ります。

自分でやるのが大変なときは


・今の数式を、担当者が増えても書き足さなくて済む形に直したい
・列の並びがばらばらのシートを、まとめられるようにしたい
・毎朝自動でまとめるしくみを入れたい

こうしたご相談は、ココナラの出品「スプレッドシートの集計・転記をGASで自動化します」で受け付けています(できることの例④「複数シートの自動まとめ」です)。

・作ったコードは、すべてお渡しします(コメントつきなので、あとから変更しやすい形です)
・使い方の説明書をお付けします
・ご購入の前に、メッセージで「できるかどうか」と総額をお伝えします

まずはメッセージで、今の表の形と、やりたいことを教えてください。
(実際のデータではなく、今の表のスクリーンショットか、列の名前の一覧をトークルームで送っていただければ大丈夫です。お名前などは隠してください)



サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す