Googleスプレッドシートの「名前付き関数」と「LAMBDA関数」を使ってみる
「名前付き関数」と「LAMBDA関数」とは?
Google スプレッドシートで新規に追加された、カスタム関数をサポートする機能です。
「Excel」で好評の名前付き関数、LAMBDA、XLOOKUP……が「Google スプレッドシート」に - 窓の杜
Excel で先に実装された LAMBDA関数の後追い実装になります。
名前付き関数
スプレッドシートの式に名前と引数を付けて、その名前で組み込みの関数のように式を呼び出せるする機能です。
公式のヘルプページはこちら
名前付き関数の作成と使用 - Google ドキュメント エディタ ヘルプ
名前付き関数の管理
スプレッドシートの「データ」メニューに「名前付き関数」が追加されています。このメニューで名前付き関数の管理パネルが呼び出せます。
このパネルの左下の「新しい関数を追加」ボタンで、名前付き関数を追加します。
名前付き関数の追加
「関数名」、「関数の説明」、「引数のプレースホルダー」「数式の定義」にそれぞれ入力していきます。
関数名
関数名には、数式に付ける名前を入力します。この名前で関数として式を呼び出せます。
付けられる名前の制約としては、
- 大文字のみ。小文字は使用できない
- 組み込みの関数と同じ名前は使用できない
- 数字で始まる名前にはできない
- 254 文字以下
- 特殊文字はアンダースコアのみ
とあります。試してみたところ、このように日本語での入力もできるようです。「名前付き範囲」の名前と同じようにかなり自由な名前を付けられるようです。
関数の説明
関数の説明文字列を入力します。実際にこの関数を数式中で入力する場合に、表示されます。
引数のプレースホルダー
定義する関数には、0 個以上の引数を指定することができます。この引数を入力していきます。
0 個の場合は、引数なしで数式のみが呼び出されます。
指定の仕方はちょっと特殊で、引き数名を一つずつこの入力欄に書いて Enter で登録、という手順を、引数の数分繰り返していきます。
入力した引き数名は、入力順にリストになっていきます。
このリストは、間違えた場合に削除したり、順序を入れ替えることもできます。実際に関数を数式から呼び出すときには、この引数の順に値が入っていきます。
この引き数名も日本語での入力できるのですが、自分の環境だけなのか直接入力しようとすると変換前のアルファベットが一部混じって入力されてしまいました。別のところで入力したテキストをペーストする分には問題ないようです。
引数についてはとくに型とかの指定はなく、あくまで呼び出されたときの順番に名前を付けるだけのようで、実際に関数を呼び出す場合にも引数の数はチェックされますが、その値が数値や文字列、範囲なども区別されずに渡されます。数式側でIF()等を使用してエラーにならないように対応する必要はあります。
数式の定義
ここに、関数の実際の処理である数式を入力します。この式には上で指定した引数を指定できますので、"A1" といったセル表現ではなく、引数の名前を使った式を書くことができます。
この式の結果が、関数の結果として呼び出し元の数式で使用されます。
それぞれを入力後、「次へ」ボタンを押すと、次の入力になります。
引数の説明
次の画面で、追加する関数のプレビューと、引数の説明の入力になります。
引数のそれぞれに説明を付けられます。
最後に「作成」ボタンを押すと、名前付き関数が登録されます。
名前付き関数の使用
登録された名前付き関数は、組み込みの関数と同じようにセルの数式内で使用できます。
この場合は、合計金額
という名前で、引数をそれぞれ 単価
, 個数
と関数を追加しましたので、次のように関数を呼び出せます。
=合計金額(B2,C2)
これは、実際には定義した式が展開された場合と同じ結果になります。
=B2*C2
式を関数として名前を付けたことにより、使用する場合にも長いIF()のネストや何度も出てくるおなじセルのアドレスが隠されて読みやすくなります。
また、式の入力時に説明が表示されるので、この点でもあつかいやすくなります。
LAMBDA関数
上記の名前付き関数を数式内のみで定義できるのが LAMBDA関数になるようです。内部的には逆に LAMBDA関数での定義を名前を付けて管理できるようにしたのが名前付き関数機能かもしれません。どちらも同様の機能です。
公式のヘルプページはこちら
LAMBDA 関数 - Google ドキュメント エディタ ヘルプ
数式中での LAMBDA関数の記述
LAMBDA関数は関数なので、基本的には数式中に書くことになります。上記の名前付き関数と同じような内容を LAMBDA関数で書くとこのようになります。
=LAMBDA(単価,個数,単価*個数)(B3,C3)
上記の LAMBDA関数の内容を分解すると、このような要素になります。
=LAMBDA(
単価, // 引数1
個数, // 引数2
単価*個数 // 式本体
)
( // 式に渡す値のリスト
B3, // 引数1(単価) に渡される値(B3セルの内容)
C3 // 引数2(個数) に渡される値(C3セルの内容)
)
このように数式中に LAMBDA関数を直接使うだけでも、引数に名前を付けられることで値を変数のように使用することができます。
たとえば、引数にあたる内容が数式の中で何度も出てくる場合には、名前で判別しやすくなります。
=LAMBDA(
単価,
個数,
IF(
AND(
ISNUMBER(単価),
ISNUMBER(個数)
),
単価 * 個数,
""
)
)(B3,C3)
これは展開するとこうなります
=IF(
AND(
ISNUMBER(B3),
ISNUMBER(C3)
),
B3 * C3,
""
)
これくらいであればまだなんとかなりますが、この B3
や C3
がそれぞれ式だったりするとそれだけでわかりにくくなります。
単体の式の中で LAMBDA関数を使うのは引数に名前を付けられるぐらい(それでもかなりちがいますが)ですが、同時に導入された MAP関数 や REDUCE関数 などと組み合わせる場合に、セルの範囲や配列の要素に適用する処理の記述には重要になります。
名前付き関数を定数参照のように使う
これまで式で使う値の参照をおこなうためには、特定のセルの値を使う等の方法がありました。名前付き範囲を使ってセルや範囲に名前を付ければ、どの式からでも同じ値を参照することができましたが、名前付き関数を使うこともできます。
あまり効率的ではないですが、単純な方法としてはこのような定数を返す関数定義をしておいて、この関数を式で使用することで、定数の代わりに使用することも考えられます。
名前付き関数の定義
RATE()
=0.1
数式で RATE()
を使う
=B3*RATE()
これで、RATE()
関数の定義を変更すると、すべての RATE()
使用式で計算が変更されることになります。
LAMBDA関数で変数設定のように使う
名前付き関数では、引数には名前が付けられて使用する側から値を渡すことができますが、 LAMBDA関数をつかうことで関数内だけで使用する定数や変数のような設定をおこなうことができます。
ちょっとわざとらしい例ですが、引数1 が プラスの値の場合は引数1の値、0以下の場合は引数2の値を使って 10倍する関数だと、このように書くこともできます。式自体は同じ式で、値を判定して式に渡す引数の値を切り替えています。
名前付き関数の定義
IF_PLUS_OR_DEFAULT(var1,default_var)
=LAMBDA(var2,
var2 * 10
)(
IF(
var1 > 0,
var1,
default_var
)
)
LAMBDA関数使わない場合だと、同じ計算式が2重に出てくることになります。
名前付き関数の定義
IF_PLUS_OR_DEFAULT(var1,default_var)
=IF(
var1 > 0,
var1 * 10,
default_var * 10
)
パフォーマンス的には注意しないといけないですが、工夫次第でメンテナンスしやすいスプレッドシートにはなると思います。
Discussion