【地区別⑤】GASの活用 カスタム関数の作成

2021/08/16

GAS R03地区別セミナー

今回は、GASによるスプレッドシートのカスタム関数の作成について紹介します。

はじめに

スプレッドシート関数の自作について

GASでは、スプレッドシートのコンテナバインドスクリプトに処理を記述することで、自作のカスタム関数を作ることができます。

ポイントは下の3点です。

POINT
  • スプレッドシート側の関数の引数として渡されたセルの値がカスタム関数の引数となる。
  • カスタム関数の戻り値が、セルの値としてスプレッドシート側に返される。
  • カスタム関数はグローバルに記述する。

プロジェクトの準備

実習用のプロジェクトを作成しましょう。

スプレッドシートのコンテナバインドスクリプトを作成します。

スプレッドシート名、プロジェクト名は任意です。「カスタム関数練習」などでよいでしょう。

郵便番号から住所を返すカスタム関数

前回作成した、Web APIを用いたプログラムを利用して、セルに入力された郵便番号から住所を取得して返すカスタム関数を作成しす。

引数と戻り値の設定

今回のカスタム関数では、引数として郵便番号を受け取り、取得した住所を戻り値として返します。まずそこだけ記述します。

引数の変数名をzip、戻り値の変数名をadressとします。関数名はzip2adress()としました。

zip2adress
function zip2adress(zip) {  
  let adress = '';



  return adress;
}

上の空白行に、zipに格納された郵便番号から住所取得し、adressに格納する処理を記述します。

メインの処理の記述

fetchメソッドに渡すURLを変数urlに格納します。今回は郵便番号の部分を引数で受け取るので、ベースとなる部分にzipを結合します。

また、前回は住所をadress1adress3に分かれて取得しました。今回はこれらを一つの文字列にまとめてreturnします。

完成形は下のようになります。

クリックして表示
zip2adress
function zip2adress(zip) {
  let adress = '';

  const url = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=' + zip;
  const response = UrlFetchApp.fetch(url);
  const searchResult = JSON.parse(response.getContentText());
  
  adress += searchResult.results[0].address1;
  adress += searchResult.results[0].address2;
  adress += searchResult.results[0].address3;

  return adress;
}

ひらがな ⇔ カタカナを変換するカスタム関数

Excelにはひらがなとカタカナを変換するPHONETIC関数がありました。

Googleスプレッドシートに同様の関数は無さそうなので作成してみましょう。

アイデア1 テーブルを参照して変換する

カスタム関数hira2kata_1を作成します。

下のような ひらがな ⇔ カタカナ のテーブルをループで参照し、変換します。

単純ですが、2重ループ・2次元配列の良い練習になるのではないかと思います。

ひらがな ⇔ カタカナ のテーブル
const charTable = [
  ["あ" , "ア"],["い" , "イ"],["う" , "ウ"],["え" , "エ"],["お" , "オ"],
  ["か" , "カ"],["が" , "ガ"],["き" , "キ"],["ぎ" , "ギ"],["く" , "ク"],
  ["ぐ" , "グ"],["け" , "ケ"],["げ" , "ゲ"],["こ" , "コ"],["ご" , "ゴ"],
  ["さ" , "サ"],["ざ" , "ザ"],["し" , "シ"],["じ" , "ジ"],["す" , "ス"],
  ["ず" , "ズ"],["せ" , "セ"],["ぜ" , "ゼ"],["そ" , "ソ"],["ぞ" , "ゾ"],
  ["た" , "タ"],["だ" , "ダ"],["ち" , "チ"],["ぢ" , "ヂ"],["つ" , "ツ"],
  ["づ" , "ヅ"],["て" , "テ"],["で" , "デ"],["と" , "ト"],["ど" , "ド"],
  ["な" , "ナ"],["に" , "ニ"],["ぬ" , "ヌ"],["ね" , "ネ"],["の" , "ノ"],
  ["は" , "ハ"],["ば" , "バ"],["ぱ" , "パ"],["ひ" , "ヒ"],["び" , "ビ"],
  ["ぴ" , "ピ"],["ふ" , "フ"],["ぶ" , "ブ"],["ぷ" , "プ"],["へ" , "ヘ"],
  ["べ" , "ベ"],["ぺ" , "ペ"],["ほ" , "ホ"],["ぼ" , "ボ"],["ぽ" , "ポ"],
  ["ま" , "マ"],["み" , "ミ"],["む" , "ム"],["め" , "メ"],["も" , "モ"],
  ["や" , "ヤ"],["ゆ" , "ユ"],["よ" , "ヨ"],["ら" , "ラ"],["り" , "リ"],
  ["る" , "ル"],["れ" , "レ"],["ろ" , "ロ"],["わ" , "ワ"],["を" , "ヲ"],
  ["ん" , "ン"],["ゃ" , "ャ"],["ゅ" , "ュ"],["ょ" , "ョ"],["ぁ" , "ァ"],
  ["ぃ" , "ィ"],["ぅ" , "ゥ"],["ぇ" , "ェ"],["ぉ" , "ォ"],["っ" , "ッ"],
  [" " , " "],[" " , " "]
];

引数の変数名をarg、戻り値の変数名をstrとします。

ループの中でarg[i]とすると、引数として受け取った文字列を一文字ずつ順番に当たることができます。

その一文字ずつに対して、上のテーブルのすべてを付き合わせれば変換が可能です。

2重ループまでを記述すると以下のようになります。

クリックして表示
hira2kata_1
function hira2kata_1(arg) {
  let str = '';
  for (let i = 0; i < arg.length; i++) {
    for (let j = 0; j < charTable.length; j++) {
    
    
    
    }
  }
  return str;
}

上コードの空白部分に、ひらがなからカタカナを取得する処理を書きます。

クリックして表示
function hira2kata_1(arg) {
  let str = '';
  for (let i = 0; i < arg.length; i++) {
    for (let j = 0; j < charTable.length; j++) {
      if (arg[i] === charTable[j][0]) {
        str += charTable[j][1];
      }
    }
  }
  return str;
}

アイデア2 文字コードを利用して変換する

カスタム関数hira2kata_2を作成します。

文字コードの規則性を利用すると、計算でひらがな ⇔ カタカナの変換ができます。

文字コードについて、適当な関数を書いて確認します。

test_1
function test_1() {
  const hira = 'あ'.charCodeAt();
  const kata = 'ア'.charCodeAt();  
  console.log(hira, kata, hira - kata);
}
// 結果
// 12354 12450 -96

function test_2() {
  const hira = 'あ'.charCodeAt();  
  console.log(String.fromCharCode(hira + 1));
}
// 結果
// い

結果から、ひらがなとカタカナの差は96であることが分かります。

また、String.fromCharCode()関数で文字コードから文字に変換できることも分かります。

以上を踏まえて、文字コードの計算からひらがなをカタカナに変換するスクリプト記述します。

クリックして表示
function hira2kata_2(arg) {
  let str = '';
  for (let i = 0; i < arg.length; i++) {
    const code = arg[i].charCodeAt();
    str += String.fromCharCode(code + 96);
  }
  return str;
}

おわりに

スプレッドシートのカスタム関数について紹介しました。

QooQ