GASで半角カナから全角カナへ変換

Googleスプレッドシートにて、半角カナへの変換にはASC関数があるがその逆の、全角カナへの変換が無い。

GASで作ろうと思ったところ、すでに半角文字から全角文字へ変換する関数を作ってくれている人がいた!

英数字追加版↓

今回は、状況に応じて、カナのみ対応できるようにちょっと手を加えてみた。

//全角一覧
const zenkaku = [
  'ア', 'イ', 'ウ', 'エ', 'オ',
  'カ', 'キ', 'ク', 'ケ', 'コ',
  'サ', 'シ', 'ス', 'セ', 'ソ',
  'タ', 'チ', 'ツ', 'テ', 'ト',
  'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
  'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
  'マ', 'ミ', 'ム', 'メ', 'モ',
  'ヤ', 'ユ', 'ヨ',
  'ラ', 'リ', 'ル', 'レ', 'ロ',
  'ワ', 'ヲ', 'ン',
  'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
  'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
  'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
  'バ', 'ビ', 'ブ', 'ベ', 'ボ',
  'パ', 'ピ', 'プ', 'ペ', 'ポ',
  'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
  'ャ', 'ュ', 'ョ',
  'ッ', 'ヴ',
  'ー', '・', '。', '、', ' ',
  '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 = [
  'ア', 'イ', 'ウ', 'エ', 'オ',
  'カ', 'キ', 'ク', 'ケ', 'コ',
  'サ', 'シ', 'ス', 'セ', 'ソ',
  'タ', 'チ', 'ツ', 'テ', 'ト',
  'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
  'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
  'マ', 'ミ', 'ム', 'メ', 'モ',
  'ヤ', 'ユ', 'ヨ',
  'ラ', 'リ', 'ル', 'レ', 'ロ',
  'ワ', 'ヲ', 'ン',
  'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
  'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
  'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
  'バ', 'ビ', 'ブ', 'ベ', 'ボ',
  'パ', 'ピ', 'プ', 'ペ', 'ポ',
  'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
  'ャ', 'ュ', 'ョ',
  'ッ', 'ヴ',
  'ー', '・', '。', '、', ' ',
  '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',
];

/**
 * 半角から全角へ
 * @param string text 元文字列
 * @param boolean only 半角カナ文字のみ対応
 */
function JIS(text, only=false) {
  //最終的に返す変数を定義
  let result = '';

  //変換する対象文字列をセット
  const input = hankaku;
  const output = zenkaku;

  //引数に値が格納されているかチェック
  if (typeof text === 'undefined') {
    result = 'エラー:全角カタカナに変換する文字列が指定されていません。';
  } else {
    //引数で渡された文字列を定数にセット
    const textStr = text;

    //1文字ずつ分割して配列に格納
    const textArr = textStr.split('');

    //文字数が0でなければ実行
    if (textArr.length !== 0) {
      //文字を再格納する配列を定義
      let array = [];

      //分割した文字の数だけループを回し、もし濁点・半濁点だった場合は1つ前の配列の中身とセットにして array に格納
      for (let i = 0; i < textArr.length; i++) {
        if (textArr[i] == '゙' || textArr[i] == '゚') {
          array[array.length - 1] = (textArr[i - 1] + textArr[i]);
        } else {
          array.push(textArr[i]);
        }
      }

      //再格納した文字の数だけループを回し、もし半角カナがあったら全角カナに直して result へ格納
      for (let j = 0; j < array.length; j++) {
        let index = input.indexOf(array[j]);
        if (index == -1) {
          result = result + array[j];
        } else if (only && index > 81) {
          result = result + array[j];
        } else {
          result = result + output[index];
        }
      }
    }
  }

  //結果を返す
  return result;
}

80行目で、引数にonlyを追加。

このonlyがtrueの場合、ーよりあとの記号や英数字は無視する。

すべてを変換したい場合はセルに =JIS(変換したいセル)。

カナに限定したい場合は =JIS(変換したいセル, true)とする。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です