【GAS】全角カタカナを半角に変換

以下が、タイトルのサンプルです。

/**
 * 全角カタカナを半角カタカナに変換する関数(正規表現 + 変換マップ方式)
 *
 * @param {string} str - 入力文字列
 *                         例: "アイウエオガギグゲゴ"
 * @returns {string} - 全角カタカナ部分が半角カタカナに変換された文字列
 *                         例: "アイウエオガギグゲゴ"
 *
 * 本関数は、VBAの StrConv(..., vbNarrow) に近い動作を
 * Google Apps Script 上で実現します。
 */
function convertZenKanaToHan(str) {
  // 入力が null や undefined の場合は、そのまま返す
  if (str == null) {
    return str;
  }

  // ▼ 正規表現の説明
  // [ァ-ヶー]+ は「全角カタカナの連続した文字列」を意味します。
  // ・ァ〜ヶ : カタカナの基本ブロック
  // ・ー      : 長音符
  // +        : 1文字以上の連続
  const regex = /[ァ-ヶー]+/g;

  // ▼ 全角→半角の対応表
  // 濁点・半濁点付き文字も、単独で対応を用意します。
  const zen = [
    "ガ","ギ","グ","ゲ","ゴ",
    "ザ","ジ","ズ","ゼ","ゾ",
    "ダ","ヂ","ヅ","デ","ド",
    "バ","ビ","ブ","ベ","ボ",
    "パ","ピ","プ","ペ","ポ",
    "ヴ", // 全角ヴ
    "ア","イ","ウ","エ","オ",
    "カ","キ","ク","ケ","コ",
    "サ","シ","ス","セ","ソ",
    "タ","チ","ツ","テ","ト",
    "ナ","ニ","ヌ","ネ","ノ",
    "ハ","ヒ","フ","ヘ","ホ",
    "マ","ミ","ム","メ","モ",
    "ヤ","ユ","ヨ",
    "ラ","リ","ル","レ","ロ",
    "ワ","ヲ","ン",
    "ァ","ィ","ゥ","ェ","ォ",
    "ャ","ュ","ョ","ッ",
    "ー"
  ];

  // 半角側の対応表(上記とインデックスで対応)
  const han = [
    "ガ","ギ","グ","ゲ","ゴ",
    "ザ","ジ","ズ","ゼ","ゾ",
    "ダ","ヂ","ヅ","デ","ド",
    "バ","ビ","ブ","ベ","ボ",
    "パ","ピ","プ","ペ","ポ",
    "ヴ",
    "ア","イ","ウ","エ","オ",
    "カ","キ","ク","ケ","コ",
    "サ","シ","ス","セ","ソ",
    "タ","チ","ツ","テ","ト",
    "ナ","ニ","ヌ","ネ","ノ",
    "ハ","ヒ","フ","ヘ","ホ",
    "マ","ミ","ム","メ","モ",
    "ヤ","ユ","ヨ",
    "ラ","リ","ル","レ","ロ",
    "ワ","ヲ","ン",
    "ァ","ィ","ゥ","ェ","ォ",
    "ャ","ュ","ョ","ッ",
    "ー"
  ];

  // ▼ オブジェクト形式の変換マップを作成
  // 例: map["ア"] = "ア"
  const map = {};
  for (let i = 0; i < zen.length; i++) {
    map[zen[i]] = han[i];
  }

  // ▼ 実際の置換処理
  // 正規表現で見つかった「全角カタカナのかたまり」を
  // コールバックで一文字ずつ半角に変換する
  const result = str.replace(regex, (match) => {
    let out = "";
    for (let ch of match) {
      // マップに存在すれば変換、なければ元の文字をそのまま残す
      out += (map[ch] !== undefined ? map[ch] : ch);
    }
    return out;
  });

  return result;
}

/**
 * テスト用関数
 * Logger.log で結果を確認します。
 */
function testConvert() {
  const s = "アイあウエいオガ漢ギグゲ&ゴカ!ナ";
  const converted = convertZenKanaToHan(s);
  Logger.log(converted);
  // 期待される出力例: "アイあウエいオガ漢ギグゲ&ゴカ!ナ"
}

🟩 説明文

1. この関数の目的

Google Apps Script には VBA のような StrConv(..., vbNarrow) がないため、
全角カタカナ(例:アカサタナ)を半角カタカナ(例:アカサタナ)に変換する機能を自作 しました。

  • 日本語入力後にデータを正規化したいとき
  • システム連携やファイル出力で半角文字を必要とするとき

に便利です。


2. 処理の流れ

  1. 入力文字列の中で 全角カタカナが連続している部分を正規表現で検出 します。
    • /[ァ-ヶー]+/g がその役割です。
  2. あらかじめ用意した 変換マップ を使って、該当部分の文字を一文字ずつ変換します。
  3. 該当しない文字(漢字・英数字・記号など)はそのまま残します。

3. 特徴

  • 濁点・半濁点付きの文字(ガ・パなど)にも対応済み
  • 長音符(ー)も半角に変換
  • 既に半角になっている部分はそのまま残る
  • 入力が nullundefined の場合も安全に処理(そのまま返す)

4. テストの仕方

  1. testConvert() をスクリプトエディタで実行
  2. 実行後に 表示 → ログ で結果を確認
  3. 変換が正しく行われているかをテスト文字列で検証できます

5. 応用例

  • スプレッドシートのセル内文字列を getValue()convertZenKanaToHan()setValue() で正規化
  • 外部連携用 CSV や API リクエストの前処理として文字コードを統一

🟢 ポイントまとめ

  • 正規表現で全角カタカナの部分だけを検出し、対象範囲を限定しているため効率的
  • 変換マップを用いているので、将来特殊文字を追加する場合も容易
  • VBA のように簡単に書けるわけではありませんが、これでほぼ同等の変換が可能です

💡 補足:
スプレッドシート上で直接セル関数として使いたい場合は、次のように書くこともできます。

function ZEN2HAN(input) {
  return convertZenKanaToHan(input);
}

シート上で

=ZEN2HAN(A1)

とすれば、A1セルの全角カタカナが半角に変換されます。

Follow me!