LoginSignup
0
1

More than 1 year has passed since last update.

スプレッドシートのIPv4アドレスをソートするGAS

Last updated at Posted at 2022-04-30

スプレッドシートに書かれたIPv4アドレスをソートして出力する関数です。
IPアドレスをスプレッドシートの機能でそのままソートしようとするとうまくできません。

例えばこんなセルがあったとします。

image.png

これを「降順でシートを並び替え」すると以下の結果になります。

image.png

セルA1とA2を比較した際にA2の方が第2オクテットの桁が少ないため、先頭にしてほしいところですが、セルA1の第2オクテット 100 と同じくセルA2の 15 を比較してしまい、セルA1のIPアドレスの方が先頭となってしまいます。

IPv4をソートする関数

解決方法としては、オクテットごとに0を埋めてあげることでIPv4アドレスをソートすることができます。

Google Sheets(Googleスプレッドシート)で、拡張機能からApps Scriptを開き、以下の関数を記述します。

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = spreadsheet.getSheetByName('シート1')

  var ipv4List = sheet.getDataRange().getValues()

   ipv4List.sort((a, b) => {
    const ip1 = a[0].split('.').map(el => el.padStart(3, '0')).join('')
    const ip2 = b[0].split('.').map(el => el.padStart(3, '0')).join('')
    return ip1 - ip2
  })
  Logger.log(ipv4List)

  for(var i=0;i<ipv4List.length;i++){
    sheet.getRange(i+1, 2).setValue(ipv4List[i])
  }
}

B列にソートした結果を出力しており、うまくソートできていることがわかります。
image.png

CIDRが記載されている場合

image.png

この場合は、ソートする部分を以下のように変更すればソート可能です。

ipv4List.sort((a, b) => {
    const ip1 = a[0].split('/')[0].split('.').map(el => el.padStart(3, '0')).join('')
    const ip2 = b[0].split('/')[0].split('.').map(el => el.padStart(3, '0')).join('')
    return ip1 - ip2
})

結果
image.png

./で分割してますが、これを:にすればIPv6アドレスにも対応できると思います。

0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1