いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)LET関数の使い方

 Googleスプレッドシートで2023年2月より利用可能となったLET関数の使い方についてです。

  • LET関数を使うことで値に名前を付けることができ、式の内容を理解しやすくできます。
  • 同じ式を繰り返し記述せずに済ませることもでき、式を簡潔にすることができます。

機能と構文

 LET関数の機能は、「値に名前を付け、式のそれ以降においてその名前で値を利用することができる」というものです。
 構文は次のとおりです。

LET(名前1, 値1[, 名前2, 値2…], 数式)

 基本的に引数の数は3つ以上の奇数にする必要があります。
 引数が3つの場合、最初の引数として値の名前を、2番目の引数としてその値を記すことにより値の名前を定義します。そして最後の3つ目の引数が最終的に出力される結果となります。さらに名前と値の組を記していくことで名前の定義を増やすことができます。
 値には数値や文字列のほかセル参照や関数式を記すこともできます
 なお、名前1と値1は必須とされていますがこれらも実は省略できます。もちろん数式だけ記しても実用的に意味はありません。

基本的な使用例

 次の画像は単純な使用例です。
 B2セルとC2セルの値に名前をつけて計算(掛け算)を行っています。

 D2セル

=LET(a,B2,b,C2,a*b)

 引数が2つずつ組になっているところがポイントです。最初の2つの引数は「B2セルの値にaという名前を付ける」という意味で、その次の2つの引数(3,4番目)は「C2セルの値にbという名前を付ける」という意味です(なお、名前を「" "」で囲む必要はありません)。
 そして最後の第5引数で「aかけるb」つまり7×5という計算を行い、それがセルに出力されています。



 もちろん掛け算をするだけだったら単純に「=B2*C2」という式で済む話ですが、名前を適切につけることで式の意図や内容を把握しやすくできます。
 次の画像も基本的に最初の例と同じことをしています。ただ、名前をaとかbではなく「高さ」「幅」という名前にしています。

 D2セル

=LET(高さ,B2,幅,C2,高さ*幅)

 このように名前には日本語も使うことができます。
 単純に「=B2*C2」と記しても何を意図して計算しているのかわかりません。しかし、このように記せば「高さと幅に基づき面積を求めている」ということが式の内容から理解できます。
 もちろんシート内に適切に見出しや注釈をつければ同じように理解を促すことはできますが、式の方からもアプローチできるというのがポイントです。



 ところで、LET関数では一旦名付けた名前を使ってさらに別の名前を定義することができます。

 D3セル

=LET(高さ,B2,幅,C2,面積,高さ*幅,面積)

 第5,第6引数がポイントです。第4引数までで名付けた「高さ」「幅」という名前に基づき、「高さ*幅」(の値)を「面積」と名付けています。
 なお、先に名付けた名前を後で利用することはできますが逆はできません。つまり「=LET(面積,高さ*幅,高さ,B2…)」などとやってはダメで、これはエラーになります。



 応用になりますが、こうした逐次的な定義の代表的な利用例が、3辺の長さから三角形の面積を求めるというヘロンの公式です。
 セル参照だけで計算しようとすると非常に面倒になる式ですが、これを大幅に簡略化できます。

 E3セル

=LET(a,B3,b,C3,c,D3,s,(a+b+c)/2,SQRT(s*(s-a)*(s-b)*(s-c)))

 第7,第8引数で「(a+b+c)/2」の結果を新たにsと名付けています。これにより式を短縮できるだけでなく最後の数式「SQRT(s*(s-a)*(s-b)*(s-c))」が見た目にも数学的な公式の表現に近くなるのがメリットです。



 また、式の簡略化という意味で代表的な利用例が、IFS関数との併用です。
 IFS関数は条件を1つ1つ変えられる代わりに、ほとんど同じ条件でもいちいち全部記す必要があります。これをLET関数で簡略化できます。

 D3セル

=LET(偏差値,((C3-AVERAGE(C3:C10))/STDEVP(C3:C10))*10+50,
IFS(偏差値>=60,"A",偏差値>=50,"B",偏差値>=40,"C",TRUE,"D")
)

 式の意図は、点数に基づき偏差値を求め、A~Dの4段階にランク付けするというものです。
 1行目で、C3セルの偏差値を求める長い式(の結果)に「偏差値」と名前をつけています。これにより全体を現実的な長さにまで短縮できています。
 参照範囲の変更といった式の修正も容易に済むのが大きなメリットです。



 ちょっと本題からはそれますがランクを一括取得する例は次のようになります。
 1行目の最初の「C3」を「C3:C10」としてARRAYFORMULAで囲んでいます。

 D3セル

=ARRAYFORMULA(
LET(偏差値,((C3:C10-AVERAGE(C3:C10))/STDEVP(C3:C10))*10+50,
IFS(偏差値>=60,"A",偏差値>=50,"B",偏差値>=40,"C",TRUE,"D")
)
)

備考

式ではなく(結果としての)値に名前を付けている

 上記の偏差値のような例では式に名前を付けているように見えますし、説明上そのような表現をしている部分もありますが、実際にはその結果の値に名前が付けられています。
 このことがわかる例が次の画像です。

 B2セル

=LET(a,RAND(),{a,a,a})

 RAND関数にaと名付けて3回実行して3つのセルに表示させるように見える式ですが、どのセルも同じ値になります。
 これはRAND関数を3回実行しているからではなく、1回実行した結果である0.47…という数値に名前を付けてそれを3回呼び出しているからです。実用上はそれほど意識しなくてもよさそうですが、参考まで。