Googleスプレッドシートで半角カタカナを全角カタカナに変換する関数「f7conv」をGASで作る

概要

  • Googleスプレッドシート上で「半角カタカナ」を「全角カタカナ」に変換したくなった。
  • 色々探したが、先人が作成したものは「ガ」などの濁音の変換時に「カ」と「濁点」に分割されてしまい、そのまま使用できなかった。
  • 以下のエントリーで公開されているソースを元に、半角カタカナ→全角カタカナ変換だけを行う関数に改造させていただいた。

ソース

  • 参考ソースでは、半角・全角カタカナのリストに記号類が含まれていないため、以下を末尾に追加。
    • 長音記号:
    • 中黒:
    • 句点:
    • 読点:
  • 関数名は、F7キーによる全角カタカナ変換にちなんで f7conv とした。
  • Gist版は以下リンクを参照。
//全角カタカナ一覧
const zenkata = [
'ア', 'イ', 'ウ', 'エ', 'オ',
'カ', 'キ', 'ク', 'ケ', 'コ',
'サ', 'シ', 'ス', 'セ', 'ソ',
'タ', 'チ', 'ツ', 'テ', 'ト',
'ナ', 'ニ', 'ヌ', 'ネ', 'ノ',
'ハ', 'ヒ', 'フ', 'ヘ', 'ホ',
'マ', 'ミ', 'ム', 'メ', 'モ',
'ヤ', 'ユ', 'ヨ',
'ラ', 'リ', 'ル', 'レ', 'ロ',
'ワ', 'ヲ', 'ン',
'ガ', 'ギ', 'グ', 'ゲ', 'ゴ',
'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ',
'ダ', 'ヂ', 'ヅ', 'デ', 'ド',
'バ', 'ビ', 'ブ', 'ベ', 'ボ',
'パ', 'ピ', 'プ', 'ペ', 'ポ',
'ァ', 'ィ', 'ゥ', 'ェ', 'ォ',
'ャ', 'ュ', 'ョ',
'ッ', 'ヴ',
'ー', '・', '。', '、'];

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

//関数を作成
function f7conv(text) {
  //最終的に返す変数を定義
  let result = '';

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

  //引数に値が格納されているかチェック
  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 {
          result = result + output[index];
        }
      }
    }
  }

  //結果を返す
  return result;
}

導入方法

  1. スプレッドシートを新規作成
  2. ツールバー > 拡張機能 > Apps Script を開く
  3. スクリプトの編集画面が開くので、上記ソースをペーストして保存
  4. シートに戻り、関数を使用

関数の使い方

=f7conv("スーパーカリフラジリスティックエクスピアリドーシャス")

f7conv関数の使用例

  • 通常のスプレッドシートの関数と同様、上記のように引数に文字列を渡す。
=f7conv(A1)

f7conv関数の使用例

  • セルを参照することも可能。

注意点

  • 渡された文字を1つずつ区切って置換する、という仕組み上、引数に関数を渡すことは出来ない。
=f7conv(ASC("スーパーカリフラジリスティックエクスピアリドーシャス"))
  • なので、上記のような書き方では動かない。
    • 例:全角カタカナをASC関数で半角カタカナに変換。更にf7conv関数で全角カタカナに戻す。

参考リファレンス

更新履歴

  • 2022-10-29 コメントでの指摘を受けてソースを更新しました。
    • 引用符をシングルクォーテーションに統一
    • varlet または const に書き換え
    • 引数のエラーチェックを追加

Comments

  • 貴重な情報ありがとうございます。
    ソースをペーストして保存して実行を押すと下記のようなエラーが表示されてしまいます。
    何が原因か分かりますでしょうか?

    エラー
    TypeError: Cannot read property 'split' of undefined
    f7conv @ 無題.gs:55
    • Name : サトウ管理人

      JUNさん

      コメントありがとうございます!
      当時「とりあえず動けばいい」マインドで作成していたので、ご指摘助かります。

      未定義(undefined)の変数に対して split 関数を実行しようとしていたので、エラーチェックを挟んでみました。
      自分の環境では、ブレークポイントを最終行に設定して「デバッグ」を実行した際、該当エラーが発生しないことを確認しています。

      記事本文のソースを更新しましたので、お試しいただけると幸いです。
  • Name : Procol

    あったら良いなと思ってた関数、ここにあった。サトウさんありがとう。
    • Name : サトウ管理人

      コメントありがとうございます!めっちゃ嬉しいです。
  • 本記事のおかげで作業内容を大幅に短縮することができました。シェアしていただきありがとうございます。
    • Name : サトウ管理人

      コメントありがとうございます!
      元データが半角カナで来た時の絶望ったらないですよね…。時短になったようでよかったです。
  • 非常に助かりました!
    ありがとうございます!
    • Name : サトウ管理人

      ありがとうございます!お役に立てたようでなによりです。
  • 「ガ」などの濁音の変換時に「カ」と「濁点」に分割されてしまい、そのまま使用できなかった。
    →自分もこれに悩まされてさまよっていたので本当に助かりました。天才です…!サトウさん、ありがとうございます!!
    • Name : サトウ管理人

      今更ながらコメントありがとうございました!お褒めの言葉、恐縮です。
  • Name : ひろし

    すばらしい。紹介させていただきました。
    https://technical.verybestcbp.com/gasjis/
    • Name : サトウ管理人

      ご紹介ありがとうございました!

  • スパム対策のため、コメント本文にURLが含まれている場合は「承認待ち」となり、すぐに投稿が反映されません。ご了承ください。
  • 公序良俗に反する内容、個人が特定できる情報、スパム投稿と思われるコメント等については、予告なく編集・削除する場合があります。