いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)特定の文字(文字列)を含む行の抽出方法いろいろ

 Googleスプレッドシートで、指定した文字(文字列)を含む行を抽出する各種の方法のまとめです。
 部分一致(~を含む)のほか、前方一致(~で始まる)と後方一致(~で終わる)についても記しています。

  • フィルタや関数を使って、指定した文字(文字列)を含む行を抽出することができます。

対象データと抽出内容

 2つの列からなる表があります。
 「県」の列の文字列が「山」の字を含んでいる行を(2列とも)抽出するものとします。
 結果的には「岡山県」の行と「山口県」の2つの行が抽出されることとなります。

抽出方法

フィルタによる抽出

 フィルタのメニューを使った抽出です。
 まずは表内(ここではB2セル)を選択し、メニューから「データ」→「フィルタを作成」と選択します。


 見出しのセルにフィルタのアイコンが現れますので、B列のアイコンをクリックします。
 メニューが現れますので、さらに「条件でフィルタ」を選択します。


 プルダウンから「次を含むテキスト」を選択します。


 プルダウンの下の欄に「山」と入力して、下にある「OK」をクリックします。
 Enterキーでは進まない(確定しない)ので注意が必要です。



 以上で対象となる2つの行を抽出することができました。
 他の行は非表示となっているだけですのでフィルタを解除したり条件を変えることで再表示させることができます。

 また、2つ上の画像で「次で始まるテキスト」や「次で終わるテキスト」を選んでおけば前方一致、後方一致の検索ができます。

FILTER関数とREGEXMATCH関数による抽出

 別のセルに関数を入力して抽出する方法です。
 ここではE3セルにFILTER関数を使った次のような式を入力して抽出を行っています。

 E3セル

=FILTER(B3:C8,REGEXMATCH(B3:B8,"山"))

 抽出条件としてREGEXMATCH関数を使い、「山」を含む行に対応する行(くどい表現ですが)を抽出しています。
 慣れないとこれでも難しいですが、REGEXMATCH関数の強力さがわかる典型的な利用例です。Excelだとこれに相当する関数がないためさらに一苦労します。
 REGEXMATCH関数では正規表現が使用できますので「"山"」を「"^山"」に変えれば前方一致(「山」で始まる)の、「"山$"」に変えれば後方一致(「山」で終わる)の抽出になります。

 このほかにも「いずれかを含む」といった抽出も可能です。REGEXMATCHを使った各種の「含む」の判定方法については次の記事をご覧ください。

www.officeisyours.com

QUERY関数とWHERE~LIKE句による抽出

 Googleスプレッドシート独自のQUERY関数を使う方法です。さらにワイルドカードが使えるWHERE~LIKE句を併用しています。
 なお、基本的に見出しを含めて抽出する関数ですので、E2セルに式を入力しています。

 E2セル

=QUERY(B2:C8,"WHERE B LIKE '%山%'",1)

 LIKE句で0文字以上の文字を表すワイルドカードは「%」です(1文字以上の文字は「_」)ので注意が必要です。
 また、「'%山%'」と、シングルクォーテーション(')が2つ入っている点にも注意してください。
 「'%山%'」を「'山%'」に変えれば前方一致(「山」で始まる)の、「'%山'」に変えれば後方一致(「山」で終わる)の検索となります。

QUERY関数とWHERE~CONTAINS/STARTS WITH/ENDS WITH句による抽出

 ここではQUERY関数とともに「を含む」という抽出条件を意味するWHERE~CONTAINS句を併用しています。

 E2セル

=QUERY(B2:C8,"WHERE B CONTAINS '山'",1)

 CONTAINSを使えばワイルドカードを使うことなく「~を含む」という抽出ができます。ただし2つのシングルクォーテーションはやはり欠かせません。
 また、記述が単純になるかわりに前方一致(「山」で始まる)や後方一致(「山」で終わる)検索ができません。前方一致は「CONTAINS」を「STARTS WITH」に、後方一致は同じく「ENDS WITH」に置き換えることで可能です。

QUERY関数とWHERE~MATCHES句による抽出

 ここではQUERY関数とともに正規表現を使った検索が可能なWHERE~MATCHES句を併用しています。

 E2セル

=QUERY(B2:C8,"WHERE B MATCHES '.*山.*'",1)

 MATCHESは正規表現が使えるとはいえFILTER/REGEXMATCH関数の例とは異なり、指定した文字列が含まれるというだけでは抽出してくれません。指定した正規表現が文字列全体と一致する場合にのみ抽出するため、0文字以上の文字を意味する「.*」を使って「'.*山.*'」とすることで「『山』を含む」という抽出を実現しています。「'山.*'」で前方一致(「山」で始まる)の、「'.*山'」で後方一致(「山」で終わる)の検索になります。
 はっきり言って面倒なので、他の方法を使った方がよさそうです。