いきなり答える備忘録

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

(Gスプレッドシート)IPアドレスを並べ替える

 Googleスプレッドシートで、IPv4アドレスを並べ替える方法についてです。具体的には第nオクテットを第nのキーとして並べ替えます。
 「テキストを列に分割」メニューを使って4列に分割すれば間違いなくできますが、ここでは関数で並べ替える例を試してみます。

  • QUERY関数を使ってIPアドレスを並べ替えることができます。
  • SORT関数を使う方法もあります。

手順

 B列にIPアドレスが並んでいます。
 単純にソートしようとするとオクテット(0~255)ごとの区切りが考慮されないのでおかしな結果になります。
 
 そこで関数を使って並べ替えをしてみます。

QUERY関数を使う方法

 D3セルに次のように入力します。

 D3セル

=QUERY({B3:B14,ARRAYFORMULA(SPLIT(B3:B14,"."))},"SELECT Col1 ORDER BY Col2,Col3,Col4,Col5")

 QUERY関数の第1引数により「もとのIPアドレスと、そのIPアドレスを『.』で区切った4列」の計5列の行列を生成します(詳しくは下記参照)。
 そして第2引数のORDER BY 句により2列目以降の4つの列を基準に昇順で並べ替え、SELECT句により1列目だけを表示させます。
 ちなみに見出し(B2セル)を参照に含めるとSPLITで分割した列数が一致せずうまくいかないような気もしますが、実は問題ありませんので参考まで。

 
 確定した様子です。

 

 なお、上記の式の第1引数の内容だけを表示するとこのようになります。SPLIT関数で分割された値は数値になっているのがわかります。
 QUERY関数を使うことで、この行列の2列目以降を並べ替えに使いつつ、1列目の値だけを表示させているというわけです。

 D3セル

={B3:B14,ARRAYFORMULA(SPLIT(B3:B14,"."))}

SORT関数を使う方法

 並べ替え専門の関数であるSORT関数を使う方法です。
 D3セルに次のような式を入力し、上記例と全く同じ結果を得ています。

 D3セル

=INDEX(SORT({B3:B14,ARRAYFORMULA(SPLIT(B3:B14,"."))},2,TRUE,3,TRUE,4,TRUE,5,TRUE),,1)

 QUERY関数の例の最後の画像と同じ行列を生成し、SORT関数により2列目~5列目を基準にしてソートし、INDEX関数で1列目だけ取り出しています。
 つくりはやや複雑な感じがしますが、式は若干短いです。