いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)URLからドメインを抽出する

 Googleスプレッドシートで、URLの文字列からドメイン部分を抽出する方法についてです。

  • SPLIT関数とINDEX関数を使ってURLからドメイン部分を抽出することができます。
  • REGEXEXTRACT関数を使う方法もあります。

手順

「www.」を除かない場合

SPLIT関数とINDEX関数を用いる方法

f:id:accs2014:20200904071324p:plain:right:w550

 画像ではC3セルに次のような式を入力し、B3セルに記録されているURLからドメインを抽出しています。

 C3セル

=INDEX(SPLIT(B3,"/"),2)

 まずは「SPLIT(B3,"/")」により、「/」を区切り文字とみなしてURLを分割しています。
 ドメインはURLの中で2番目の「/」の次に現れますが、SPLIT関数は区切り文字が連続する部分では何も出力しません(デフォルト)。よってドメインはSPLIT関数で分割された配列の3番目ではなく2番目に出力されます。
 あとはINDEX関数を使って2番目を取り出している、というわけです。
 

f:id:accs2014:20200904071327p:plain:right:w550

 式を下方にコピーした様子です。
 http://とhttps://の違い、3番目の「/」の有無などに関わらずドメインが取得できているのがわかります。
 SPLIT関数の強力さがよく分かる利用例かと思います。

REGEXEXTRACT関数を用いる方法

f:id:accs2014:20200905154150p:plain:right:w550

 画像では、C3セルに次のような式を入力して下方にコピーすることで、各URLのドメインを抽出しています。

 C3セル

=REGEXEXTRACT(B3,"/([^/]+)")

 REGEXEXTRACT関数はやや難解な関数ですが、たった1つ用いるだけで抽出を成功させることができます。
 式の意味合いとしては「『/』の後に続く文字列で『/』を含まないもののうち最初のものを、最大限長く抽出する」といったところです。これに該当するのはまさにドメイン部分に他なりません。
 詳細な説明は省きますが、第2引数内のカッコがないと「/」ごと抽出してしまいますし(カッコを使って検索対象と抽出対象を区別することができます)、「+」がないと1文字しか抽出できません。

「www.」を除く場合

SPLIT関数とINDEX関数を用いる方法

f:id:accs2014:20200904071332p:plain:right:w550

 ドメイン部分の先頭が「www.」である場合にその部分を除く例です。先頭以外の「www.」は残すものとします。

 画像ではC3セルに次のように入力し、さらに下方にコピーしています。
 結果としてドメイン部分に「www.」という文字列が複数ある場合でも先頭のものだけ除かれているのがわかります。

 C3セル

=REGEXREPLACE(INDEX(SPLIT(B3,"/"),2),"^www\.","")

 「INDEX(SPLIT(B3,"/"),2)」の部分は上記の例と全く同じで、あとはREGEXREPLACE関数を使って文字列の先頭が「www.」である場合に空文字列に置き換えています。バックスラッシュ(¥キーで入力)は「.」のエスケープのためで、これがないとドメインの先頭が「wwwa」とか「wwwb」の場合でも削られてしまいます。

REGEXEXTRACT関数を用いる方法

f:id:accs2014:20200906140004p:plain:right:w550

 画像では、C3セルに次のような式を入力して下方にコピーすることで、各URLのドメインを抽出しています。
 やはりドメイン部分の先頭にある「www.」は抽出されません。

=REGEXEXTRACT(B3,"/(?:www\.)?([^/]+)")

 これも幾分ややこしいですがREGEXEXTRACT関数はやはり強力です。
 意味合いとしては「『/』か『/www.』の後に続く文字列で『/』を含まないもののうち最初のものを、最大限長く抽出する」といったところです。
 「/(?:www\.)?」の部分が「『/』か『/www.』」にマッチします。ここでカッコが必要になりますが、「(?:)」として用いることで抽出の対象にならないようにしています(非キャプチャグループ)。