見出し画像

Googleスプレッドシート 行グループ・列グループで表をスッキリ!(GAS/ショートカット)

今回はGoogleスプレッドシートの機能「行グループ・列グループ」について書きます。(予定変更しました)

あんまよい表じゃないけど、こういう表の作成依頼は多い

Googleスプレッドシートで ↑ こんな表を作る時に便利なのが、行や列のグループ化機能です。

行グループ、列グループの 基本、活用シーン、利用する際の注意点、ショートカット・GAS(GoogleAppsScript)を使った一括開閉テクニックなどをまとめています。

先週は、Excelの「リンクされた図」をGoogleスプレッドシートでもやりたい!を実現する スコアカード と 表グラフ というテーマで noteを書きました。




Googleスプレッドシート 行・列のグループ化の基本

まずは行・列のグループ化の基本を理解した上で、どういった場面で使える機能なのか?を見ていきましょう。



行・列のグループ化機能とは?

Googleスプレッドシートの グループ化機能

行・列のグループ化機能は、行や列をグループとしてまとめることで、ボタンクリックで表示・非表示 を簡単に切り替えできるようにする機能です。

複数行をグループにしたものが行グループ
複数列をグループにしたものが列グループ

となり、表の外側にグループの開閉コントロールボタンが表示されます。

ボタンが  (プラス)になっている時はグループは 閉じてる(非表示)状態です。この⊞ボタンをクリックすると開く(表示)となりボタンが  (マイナス)に変わります。

となっている時は グループは開いている状態で、ボタンをクリックすると、表示状態の行(列)は閉じて非表示となります。


Excelのグループ化機能

グループ化機能は、もともとExcelにもある便利機能です。ほぼそのままGoogleスプレッドシートに移植されました。

グループ化は互換性も高く

Googleスプレッドシート ⇔ Excel

でファイルを変換しても基本的にそのまま使えます。

個人的にはExcelの行・列のグループ化は「あれ、どっから操作するんだっけ?」ってなることがあるんで、 右クリックから直観的に操作ができるGoogleスプレッドシートの行・列のグループ機能の方が好きかも。

後で登場しますが、グループ操作のショートカットも、 Googleスプレッドシートの方がわかりやすいです。

ちなみにGoogleスプレッドシートには、行や列の「非表示」という機能もありますが、

こちらは再表示はワンクリックで出来るものの、一度非表示を解除してしまうと、再び同じ範囲を非表示にする為には再度範囲を選択して 非表示を設定しなおす必要があり面倒です。

ユーザーが表示、非表示を切り替える運用を想定している場合は、「非表示」ではなく「グループ化」の機能を使うことをお勧めします。



行・列のグループ化 はどんな時に活用できるか?

このグループ化機能は、どんな時に便利なのか?

代表的な活用シーンを3つ紹介しましょう。

1つは、デティール(詳細)とサマリ(合計)のある大きいマトリクス表を見やすくする時に利用するケースです。

このように

縦(行)方向
 人毎に売上、利益、利益率が集計されており、それらを合計した 部署(夜桜家)の合計行がある。
 さらに ①受注数字 ②見込数字 ③ 受注+見込 で集計されている

横(列)方向
 列は月になっていて半期で集計。最後に年合計

というや厄介な表があった場合、データ量が多いと1画面に収まりませんし、全体像がわかりにくいといった問題があります。

行・列のサマリ以外をグループ化

これを行・列をグループ化して 閉じる(非表示とする)ことで、合計部分のみを表示させ、1画面で全体をわかりやすく見せることが出来ます。中身の内訳が見たい時は、対象のグループを開けばよいので便利ですね。(本当はサマリ表は別で集計したいんですがw)


2つ目は、1つのシート内で過去データをアーカイブ化する使い方です。

月ごとにグループ化しておく

こんな感じの日付データが下に展開されたシートがあり、メインで利用するのが今月のデータだった場合、過去の月のデータがそのまま残っていると、使いたい今月の行までスクロールするのが 面倒だったりします。

これを過去の月のデータを月単位でグループ化 して普段は 閉じる(非表示)としておくことで、今月のデータが操作しやすくなります。過去データは、必要になった時だけグループを開いて見返す運用で良いですね。


3つ目は 説明や裏の計算操作領域といった 印刷やPDFに含めたくない範囲を グループ化しておくケースです。

こんな感じで計算部分の右側の列をグループ化すれば、作業時はグループを開いてシートを遷移せず作業が出来ますし、印刷やPDF化の際は グループを閉じるだけで、見せたくない部分を非表示にした 提出用のドキュメントを生成できます。

いわゆる Excelの改ページプレビュー的な使い方ですね。

この活用については、少し前のnoteでも触れています。



【オマケ】SUBTOTAL関数と組み合わせた活用

グループ化機能の変わった活用方法として、SUBTOTAL関数と組み合わせて、開いている部分だけの計算結果を表示するという使い方があります。

フィルタによる非表示ではないので、第1引数の関数コードは 100番台にする必要があります。

つまり SUM ・・・ 9ではなく 109で指定する必要があるということです。

=SUBTOTAL(109,B2:B16)

9だと非表示行も計算してしまう

グループとSUBTOTALを組み合わせることで、クリックして開いた部分(見えている部分)だけを合計する特殊な可変数式が作れます。

ただしSUBTOTALの仕様上、非表示を計算対象から除外できるのは行の非表示(グループ化)のみです。列のグループ化、非表示には効果はありません。



Googleスプレッドシート 行・列のグループ化の方法と注意点

次に 行や列をグループ化する方法(やり方)、そして注意点を見ていきましょう。


グループ化とグループ削除の基本手順

まずグループ化したい範囲を選択します。

グループを作る時の注意点
 ・セルではなく 行(または列)を選択する
 ・開閉ボタンを紐づける 見出しとなる行(列)は 含めず選択する

※グループの見出しとする行は 上、下(左、右)どちらでもよい

選択の際は、この点に注意しましょう。

そして、

右クリック  > 行での他の操作項目を表示 > 行〇~△ をグループ化

と進むことで、選択範囲がグループ化されます。

メニューから

表示 > グループ化 > 行〇~△ をグループ化
 

で作成することも可能。

もし、ここでボタンが

このように上について欲しいのに下に付いてしまった(列の場合は左に欲しいのに右に)場合は、このボタンまたはグループ化のライン部分を右クリックして

[+] / [-] ボタンを上(下)に移動 を押しましょう。

これで紐づけする行(列)の上下(左右)を変更できます。

一度 上下(左右)を設定すると、記憶してくれるので以降は 新しくグループ化した場合は同じ側にボタンが付きます。

注意点で書いた「開閉ボタンを紐づける 見出しとなる行(列)は 含めず選択」を忘れて、グループの見出しとする(階へボタンを紐づける)行まで含めてグループ化しちゃうと 意図しない表示になってしまいます。

なんか違う

グループ化を辞めたい場合は、

右クリック > グループの削除

でOK

簡単ですね。



ショートカットでグループ作成、削除

ALT + Shift + →(右) 選択範囲をグループ化
ALT + Shift + ←(左) 選択範囲のグループ削除

複数のグループを連続で作成したり、複数グループを一気に削除する場合はショートカットが便利です。

ショートカットの場合は 行選択ではなくセル範囲の選択からでもグループ化が可能です。

グループの削除の際は、

グループ削除の注意点
・グループをショートカットで削除する場合は、行(列)をグループの一つ下(右)も含めて選択する
・グループを閉じたまま グループ削除をすると、閉じていた行(列)は非表示として残る

という点に注意が必要です。

というわけで、グループを一括解除する場合は、

1. 先にグループを展開しておいてから
2. 最低でも1行(1列)グループの下(右)を含めて選択した状態で
3. ショートカット ALT + Shift + ←

こんな手順ってことです。

列グループも同じショートカットで作成、削除が可能となっています。



グループ化でも最強ショートカット F4が便利

Googleスプレッドシートの最強ショートカット F4キー(または Ctrl + Y)は、グループ作成でも大活躍します。

連続でグループを作る場合は、2回目以降は F4キーでいけちゃいます。

ただし注意点としてメニューから行グループを作成した場合は、F4キーで繰り返せるのは行グループ作成のみです。(列のときは列グループのみ)

行、列を意識せず 選択した範囲のグループ生成を繰り返し(F4)す場合は、初回は ショートカット Alt + Shift + → でグループ作成する必要があります。 同じようで少し違うんですね。

最強ショートカットF4キーの無双っぷりは過去noteでも取り上げています。



グループ化は入れ子やコピーが可能

グループ内に別のグループを入れ子で作成することが出来ます。なんと8階層まで増やせるんですが、階層を増やすほど本来のシート部分が狭くなってしまいます。

グループの入れ子が多いと、見やすくするはずのグループ化が逆に見づらくなってしまうこともあるので、多くても3階層くらいまでにしておきましょう。


また、グループしている行、列は コピーしたり、ドラッグドロップで移動させた際に、グループ化されている、されていないという 設定を引き継いでしまいます。

この仕様が結構厄介だったりします。


グループにグループ外の行をドラッグすると変なことになる

行グループの中にグループ外の行をドラッグして追加したいって時は結構あります。

このように 一見ドラッグした行もグループ化に入ったように見えますが、実は先ほど書いた通り行を移動した際に「グループ化されている、されていない」という設定が保持されています。

ひとつのグループにまとまっているように見えますが、実はグループを一度閉じて開きなおすと・・・

なんで??

なぜか 挿入した行以下が非表示状態となり、さらに挿入した行を境にグループが2つに分離してしまいます。

ドラッグで挿入した行が グループ化されていない行だから発生する事象なんですが、非常にわかりづらく ユーザーがグループをぐちゃぐちゃにしやすい注意ポイントです。

行を挿入してから、行ではなくセルを移動させる、もしくは移動させる行も先に一旦グループ化してからドラッグすることで回避できます。

もう少し融通が利いて欲しいもんですね。

不満はありますが、とりあえず現状ではグループに行(列)をドラッグする際は一手間必要だってことを覚えておきましょう。



グループ内で 行(列)の非表示は使えないと思った方が良い

グループ機能を使う場合は、対象範囲に非表示にしている(しておきたい)行(列)を含んでいないかにも注意が必要です。

Excelのグループ機能もそうなんですが、グループを展開(表示)するとなぜか非表示の行や列まで開いてしまうという仕様になっている為です。

引田天功の脱出イリュージョンのような

グループと非表示は合わせて使えないものと覚えておきましょう。(というか 表示/非表示機能に開閉ボタンを付けたものが グループ化で基本部分は同じものってことだと思います)


グループ化は保護と組み合わせが出来ない

残念ながらグループ化は保護と組み合わせることも出来ません

つまり 共有メンバーに内容は編集されたくないんでセルの保護をかけたいけど、グループ機能の開閉は使わせたい。といったことは両立できません

残念ですが保護を諦めるか、行方向であれば フィルタビューを使って対応あたりで対応しましょう。

ちなみにフィルタビューと違って、誰かがグループを開閉すると 他の人の開いてる画面にも影響しちゃいます。

他の人がグループを開いて中の行を作業している途中で、他の人がそのグループを閉じちゃって大変なのことに!なんてことも。

大人数が同時編集するようなスプレッドシートは、グループ化が不評になることもあるんで気を付けましょう。



Googleスプレッドシート 行・列のグループ一括開閉

グループの開閉操作、そして一つひとつグループを開閉するのではなく、一発でシート内の全グループを開いたり閉じたりする方法、これらを見ていきましょう。



マウスからグループ一括開閉

まずはマウスから操作する方法です。

個々のグループの開閉は ⊞ ⊟ ボタン左クリックすることで、開閉ができます。

グループが展開されている時は⊟ボタンに限らず、このラインのどこをクリックしても閉じます。


一括開閉の場合は グループ化でボタンが表示されている グレーの領域なら、どこを右クリックしてもOK

このゾーンのどこを右クリックしてもよい

ここで表示されるメニュー「すべての列(行)グループを展開」「すべての列(行)グループを折りたたむ」で操作します。

(グループ部分を)右クリック > すべての列グループを展開

ただしこの方法での一括開閉は 行グループのみ、または列グループのみです。マウスからは 1アクションで 行グループ、列グループ両方を一気に開閉は出来ません

これを解決するのがショートカットを使う方法です。



ショートカットで グループ一括開閉

ALT + Shift + ↓(下) 選択範囲のグループを開く
ALT + Shift + ↑(上) 選択範囲のグループを閉じる

グループを生成するショートカットと似てるから覚えやすい(混乱する?)ですね。

これは、あくまでも選択しているセルが含まれるグループを開く(閉じる)ショートカットです。

これだけで シート上のグループ全体を開閉するわけではありません

行・列どちらも開閉する。どちらかのみは出来ない

でも、選択されてるセルを含むグループが開閉されるわけですから、全部のセルが選択されてればOKってことですよね。だったら、あのショートカットが使えます!

データ範囲やシート全体を アクティブにできるショートカット

Ctrl + A です。

というわけで、シート内の全グループ一括開閉のショートカット操作手順は

■シート内の全グループ(行・列)一括開閉のショートカット手順
Ctrl +A のあと ALT + Shift + ↓(下) シート内の全グループを開く
Ctrl +A のあと ALT + Shift + ↑(上) シート内の全グループを閉じる

1回で範囲選択が出来ない場合は、Ctrl +A を2回繰り返す必要があります

このように2段階となります。

むーすんでーひーらーいーて♪

グループ機能を頻繁に使う人なら便利なショートカットです!



GASによる 行・列のグループ一括開閉

ショートカットによる一括開閉が便利なのはわかりましたが、ユーザーにショートカット使ってね!覚えてね!というのは、なかなか難しいですよね。

というわけでGASを使って、ユーザーが簡単に一括開閉できる方法を考えてみましょう。



ショートカットでグループ一括開閉、マクロ記録できる!?

とりあえずGASで実現する方法を探るにあたって、先ほどのショートカットによる グループ一括開閉をマクロ記録でコードにしてみましょう。

たまに手動操作はマクロ記録できないのもあるんですが・・・果たして。

記録したマクロはとりあえず macro01 と名前をつけてみました。

こんな感じのコードが記録されました。

リファレンスを調べると 開閉部分のメソッドは

expandGroups() ・・・ グループを開く
collapseGroups() ・・・ グループを閉じる

この2つですね。sheetクラスではなく、rangeクラスなんですね。

解説に色々わかりづらいことが書いてますが、基本的には全範囲選択で実行すれば、開いているシートの全グループの開閉が出来るという理解でOKです。

マクロを動かして希望する動作になるかを確認してみましょう。

記録したマクロ(macro01)は

拡張機能 > マクロ > macro01で実行できます。

記録したマクロの実行も、初回は認証が必要です。。しかも実行者(人)ごとにこれ必要なのはダルいですね。

1回目の実行は認証で終わっちゃうので、認証が完了したらもう1回 maro01を実行してみましょう。

開く > 閉じる >開く が動いた

動きましたねー。グループ開閉はマクロ記録で、しっかり記録できました!



onEdit + チェックボックスで グループ一括開閉コードを作ろう

マクロの記録をそのまま使っても良いんですが、初回の認証が煩わしいのと、スマホからも意識せずに使えるように、チェックボックスを実行スイッチとして onEdit(シンプルトリガー)で動かすコードにしてみましょう。

//一括グループ開閉 テスト用
function onEdit(e) {
  const value = e.value;
  const range = e.range;
  const sheet = range.getSheet();

  //対象シートと対象セル以外の編集の場合は終了
  if (sheet.getSheetName() != "サンプル" || range.getA1Notation() != "A1") return;

  const targetRange = sheet.getDataRange(); //データ範囲を取得

  if (value == "TRUE") {
    targetRange.expandGroups(); //チェックを入れたらグループを開く
  } else if (value == "FALSE") {
    targetRange.collapseGroups(); //チェックを外したらグループを閉じる
  }

}

とりあえず、こんなコードにしてみました。

特に理解が難しい部分はないですかね?

コードを保存してチェックボックスをA1にセットして試してみましょう。

一括開閉ができました~。

本番の表で動かしてみましょう。

シート名、チェックボックスの位置を本番用にコードを修正して

//一括グループ開閉 本番用
function onEdit(e) {
  const value = e.value;
  const range = e.range;
  const sheet = range.getSheet();

  //対象シートと対象セル以外の編集の場合は終了
  if (sheet.getSheetName() != "本番" || range.getA1Notation() != "A2") return;

  const targetRange = sheet.getDataRange(); //データ範囲を取得

  if (value == "TRUE") {
    targetRange.expandGroups(); //チェックを入れたらグループを開く
  } else if (value == "FALSE") {
    targetRange.collapseGroups(); //チェックを外したらグループを閉じる
  }

}

イメージ通り動作しました~。完成です。

このコードの良い点は、シート内に 行グループだけ、もしくは列グループだけしかない場合、グループが1つもないシートだった場合、グループが既に全て開かれている状態だった場合、いずれのケースでも 単にスルーされるだけで エラーにはならないところです。

実は以前この一括グループ開閉のコードを書いた時は sheetクラスの

expandAllColumnGroups() ・・・ シート内の全ての列グループを開く
expandAllRowGroups() ・・・ シート内の全ての行グループを開く

collapseAllColumnGroups() ・・・ シート内の全ての列グループを閉じる
collapseAllRowGroups() ・・・ シート内の全ての行グループを閉じる

コッチを使っちゃったんですよね。

これだと一括というより 行、列と順に開閉する処理になるのと、仮にシートに 行グループだけしかなかった場合などは

このように 列グループがないってことでエラーになり、そこで止まっちゃうんですよね。

try~catch で流す方法もあるんですが、この辺りを気にせず一発開閉できるexpandGroups()、collapseGroups() を使う方をおススメします。

onEdit(e) + チェックボックス によるGAS実行は、モバイルアプリ版のスプレッドシートでも利用できるというメリットもあります。

このように スマホからも グループの一括開閉ができました~。



グループ機能ぐらいが職場ウケがちょうどいいw

今回紹介したグループ機能は Excelにもあるオーソドックスな機能ですが、意外と知らない人も多かったりします。

で、その手の人たちにLAMBDA関数QUERY関数、ましてや GASで自動化といった処理を見せても、自分には関係ない別世界の凄さって感じであまり響かなかったりします。(むしろ余計な仕事が増えることも)

今回紹介した 視覚的に見やすく出来るグループ化機能あたりが、実は職場ウケとしてはちょうどいいんです

たとえば 仕事で表を作ってくれと依頼された時に、こんな感じでグループをちょっと仕込んでおくことで

「こやつデキるな」

と相手に思わせることが出来る (かもしれませんw) あと相手が興味をもってくれて、やり方を聞いてくるといった効果もあったりします。

是非活用してみてください!

次回こそはシート関数ネタやります。


いいなと思ったら応援しよう!

mir
チップ大歓迎です。やる気がアップしますw