アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Google スプレッドシートの小手先テク

こんにちは、kadota です。 この記事は actindi Advent Calendar 2018 の15日目の記事です。

普段、PCおじさんとして管理表をいじったり、フォームの回答を集計したり、調べたものを一覧にするなど、Googleスプレッドシートのお世話になっています。
今回は(今回も?)、スプレッドシートの小ネタを書いてみます。
どちらかというと、あまりスプレッドシートに慣れてない方むけです。

リスト同士を比較して、印をつけたい

例えば、各条件毎に該当するもののリストを持っているとして、それをシート上で比較してみたい場合があるとします。

  • リストA = A列に流し込み
  • リストB = B列に流し込み

そんな場合に印をつける方法です。
※前提としてリストに重複がなく、リストBはリストAに包含されるものとします。
※画像の例は、リストAが、私が娘と行くお出かけ先のいくつか、リストBが、なかでも娘が好きな水族館です。

リストBに存在するものを拾い出す

C列の、見出し行を除いた頭(C2)に次の数式を入れ、セルの右下をつまんでぐいっと下にドラッグして、ドラッグ範囲のセルにいっぺんにコピーします。

=IF(COUNTIF($B$2:$B,A2)=1,"○",)

f:id:ka-dot-a:20181215130025p:plain
存在するものに○印

「あるAがリストBに含まれる」→含まれるものに○印を付ける、というやり方です。

補足:セルの指定方法について

f:id:ka-dot-a:20181215125824p:plain
数式でのセル範囲

数式でのセルの指定は A1, A2 が 個別のセル。A のみでA列全体を意味します。
ドル記号のついた $B$1, $B$2 は、絶対参照といって、ほかのセルにコピーされても位置が調整されません。
ドル無しのほうは、ほかのセルにコピーされるとコピー元のセルから相対的に位置が調整されるので、A2のところがA3, A4... と変化してコピーされます。
上記の数式では、リストBの範囲を固定し、あるA(リストAの特定セル)は相対で指定してます。

リストBに存在しないものを拾い出す

これもD列に連続して次の数式を入れます。

=IF(COUNTIF($B$2:$B,A2)=0,"✗",)

f:id:ka-dot-a:20181215130118p:plain
存在しないものに✗印

「あるAがリストBに含まれない」→含まれないものに✗印を付ける、です。
条件と出力記号をちょっと変えるだけです。かんたんですね!

差分を詰めて表示したい

上の例を少しいじって、印ではなくAの中身を表示させれば差分のリストを作れます。
E列に連続して次の数式を入れます。

=IF(COUNTIF($B$2:$B,A2)=0,A2,)

f:id:ka-dot-a:20181215130218p:plain
差分を出したが、表示が歯抜けに

ただこれだと見た目が歯抜けになってしまいますね。
この出力を「値のコピー」で別の列に出してから、ソートして詰めるというのも手ではありますが、これを数式で済ませたいときは、QUERY()で引っ張ってこれます。SQLライクで便利です。

ここでは、D列を利用して差分リストを出してみます。
F列の一番上(F2)のみに次の数式を入れます。

=QUERY(A:D, "select A where D='✗'")

f:id:ka-dot-a:20181215130311p:plain
差分リスト

かんたんですね!

複数条件での集計

別のシートに、コメントなど文字列が書き込まれている列があるとして、「何かが書かれているが、内容が "-" ではない箇所」の数を手軽に集計したいとします。
ただ「なにかが入ってるセル」をカウントするだけなら、COUNTA()を使えばよいのですが、この場合はCOUNTIFS()を使います。

=COUNTIFS(C2:C10, "*", C2:C10, "<>-")

f:id:ka-dot-a:20181215130553p:plain
複数条件で集計

COUNTIF()と似ていますが、条件を複数並べて絞り込むことができます。
文字列を扱う条件としては、

  • "*" または "<>" で「空ではないセル」
  • "<>文字列A" で「文字列Aではないセル」
  • "文字列A*" で「文字列Aから始まるセル」
  • "*文字列A" で「文字列Aで終わるセル」
  • "*文字列A*" で「文字列Aを含むセル」

など使うことができます。
IF()とは違って、条件を記号含めて文字列に書いて渡します。

これはQUERY()を使っても同じようなことができます。

=QUERY(A2:C10, "select count(C) where C<>'' and C<>'-'")

かんたんですね!

なにか参考になるところがあれば幸いです。