#1. 和暦を西暦に変換する独自スプレッドシート関数をJavaScriptでつくる

Updated
2022/1/30 3:20
Author
Jumpei IkegamiJumpei Ikegami
 
この一連のチュートリアルでは、Googleスプレッドシートの独自関数を簡単なJavaScriptを使ってつくってみます。
JavaScriptは、主にWebブラウザ上で動作するプログラミング言語です。しかしここでは、「Google Apps Script」というブラウザとは別のJavaScript実行環境でJavaScriptを実行します。ブラウザ上で動くプログラムを「フロントエンドのプログラム」と呼ぶのに対して、「Google Apps Script」などどこかのサーバーで動くプログラムを「サーバーサイドのプログラム」と呼びます。あまり意識する必要はありませんが、このチュートリアルではサーバーサイドのプログラムを書くことになります。
この記事では、まず和暦を西暦に変換する独自関数を実装します。

前提知識

特にありません。ただし、JavaScriptに慣れる意味で、先に次のチュートリアルからやることをおすすめします。
ブックマークレットと簡単なJavaScriptで業務を効率化する2021/5/9 3:562021/6/20 8:09

作るもの

Googleスプレッドシート上で、和暦を西暦に変換する「AD」という関数を実装します。たとえば、A1セルに 平成2年 と入力されていた場合、別のセルに =AD(A1) と入力すると、結果が 1990年になるようにします。

体験すること

このチュートリアルによって、以下を体験します。
  • Google Apps Scriptとは何かを理解する
  • Googleスプレッドシートの独自関数を登録する
  • JavaScriptを使って条件分岐をする
  • JavaScriptを使って文字列の一部を除去する
  • JavaScriptを使って文字列を数値に変換する

チュートリアルスタート!

ここからは、実際に手を動かしながら読み進めていきましょう。ただ読むだけよりも、実際に体験した方が内容を深く理解することができます。
ただし、まずは「Google Apps Script」とは何かについて簡単に理解しましょう。

Google Apps Scriptを理解する

Googleスプレッドシートなどは、G Suiteと呼ばれるGoogle製の業務アプリケーションプラットフォーム上にあります。Google Apps Script(以下、GAS)は、G Suite上のアプリケーションを独自にカスタマイズしたり、それらを組み合わせて業務を自動化したりするための開発プラットフォームです。たとえば、Gmailを使って自動でメールを送ったり、Google Drive上のファイルを操作したりすることができます。それに限らず、たとえばLINE BotやSlack Botなどを作ることができたりします。
今回のチュートリアルでは、GASでGoogleスプレッドシート(以下、スプレッドシート)に独自の関数を追加します。Googleスプレッドシートには、デフォルトでSUMやVLOOKUPなどの関数が登録されています。しかし、業務ロジックを反映した処理や日本の商習慣に即したものなどは当然用意されていません。そのような場合は、JavaScriptを使って自分好みの関数を作ることができます。

スプレッドシートに独自関数を登録する

ここからは、実際にスプレッドシートの独自関数を作成する中で、簡単なJavaScriptプログラムを書いてみましょう。
まずは完成品のJavaScriptプログラムを実際にGASに登録し、スプレッドシート上で動作を確認します。
スプレッドシートの画面にアクセスし、スプレットシートを新規作成します。その後、[拡張機能 > Apps Script]を開きます。このとき別のブラウザタブで開く画面が、GASのスクリプト編集画面です。スクリプトエディタを上書きし、次のプログラムを入力します。
JavaScript
なお、今回は説明を簡単にするために昭和以降の和暦しか変換できない不完全な関数になっています。
入力できたら、[ファイル > 保存]をクリックし、プロジェクト名に "和暦西暦変換" と入力して保存します。これで、独自関数の完成です。
スプレッドシートを開いているブラウザタブに戻って、動作確認をしてみましょう。まず、A1のセルに 平成2年 と入力します。次に、A2のセルに =AD(A1) と入力します。ここでは、独自関数であるADに対して、A1セルを渡して呼び出しています。少し関数の実行を待ってから、A2セルに 1990年 と表示されれば成功です。他にも、 令和元年昭和53年など入力して、正しく西暦に変換されるかチェックしてみましょう。
このように、簡単なJavaScriptが書ければ、スプレッドシートでよく使う関数を簡単に自作することができます。

JavaScriptの関数を作る

ここからは、プログラムの内容を簡単に解説します。現時点では、雰囲気がわかれば大丈夫です。
スプレッドシートに関数があるように、JavaScriptの中にも関数と呼ばれる概念があります。スプレッドシートの独自関数は、対応するJavaScriptの関数をGASに記述することで使えるようになります。JavaScriptには最初から使える関数もありますが、自由に関数を新規作成することもできます。関数を自分で作成する場合、次のように記述します。
JavaScript
今回追加した関数でいうと次の通りです。
JavaScript
独自関数ADは、AD("平成2年")のように呼び出されます。そのとき、関数ADの中で定義された「関数に渡す値を格納する一時的な変数」である変数warekiの中身は、文字列 "平成2年" になります。高校数学で「f(x)=x+5」などと書いていたのとだいたい同じです。関数ADでいう変数warekiが、f(x)の変数xに対応しているわけです。
なお、関数の中でreturnが実行されると、関数の処理がそこで終了します。returnの直後に文字列や数値などのデータを指定した場合は、関数の結果としてそのデータが利用されます。ここではスプレッドシートの独自関数なので、最終的にセルに表示したい文字列をreturnの直後に指定しています。これにより、たとえば AD("平成2年") という関数呼び出しの結果は、 "1990年" という文字列になります。

文字列に対して条件チェックをする

和暦から西暦への変換は、元号が始まる前年の西暦を和暦の数字に足し合わせることで実現できます。たとえば、令和が始まった前年は西暦2018年なので、令和2年は2+2018で2020年になります。
この処理を実装するためには、渡された和暦の元号が、令和なのか平成なのか昭和なのかを判別しなければいけません。その元号に応じて、西暦に変換するときに何年分を足せばいいのかを変える必要があります。
JavaScriptでは、このような条件に応じた処理の切り替えに、if文を使います。
JavaScript
今回の関数には、3つのif文が存在します。たとえば次のようなものです。
JavaScript
変数warekiの中身は、 "平成2年" などの文字列データでした。JavaScriptでは、こうした文字列データに対して呼び出せる関数があらかじめ用意されています。文字列に対して実行できる関数の1つが、indexOf()です。この関数に別の文字列を渡して呼び出すと、「渡した文字列が、元の文字列の何番目から始まるか」を示す番号に変身します。この番号は、プログラミングの古くからの慣習に従って、1ではなく0から始まります。たとえば、 "平成2年".indexOf("平成")は、 "平成2年" という文字列に対して、" 平成" という文字列が何番目にあるかを教えてくれます。ここでは文字列の最初にあるので、 "平成2年".indexOf("平成") は0番目を示す0に変身します。
また、JavaScriptでは「2つの値が等しい」という条件文を書くとき、変数への格納と区別するために、 = を3つ並べて === と書きます。たとえば wareki.indexOf("平成") は、変数warekiの中身の文字列が "平成" から始まっている場合に、全体として0に変身します。その場合、今回のプログラムにおけるif文の条件式が次のように成立し、中にある処理は無事に実行されます。
JavaScript
よくわからない場合は、ブラウザのコンソールで文字列の中身を変えて"令和2年".indexOf("令和")を実行するなど、色々と試してみましょう。
条件分岐に関する詳細は、次の記事をご覧ください。
if文による条件分岐と、条件式のつくり方2021/6/20 6:082021/8/8 9:39
‍‍

文字列の一部を抜き出して数値に変換する

ここまでで、元号の判定ができるようになりました。さらに、 "平成2年" という文字列は、そのままでは数値計算に使えません。ここから 2 という数値を取り出して数値に変換して初めて、「1988と足し合わせる」という足し算をすることができます。
はじめに、元年は1年のことなので、事前に変換しておきます。
JavaScript
さらに数字部分だけを取り出すため、 "平成2年" から "平成""年" を除去します。
JavaScript
replace()indexOf() と同じく、文字列に対して呼び出せる関数の1つです。「変換対象の文字列」と「変換後の文字列」の2つの文字列を渡して呼び出します。たとえば、"平成2年".replace("平成", "H")と書けば、全体として"H2年"に変身します。ここでは文字列を除去するために、2つ目の文字列は空にしています。"平成2年".replace("平成", "")は、平成が除去されて"2年"に変身します。
また、変数を使った処理の結果を、同じ変数に再び格納することができます。この場合、右辺が先に計算されます。
  • warekiの最初の値が "平成2年" だった場合、 "平成" が除去され文字列 "2年" に変身し、変数warekiに再代入される
JavaScript
  • さらに "年" が除去され文字列 "2" に変身し、変数warekiに再代入される
JavaScript
この時点で、変数warekiの値は文字列の "2" です。JavaScriptの面倒なところとして、文字列は数値に変換しないと計算ができません。 Number() という命令を使うことで、数字だけが含まれた文字列を、数値に変換することができます。
その後の処理の流れを可視化すると、次の通りです。
  • 元のプログラム
JavaScript
  • 変数warekiの中身は、いまは文字列 "2"
JavaScript
  • 関数Number() によって数値に変換される
JavaScript
  • 数値同士を+でつなぐと、足し算された結果に変身する
JavaScript
これによって、無事に西暦に変換することができました。今は渡された和暦が "平成2年" だった場合を例に説明しましたが、その他の元号についても同様です。
以上で、独自関数ADの内容に関する説明は終わりです。細かい説明も多かったですが、特に覚える必要はありません。ここでは「JavaScriptを使うとスプレッドシートで便利な関数を新しく作れる」ということがわかれば十分です。

応用例

このチュートリアルの内容に少しのJavaScriptを足すと、たとえば下記のようなスプレッドシート独自関数を作ることができます。もしJavaScriptを少し覚えたら、挑戦してみてください。
  • 生年月日を渡すと、12星座を返してくれる関数
  • 日付を入力すると、第何クォーターかを返してくれる関数