スプレッドシートに書かれたIPv4アドレスをソートして出力する関数です。
IPアドレスをスプレッドシートの機能でそのままソートしようとするとうまくできません。
例えばこんなセルがあったとします。
これを「降順でシートを並び替え」すると以下の結果になります。
セル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列にソートした結果を出力しており、うまくソートできていることがわかります。
CIDRが記載されている場合
この場合は、ソートする部分を以下のように変更すればソート可能です。
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
})
.
や/
で分割してますが、これを:
にすればIPv6アドレスにも対応できると思います。