見出し画像

Google Sheet 上で数字を文字列に

Google Sheet 上で大きな数字、たとえば「1234567890」を "one billion two hundred thirty-four million five hundred sixty-seven thousand eight hundred and ninety" といった文字列に変換したいと思ったことはないでしょうか?

... まあ普通はありませんよね。英語のスピーチ原稿を書いていたり、英訳をしているとき以外は普通の日本人の人には縁のないことかもしれません。

それでもこの note を書いた理由は、たまたま数字を文字列に変換する Javascript のライブラリを発見したので、Javascript のライブラリを Googe Sheet の中に組み込む例題として使ってみようと思ったからです。これができれば、プログラマでなくても、ちょっとした便利な機能を自分の Google Sheet に組み込むことができるようになるかも。

とりあえずできそうなことを気軽にやってみましょう。

js written number ライブラリ

見つけたのは js written number というプロジェクトです。github上でここに置かれています。

ラストネームが Yamada さんなのですが、日系人の方なのでしょうか。

ともあれここの説明書(README)を読むと以下のような用例が書かれています。

var writtenNumber = require('written-number');
writtenNumber(1234); // => 'one thousand two hundred and thirty-four'

writtenNumber.defaults.lang = 'es';
writtenNumber(4758); // => 'cuatro mil setecientos cincuenta y ocho'

writtenNumber(1234, {lang: 'fr'});   // => 'mille deux cent trente-quatre'
writtenNumber(1234, {lang: 'es'});   // => 'mil doscientos treinta y cuatro'
writtenNumber(1234, {lang: 'az'});   // => 'min iki yüz otuz dörd'
writtenNumber(1234, {lang: 'pt'});   // => 'mil duzentos e trinta e quatro'
writtenNumber(1234, {lang: 'ar'});   // => 'ألف ومائتان وأربعة وثلاثون'
writtenNumber(1234, {lang: 'eo'});   // => 'mil ducent tridek kvar'
writtenNumber(1234, {lang: 'vi'});   // => 'một ngàn hai trăm và ba mươi bốn'
writtenNumber(1234, {lang: 'uk'});   // => 'одна тисяча двісті тридцять чотири'
writtenNumber(1234, {lang: 'id'});   // => 'seribu dua ratus tiga puluh empat'

一行目の var writtenNumber = require('written-number'); の部分で、まず 'written-number' というライブラリを読み込んで writtenNumber という関数を使えるようにしています。

二行目の writtenNumber(1234); // => 'one thousand two hundred and thirty-four' という部分は // 以降がコメントで、writtenNumber(1234); という呼び出しを行うと  'one thousand two hundred and thirty-four' という文字列が返ってくると説明されているようです。

この writeNumber という関数を呼び出せるようにしてやれば良さそうです。

面白いのが、英語だけではなく様々な言語への変換も組み込まれていることですね。フランス語やロシア語ベトナム語などもあります。まあすべての言語が本当に正しいのかはわかりませんが、一応それぞれの言語はそれぞれの言語のネイティブエンジニアが寄付しているようです。これがオープンソースの良いところですね。

残念ながら日本語は組み込まれていません(いつか日本語の組込みをテーマとしてとりあげるかもしれません)。

さてこの writtenNumber を Google Sheet の中で使えるようにしたいのですが ...

Google Sheet への js written number の組込み

ここでは「【実験】数字→テキスト」という名前のGoogle Sheet (以下 GS)を作って実験します。さて GS の最上部には「ツール」というメニューがあります。

画像1

この「ツール」メニューの中の「スクリプト エディタ」という項目を選びます。

画像2

さてスクリプトエディタが開いたら、以下のようになっているはずです。

画像4

プロジェクトに名前をつけます。ここでは安直に number2text という名前をつけました。左上の名前の部分(number2text)をクリックすると編集できます。

画像4

右側の function myFunction() ... と書いてある場所が、スクリプト(プログラム)を書き込む場所です。ここでは「コード.gs」の中身を完全に以下のコードで置き変えます。

// Currently supported languages are:
// English	en
// Portuguese (Brazil)	pt
// Portuguese (Portugal)	ptPT
// Spanish	es
// French	fr
// Esperanto	eo
// Vietnamese	vi
// Arabic	ar
// Azerbaijan	az
// Turkish	tr
// English (Indian)	enIndian
// Ukrainian	uk
// Indonesian	id
// Russian	ru
function NUMBER2TEXT(num, lang = "en", noAnd = false) {
 var result = writtenNumber(num, {lang: lang, noAnd: noAnd});
 return result;
}

ここで何をしているかというと、writtenNumber という関数を呼び出すための NUMBER2TEXT という関数を定義しています。

この NUMBER2TEXT を GS からは呼び出すつもりです。つまりGSのセルで "=NUMBER2TEXT(1234)" といった使い方ができるようにしたいわけです。

NUMBER2TEXT には3つの引数があって、一番目は数字を渡す num、二番目は言語を指定する lang(ディフォルトは "en" 英語)、そして三番目は出力から "and" を省略するかどうかのフラグです(ディフォルトは false なので and は出力されます)。

この3つの引数を、writtenNumber に渡して返ってきた答 (result)をさらに返しています。

では肝心の writtenNumber の中身はどうするのかと言えば ... 以下の部分から抜き出します(これは GitHub 上のソースコードをテキスト形式で抜き出すための URL です)。

README の用例では require でライブラリを読み込んでいるのですが、ここではライブラリの中身を直接 Code.gs の最後の部分にコピーしてしまいます(長過ぎるので全部はお見せしません)。こんな感じになっているはずです(なお、うまく編集できなかった人のために、記事の最後に「コード.gs」の中身をファイルとしてアップロードしてあります)。

画像5

さて、これでスクリプトの準備はできた筈ですので、もとの GS に戻りましょう。

なお「コード.gs」のラベルの横に下の図のように赤い点がついているときは、ファイルが保存されていませんので、フロッピーディスクのアイコンをクリックして保存して下さい。

画像12

さて、これでスクリプトの中に NUMBER2TEXT という関数が定義され、スプレッドシート側から使えるようになっている筈です。

NUMBER2TEXT の利用​

こんな感じで使ってみます。

画像6

B1 の数式として "=NUMBER2TEXT(A1)" を入力しています。これは A1 に入った値を参照して、前の節で定義した NUMBER2TEXT を呼び出そうとしているところです。

画像7

ということで、無事に 12345 という数字を英語に変換することができました。

上にも書いたように第2引数に変換先言語を指定することができます。たとえば "fr" を指定するとフランス語になります。

画像8

フランス語はよく知らないので、Google 翻訳に頼ると

画像9

となりましたので、どうやら合っているようです。

現在これだけの言語に対応していると書いてあります。

画像10

興味深いですね。まあそれぞれの言語のネイティブエンジニアが寄与しているようですので、中身はほぼ正しいと思われますが、私が直接みて確かめているのはディフォルトの "en" 英語のものだけです。

悪乗りしてこんなことも。アラビア語への変換もしています。

画像11

ライセンス

なおライセンスは以下のものです。MIT ライセンスですので、ここのライセンスファイルを含めることで、自由に自分のプロダクトと一緒に配布することもできます。当然個人のスプレッドシートに組み込むのは自由です。

コード.gs

コード.gs の中身をうまく編集できなかった人は、このファイルの中身を貼り付けてみて下さい。


この記事が気に入ったらサポートをしてみませんか?