🥳

【GAS】全角半角を整えるテンプレート(カスタマイズ可能)

に公開

はじめに(一定のルールに沿って全角半角を整えたい)

会社の資料で全角半角を一定のルールに沿って揃えたい場合があります。
ネットで検索したところ、思ったようなのが見つけられませんでした。

検索結果を見て個人的に困ったところ

  • 濁点半濁点が独立してしまう
  • ()カッコに対応できない
  • 自分ルール(数字は半角、カッコは全角など)を適応できない

自分ルールにカスタマイズもできるコードを作成したのでメモとして残します。

コード紹介

考え方

  1. 1文字ずつバラバラにする(ただし、濁音半濁音は前の文字とセットにする)
  2. 半角リストまたは全角リストと参照してインデックス番号を取得する
  3. インデックス番号がある場合は変換する

注意点

  • インデックス番号で変換するので、置換前リストと置換後リストの配列順は一致させること
  • 個人ルールを入れたい場合もインデックス順に気を付ける
function changeStandardChars(chars) {
  /**
   * 文字をバラバラにするコード群
   * ただし、濁点半濁点は1文字として保持する
  */
  const charTeams = [];
  let currentChar = ''; // 現在処理中の文字を保持する変数

  for (let i = 0; i < chars.length; i++) {
    let char = chars.charAt(i);

    if (char === '゙' || char === '゚') {
      // 直前の文字に濁点または半濁点を結合
      if (currentChar) {
        currentChar += char;
      }

    } else {
      // 新しい文字の場合
      if (currentChar) {
        charTeams.push(currentChar); // 以前の文字を配列に追加
      }
      currentChar = char; // 現在の文字をcurrentCharに設定
    }
  }

  // 最後の文字がcurrentCharに残っている場合に追加
  if (currentChar) {
    charTeams.push(currentChar);
  }
  // console.log('charTeams', charTeams);


  /**
   * 上で作成した(charTeams)で
   * 自分のルールに沿って半角→全角、全角→半角
   * にするコード群
  */
  let result = '';
  for (const char of charTeams) {
    // console.log('char', char);

    let hankakuIndex = HANKAKU_KANA.indexOf(char);
    let zenkakuIndex = ZENKAKU_NUM_IPA.indexOf(char);

    if (hankakuIndex !== -1) {
      //半角カタカナのときは全角に変換
      result += ZENKAKU_KANA[hankakuIndex];
      continue;
    }

    if (zenkakuIndex !== -1) {
      //全角数字・アルファベットのときは半角に変換
      result += HANKAKU_NUM_IPA[zenkakuIndex];
      continue;
    }

    result += char;
  }

  return result;
}

// 半角(変換前リスト)
// 半角にしたくない文字をここに格納
const HANKAKU_KANA = [
  'ア', 'イ', 'ウ', 'エ', 'オ',
  'カ', 'キ', 'ク', 'ケ', 'コ',
  'サ', 'シ', 'ス', 'セ', 'ソ',
  'タ', 'チ', 'ツ', 'テ', 'ト',
  'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
  'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
  'マ', 'ミ', 'ム', 'メ', 'モ',
  'ヤ', 'ユ', 'ヨ',
  'ラ', 'リ', 'ル', 'レ', 'ロ',
  'ワ', 'ヲ', 'ン',
  'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
  'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
  'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
  'バ', 'ビ', 'ブ', 'ベ', 'ボ',
  'パ', 'ピ', 'プ', 'ペ', 'ポ',
  'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
  'ャ', 'ュ', 'ョ',
  'ッ', 'ヴ',
  'ー', '・',
];

// 全角(変換先リスト)
// 半角→全角に変換する文字をここに格納
const ZENKAKU_KANA = [
  'ア', 'イ', 'ウ', 'エ', 'オ',
  'カ', 'キ', 'ク', 'ケ', 'コ',
  'サ', 'シ', 'ス', 'セ', 'ソ',
  'タ', 'チ', 'ツ', 'テ', 'ト',
  'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
  'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
  'マ', 'ミ', 'ム', 'メ', 'モ',
  'ヤ', 'ユ', 'ヨ',
  'ラ', 'リ', 'ル', 'レ', 'ロ',
  'ワ', 'ヲ', 'ン',
  'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
  'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
  'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
  'バ', 'ビ', 'ブ', 'ベ', 'ボ',
  'パ', 'ピ', 'プ', 'ペ', 'ポ',
  'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
  'ャ', 'ュ', 'ョ',
  'ッ', 'ヴ',
  'ー', '・',
];

// 全角(変換前リスト)
// 全角にしたくない文字をここに格納
const ZENKAKU_NUM_IPA = [
  ' ',
  '0', '1', '2', '3', '4',
  '5', '6', '7', '8', '9',
  'a', 'b', 'c', 'd', 'e',
  'f', 'g', 'h', 'i', 'j',
  'k', 'l', 'm', 'n', 'o',
  'p', 'q', 'r', 's', 't',
  'u', 'v', 'w', 'x', 'y',
  'z',
  'A', 'B', 'C', 'D', 'E',
  'F', 'G', 'H', 'I', 'J',
  'K', 'L', 'M', 'N', 'O',
  'P', 'Q', 'R', 'S', 'T',
  'U', 'V', 'W', 'X', 'Y',
  'Z',
];

// 半角(変換先リスト)
// 全角→半角に変換する文字をここに格納
const HANKAKU_NUM_IPA = [
  ' ',
  '0', '1', '2', '3', '4',
  '5', '6', '7', '8', '9',
  'a', 'b', 'c', 'd', 'e',
  'f', 'g', 'h', 'i', 'j',
  'k', 'l', 'm', 'n', 'o',
  'p', 'q', 'r', 's', 't',
  'u', 'v', 'w', 'x', 'y',
  'z',
  'A', 'B', 'C', 'D', 'E',
  'F', 'G', 'H', 'I', 'J',
  'K', 'L', 'M', 'N', 'O',
  'P', 'Q', 'R', 'S', 'T',
  'U', 'V', 'W', 'X', 'Y',
  'Z',
];

おわりに

全角半角を変換するだけなのに、思ったより長いコードになってしまいました…
汎用性も高く、カスタマイズも簡単なので、私以外にもお使いいただける方がいるとうれしいです。

Discussion