2
1

電話番号に - を入れたい(Apps Script/Javascript 対応)...

Last updated at Posted at 2024-08-25

電話番号に - を入れたい(Apps Script/Javascript 対応)...

電話番号をフォームなどで入力された際に、いろいろなフォーマットで電話番号を入力されてくることがあり、それをノーマライズしたくなりコードを考えてみました。
電話番号には、固定電話、携帯電話、サービス電話などがあり、桁数も 10桁あり、11桁ありとややこしい上、市外局番の桁数も地域によって変わるのでちょっと悩ましい。さらには、国際電話もあるのでどうするかちょっと悩みました。

国番号

指定された電話番号が、+で始まる場合に、先頭の 1-5 桁を国番号と考え、国番号の一覧にマッチさせて、国番号とそれ以外に分割します。国番号が 81(日本)の場合は、市街局番、市内局番と下4桁の分割を行います。
81(日本)以外の場合は、国番号以下はそのまま返します。
国番号一覧は、 下記URL から取得したものを利用しています。
https://countrycode.org/ 

市外局番で場合分け

指定された電話番号が 0 で始まらない場合は、先頭に 0 を追加してから、下記のように場合分けしていきます。
市外局番の一覧は、総務省のページからワードをワードドキュメントをダウンロードして入手しました。

市外局番の桁数の長い方からマッチさせていきます
(例: 電話番号が、0422で始まる場合は、市外局番 0422 でマッチさせ、 04 ではマッチさせない。)

- 10桁固定電話

先頭5桁が、5桁の市街局番にマッチする場合は、0xxxx-x-xxxx
先頭4桁が、4桁の市街局番にマッチする場合は、0xxx-xx-xxxx
先頭3桁が、3桁の市街局番にマッチする場合は、0xx-xxx-xxxx
先頭2桁が、2桁の市街局番にマッチする場合は、0x-xxxx-xxxx

- 10桁のサービス電話番号(0120,0800,0570,0990)

先頭4桁が、0120,0800,0570 または、0990にマッチする場合は、0xxx-xx-xxxx

- 11桁の携帯電話および、050IP電話

先頭3桁が、020,050,060,070,080,090 にマッチする場合は、0xx-xxxx-xxxx

出力

国番号なしの電話番号の場合は、-区切りで出力します。
+国番号で始まる電話番号の場合は、+国番号-XXXXXXXXX
(ただし、国番号が 81 の場合は、 XXXXXXXXXも - 区切りになります。)

注意:国番号や市街局番は、時々変更されます。ハードコードされているのでメンテナンスが必要です。

function NormalizePhone(str) {
  
  // 国番号処理
  let prefix_country = /^[+](1-809|1-829|1-849|1-658|1-876|1-787|1-939|1-242|1-246|1-264|1-268|1-284|1-340|1-345|1-441|1-473|1-649|1-664|1-670|1-671|1-684|1-721|1-758|1-767|1-784|1-808|1-868|1-869|1-907|88216|211|212|213|216|218|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|247|248|249|250|251|252|253|254|255|256|257|258|260|261|262|263|264|265|266|267|268|269|290|291|297|298|299|350|351|352|353|354|355|356|357|358|359|370|371|372|373|374|375|376|377|378|380|381|382|383|385|386|387|389|420|421|423|500|501|502|503|504|505|506|507|508|509|590|591|592|593|594|595|596|597|598|599|670|672|673|674|675|676|677|678|679|680|682|683|685|686|687|688|689|690|691|692|850|852|853|855|856|880|886|960|961|962|963|964|965|966|967|968|970|971|972|973|974|975|976|977|992|993|994|995|996|998|20|27|30|31|32|33|34|36|39|40|41|43|44|45|46|47|48|49|51|52|53|54|55|56|57|58|60|61|62|63|64|65|66|81|82|84|86|90|91|92|93|94|95|98|1|7)(.*)$/
  let m = str.toString().replace(/[()]/g,'').match(prefix_country)
  let prefix = ''
  let tel = ''
  if (m == null) {
    tel = str
  } else {
    prefix = m[1]
    tel = m[2]
  }
  if (prefix == '' || prefix == '81') {
    tel = tel.toString().replace(/[-()\s]/g, '')
    if (tel.length != 0 && '123456789'.indexOf(tel.substring(0, 1)) > -1) tel = '0' + tel

// 国内電話番号処理
    tel = tel.replace(/^0(1267|1372|1374|1377|1392|1397|1398|1456|1457|1466|1547|1558|1564|1586|1587|1632|1634|1635|1648|1654|1655|1656|1658|4992|4994|4996|4998|5769|5979|7468|8387|8388|8396|8477|8512|8514|9802|9912|9913|9969)(\d)(\d{4})$/, "0$1-$2-$3");//固定電話市外5桁
    tel = tel.replace(/^0(123|124|125|126|133|134|135|136|137|138|139|142|143|144|145|146|152|153|154|155|156|157|158|162|163|164|165|166|167|172|173|174|175|176|178|179|182|183|184|185|186|187|191|192|193|194|195|197|198|220|223|224|225|226|228|229|233|234|235|237|238|240|241|242|243|244|246|247|248|250|254|255|256|257|258|259|260|261|263|264|265|266|267|268|269|270|274|276|277|278|279|280|282|283|284|285|287|288|289|291|293|294|295|296|297|299|422|428|436|438|439|460|463|465|466|467|470|475|476|478|479|480|493|494|495|531|532|533|536|537|538|539|544|545|547|548|550|551|553|554|555|556|557|558|561|562|563|564|565|566|567|568|569|572|573|574|575|576|577|578|581|584|585|586|587|594|595|596|597|598|599|721|725|735|736|737|738|739|740|742|743|744|745|746|747|748|749|761|763|765|766|767|768|770|771|772|773|774|776|778|779|790|791|794|795|796|797|798|799|820|823|824|826|827|829|833|834|835|836|837|838|845|846|847|848|852|853|854|855|856|857|858|859|863|865|866|867|868|869|875|877|879|880|883|884|885|887|889|892|893|894|895|896|897|898|920|930|940|942|943|944|946|947|948|949|950|952|954|955|956|957|959|964|965|966|967|968|969|972|973|974|977|978|979|980|982|983|984|985|986|987|993|994|995|996|997)(\d{2})(\d{4})$/, "0$1-$2-$3");//固定電話市外4桁
    tel = tel.replace(/^0(11|15|17|18|19|22|23|24|25|26|27|28|29|42|43|44|45|46|47|48|49|52|53|54|55|58|59|72|73|75|76|77|78|79|82|83|86|87|88|89|92|93|95|96|97|98|99)(\d{3})(\d{4})$/, "0$1-$2-$3");//固定電話市外3桁
    tel = tel.replace(/^0(3|4|6)(\d{4})(\d{4})$/, "0$1-$2-$3");//固定電話市外2桁
    tel = tel.replace(/^0(120|800|570|990)(\d{2})(\d{4})$/, "0$1-$2-$3");//10桁のサービス電話番号(0120,0800,0570,0990)
    tel = tel.replace(/^0(50|80|90|20|60|70)(\d{4})(\d{4})$/, "0$1-$2-$3");//11桁の携帯および、080,050IP電話
  }
  // バグフィックス
  return (prefix == '') ? tel : "+" + prefix + "-" + tel.replace(/^0/,'');
}

2
1
0

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
2
1