Original image by martarey84 from Pixabay and modified by author

最小限の知識で入門する Google Apps Script〜文法編続き〜

Google Apps Script を使ってプログラミングをすることで Google の提供する様々なクラウドアプリ、例えば、スプレッドシート、ドキュメント、Gメール、フォームなどを自動的に操作したり、連携して作業実行することができるようになります。

前回の記事では、Google Apps Script の公式ページ 自動化のクイックスタート で紹介されているサンプルプログラムを使って、Google Apps Script の文法を含め、プログラミングについてごく基本的な事柄について解説を行いました。また、このプログラムは、Google ドキュメントを作りそのタイトルと URL を Gmail で通知する作業を自動化するプログラムでした。

この記事では、 Google Apps Script の公式ページ カスタム関数のクイックスタート にあるサンプルプログラムを使い、プログラミングについて、文法についてさらに理解を深めて行きたいと思います。

Excel と同様に、Google スプレッドシートにはセルに対して使うことのできる多数の関数がもとから用意されています。例えば、ある範囲のセルに対する和を求める関数 SUM や平均を求める関数 AVERAGE などです。

このサンプルプログラムではもともとスプレッドシートには備わっていない関数を定義して、もとから備わっている関数と同様にスプレッドシートでセルに対して使うことができるようにしています。つまり、自作関数として使うことができるようになるわけです。

目次

自作サンプル関数

今回見ていく関数は、あらかじめ決めておいた何かしらのスプレッドシートに紐付けてつかうものです。

もう少し詳しく言うと、新規に作ったスプレッドシートや既にあるスプレッドシートに紐付け、そのスプレッドシートだけで使えるようになるものです。

どのようにして自作関数をスプレッドシートに紐付けるのかということについてここで簡単に補足しておきます。まず、自作関数を紐付けようと思っているスプレッドシートを開きます。そして、スプレッドシートメニュー項目の 「拡張機能」をクリックします。すると小さなメニューがポップアップするのでその中から 「Apps Script」をクリックします。すると、Apps Script でプログラミングをするためのエディタが開きます。ここに自作関数を Apps Script で書くことによりスプレッドシートに自作関数が紐付きます。 エディタについては次回の記事でさらに説明する予定です。

では、Google Apps Script の公式ページ カスタム関数のクイックスタート にあるサンプルプログラムを見てみることにしましょう。

/**
 * 割引率をあたえて売値を計算
 * 売値はアメリカドルで表示
 *
 * @param {number} input 割引前の価格をあらわす引数
 * @param {number} discount .5 や 50% などのような割引率をあらわす引数
 * @return 戻り値はアメリカドルで表示される売値
 * @customfunction  これは自作関数
 */
function salePrice(input, discount) {
  let price = input - (input * discount);
  let dollarUS = Intl.NumberFormat("en-US", {
    style: "currency",
    currency: "USD",
});
  return dollarUS.format(price);
}

このプログラムの中には、selePrice という名前の関数があります。

これから、この関数がどんな処理をするものなのか、ゆっくり見ていきます。

関数 salePrice の引数は input と discount という名前の変数です。

この関数がどこかから呼び出されるとき、これらの引数に、何かしらの値(が代入されている変数)が渡されます。

そして渡された値を使って { } の中に書かれている処理を順に実行し、最後に dollarsUS.format(price) と書かれているものが作られ、呼び出しもとに返されます。

では、{ } の中にかかれている処理を順にたどってみます。

このプログラムでは、引数 input には割引前の価格、引数 discout には割引率が渡されてくることを想定しています。

let price = input - (input * discount);

ここでは、price という変数を宣言し、「割引前の価格」 から「割引前の価格×割引率」を引いて、その結果を price という変数に代入しています。

つまり、変数 price には割引後の価格が代入されます。

let dollarUS = Intl.NumberFormat("en-US", {
    style: "currency",
    currency: "USD",
});

ここでは一行目に「Intl.NumberFormat」というものが出てきています。

IntlとNumberFormat(…, …) が「.(ドット)」でつなげられていることからも想像できるように、これは Intl というオブジェクトが持っている NumberFormat というメソッドで、2つの引数を与えることにより何かしらの処理を実行してくれるものです。(オブジェクトについては前回の記事でおおまかで簡単な説明をしました。気になる人はもう一度読み直してみてください。)

ここでは、Intel.NumberFormat( ) は Intel オブジェクトが持っている NumberFormat という名前のメソッドであると言いました。ところで、メソッドは必要に応じていくつかの引数を与えると何かしらの処理を行い必要に応じて何かしらの値やものを呼び出し元へ返すものです。その意味では、Intel.NumberFormat( ) は Intl.NumberFormat というちょっと長い名前の関数だと思うこともできます。

MDN Web Docs のページ では、Intl.NumberFormat( ) を「コンストラクタ」として扱っています。オブジェクト指向プログラミング言語では、「細かい具体的なところは違うものの、共通の仕様、枠組み」を持ったオブジェクトが複数出てくるプログラムを書くことがよくあります。このようなとき、プログラミング言語自体に、「共通の仕様、枠組み」から具体的なオブジェクトを作り出す仕組みがあると便利です。そのような仕組みを導入するために考えられたものがコンストラクタです。いまここで、コンストラクタについて理解する必要はありませんが、関心のある人は検索エンジンなどを使って調べてみてください。

さて、Intl.NumberFormat の2つの引数を見てみましょう。

1つは、”en-US” という文字列です。

もう1つは、

{style: “currency”, currency: “USD”,}

と書かれているもので、これは連想配列と呼ばれるものです。(元のプログラム中では見やすくするために適当なところで改行されています。)

連想配列は、「キー」と「値」を組みにしたものを必要な個数並べてひとかたまりにしたものです。

この連想配列では、

「キー」が 「style」で「値」が「”currency”」 であるものを 「style : “currency”」のように「:」でつないで組にし、

「キー」が 「currency」で「値」が「”USD”」 であるものを 「currency : “USD”」のように「:」でつないで組にし、

この2つの組を 「,(カンマ)」で区切りながら { } を使ってひとかたまりにしています。

連想配列は、

  • 複数の値を格納できる
  • それぞれの値には「キー」がつけられていて、「キー」を指定すると値を取り出すことができる

という特徴を持ったデータを扱うものです。

実は、JavaScript では、連想配列もオブジェクトと呼ばれます。(というより、オブジェクトと呼ばれることが多いようです。)前回の記事からこれまで、オブジェクトとはプログラム中で擬人化された「モノ」として扱うことができるもので、互いに仕事を依頼することができるようになっているという説明をしてきてました。このようなモノと連想配列を同じオブジェクトという名前で呼ぶのは奇異に感じる人も多いことと思います。しかし、実は、JavaScript では、連想配列とオブジェクトは「同じ構造を持っているモノ」になっています。ここで詳しいことを知る必要はありませんが、気になる人は検索エンジンなどを使って調べてみてください。

それでは、Intl.Numberformat メソッドがどのような処理を行うのか見てみることにします。

MDN Web Docs のページ Intl.NumberFormat によると、Intl.NumberFormat は 「言語に依存した数のフォーマット(表記)を可能にする」という仕事を行うオブジェクトを作り出すためのメソッド(ここではコンストラクタと呼ぶほうがふさわしいかもしません)とのことです。

そして、このメソッドに引数として

  • 言語とそれが使われる地域や国をあらわす文字列
    例えば、アメリカで使われる英語をあらわす “en-US” や 日本で使われる日本語をあらわす “ja-JP” などがあります。
  • 数値のフォーマット(表記)の仕方を表す連想配列
    例えば、{ style: “currency”, currency: “USD” } とすると、書式設定につかうスタイル (style) を「通貨 “currency”」とし、通貨の種類 (currency) は「アメリカドル “USD”」にするというつもりで使うことを想定した連想配列になります。
    書式設定に使うスタイル、つまり style というキーに対応する値としては “currency” の他、”percent”、”unit”、”decimal” が使えるようです。
    通貨の種類、つまり currency というキーに対応する値としてはアメリカドル “USD” の他、日本円 “JPY”、ユーロ ”EUR”をはじめとする様々な通貨をあらわす文字列を使うことができます。

という2つを与えることにより、「それぞれの言語に依存した数のフォーマット(表記)を可能にする」という仕事を行うオブジェクトが作り出されます。

ですから例えば、

Intl.NumberFormat(“en-US”, {style: “currency”, currency: “USD” })

は数値を「アメリカ英語での、アメリカドルの書式」で表示する仕事をしてくれるオブジェクトになります。

そして自作サンプル関数のコードでは、このオブジェクトを次のように変数 dollarUS に代入し、プログラム中では dollarUS という名前で使えるようにしています。

let dollarUS = Intl.NumberFormat("en-US", {
    style: "currency",
    currency: "USD",
}

つまり、dollarUS は数値を「アメリカ英語での、アメリカドルの書式」で表示する仕事をしてくれるオブジェクトです。

実は、このオブジェクトには format という名前のメソッドがあります。 これは、Intl.NumberFormat の引数で指定された「言語と地域」、「通貨」に対応した書式で数値をフォーマットして、文字列として出力するメソッドです。つまり、このメソッドの引数に数値を与えると、戻り値として書式設定済みの数値が文字列として返されることになります。

例えば、654321 という数値を引数にして

dollarUS.format(654321);

としたときの戻り値は “\$654,321.00” のように、先頭に $ 記号が付き、3桁ごとに「, (カンマ)」で区切り、小数点以下第2位まで表示という書式でフォーマットされた文字列となります。

自作サンプル関数のコードでは、次のように、すでに計算されて値が代入されている変数 price をこのメソッドに渡し、戻り値を呼び出し元へ返しています。

return dollarUS.format(price);

一通り最後までたどることができたので、ここでもう一度振り返って全体の流れを見ておきましょう。

/**
 * 割引率をあたえて売値を計算
 * 売値はアメリカドルで表示
 *
 * @param {number} input 割引前の価格をあらわす引数
 * @param {number} discount .5 や 50% などのような割引率をあらわす引数
 * @return 戻り値はアメリカドルで表示される売値
 * @customfunction  これは自作関数
 */
function salePrice(input, discount) {
  let price = input - (input * discount);      //割引前価格と割引率から割引後の価格を計算し price に代入
  let dollarUS = Intl.NumberFormat("en-US", {    //アメリカ英語において、アメリカドルを表記する書式で数値を表示する仕事をするオブジェクトを作成
    style: "currency",             
    currency: "USD",
});
  return dollarUS.format(price);          // 変数 price に代入されていた数値をフォーマットして文字列として呼び出し元へ返す
}

まず、11行目で割引前価格と割引率から割引後の価格を計算し price に代入します。

次に、12行目でアメリカ英語において、米ドルを表記する書式で数値を表示する仕事をするオブジェクトを作成し、変数 dollarUS に代入します。

最後に dollarUS(これは Intl.NumberFormat オブジェクト)の format メソッドを用いて price に代入されている数値をアメリカ英語におけるアメリカドルの書式で文字列として呼び出し元へ返します。

以上が 関数 salePrice が行う処理の内容です。

自作サンプル関数をスプレッドシートで使う

スプレッドシートシートメニュー項目の 「拡張機能」から「Apps Script」のエディタを開き、ここに Apps Script で書いた関数はそのスプレッドシートに自動的に紐付きます。そして、スプレッドシートのセルではあらかじめスプレッドシートで用意されている関数と同じようにして使うことができます。

スプレッドシートでは、例えばセルをクリックし「=」を入力してから関数名のはじめのいくつかの文字を入力してみるとそれらの文字からはじまるたくさんの関数のリストが現れます。同様にして、自作した関数もあらわれれるはずです。

この記事で扱った自作サンプル関数の名前は salePrice でしたから 、セルに「=sa」ぐらいまで入力すると次の図のように表示され選択できるようになります。

セルで自作サンプル関数 salePrice を探す

このようにして、Apps Script で自作した関数もスプレッドシートの関数の1つとして利用できるようになります。

このあとの操作はいつものとおりです。

関数を選択すると、次のように引数を入力するように求められます。

salePrice 関数に引数の値を入力するように求められる

ここでは次のように、引数 input に 2000、引数 discount に 0.3 を入力してみます。

引数に 2000 と 0.3 を入力

そして Enter キーを押すと、次のように表示されます。

結果がアメリカ英語でアメリカドルを表示するときの書式でフォーマットされ表示される

2000 に対して 割引率 0.3 で計算した値 1400 が アメリカ英語で使われる書式でアメリカドルとして表示されているのがわかります。ここでは小数点以下2位まで表示されていますが、「自作サンプル関数 salePrice を定義するときに使った Intl.NumberFormat のオプションに与える引数」を調整することにより、小数点以下の表示をコントロールすることもできるようです。 

上部へスクロール