見出し画像

【便利】Googleスプレッドシート 11新輸入関数 最新動向-4 【LET関数 基礎】

2023年2月に 追加された Googleスプレッドシート 11新関数を 最新動向シリーズとして紹介してきましたが、いよいよ最後の一つ LETを残すのみとなりました。

ExcelにLETが追加されたのが、ちょうど3年前 2020年の3月だったんですね。※一般提供は 2020年の11月

Googleスプレッドシートに 3年の月日を経て 輸入となったわけです。

LET関数のなにが凄いのか? そして、先に輸入された LAMBDAとの比較や、今回追加されたLETや配列操作系の新関数をフル活用する応用例なんかも 検証していきましょう!

まずは今回はLET関数の基礎を丁寧めに解説していきます。


シリーズ前回の記事


シート関数をプログラミング的にする LET関数

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

上の式や公式を見ても、なんだかよくわからないって方も多いもしれません。

そもそも、LET関数自体は 何か処理をしてくれる関数ではありません。Arrayformula や LAMBDA と同じ、他の関数と組み合わせて使う為の関数です。

さらに言えば、配列処理(スピル)が出来る Arrayformula、そして ヘルパー関数と組み合わせて今まで出来なかった処理を実現できる LAMBDA に対して、LET関数は これがないと出来ないって処理はありません

LET関数無しで出来る処理を、 見やすく・書きやすく・更新しやすく する、つまり 式を 簡潔にする関数といえます。プラス 式内で何度も登場する 同じ計算を まとめることで 処理を軽くする、という効果も期待できます。

LET関数は シート関数にプログラミングの変数宣言 という概念を持ち込んだイノベーティブな関数と言えるでしょう。

プログラミングの変数宣言と聞けば、シート関数のLET関数を知らない人でもプログラミングに触れたことがある人なら 「ああ、あの let からきてるのね。」ってなるんじゃないでしょうか?


Googleスプレッドシートは LAMBDAが先に登場してしまったんで、あまりピンとこないってのがありますが、Excelに LETが登場した時は一部の人にはかなり衝撃的だったと記憶しています。


LET関数の基本

=IF(A2+B2>10,(A2+B2)*C2,(A2+B2)/C2)

たとえば、特に意味はないですが上記のような計算式があったとします。

この A2 を A5 セル、 B2を A6セル、C2を A7セルに変更しようとすると、書き換える箇所が多くて面倒ですよね? もっと長い式だと変更漏れが出てしまうかもしれません。

=LET(a,A2,b,B2,c,C2,IF(a+b>10,(a+b)*c,(a+b)/c))

このようなケースは LET関数を使い、最初に登場するセル参照を全て 変数化(名前付け)してしまうことで、後でメンテナンス(変更)がしやすくなります。

上では、 A2を aとし、B2を bとし、C2を c としています。

これによって A2を別のセルに変更する際、元の式だと 3か所変更が必要だったものが、A2 1ヶ所の修正で済むようになりました。

ちなみに、この変数化は  LAMBDA関数 でも同じことが出来ます。

=LAMBDA(a,b,c,IF(a+b>10,(a+b)*c,(a+b)/c))(A2,B2,C2)

LAMBDAの方が ちょっと記述にクセがありますが、式の長さは大差なく、どちらを使っても良いように感じます。

LAMBDAについては、登場時に特集しています。



LET内で 宣言した 変数を使った計算をさらに変数化できる

=LET(a,A2,b,B2,c,C2,IF(a+b>10,(a+b)*c,(a+b)/c))

さて、セル参照はLETで変数化できましたが、それでも上の式は a+b という計算が 3回も登場するせいで 冗長な印象があります。

LET関数は 先に 宣言した 変数を使った計算結果を さらに変数化 することが出来ます。これを使って、より簡略化してみましょう。

=LET(a,A2,b,B2,c,C2,x,a+b,IF(x>10,x*c,x/c))

このように、変数化した a,bを使った計算 a+b を xと置くことができます。


さらに計算式の場合は、計算の「結果」を 変数化しているので、変数化前は 3回計算していた処理が 1回で済みます。これにより 処理が軽量化されたわけです。

もちろん、この程度の計算なら気にする必要がないレベルですが、これが 複雑かつ大量データを処理する重い計算だと効果が実感できるでしょう。



LAMBDA に比べて LETは 変数を使った計算の変数化がシンプル

=LAMBDA(a,b,c,LAMBDA(x,IF(x>10,x*c,x/c))(a+b))(A2,B2,C2)

上のLET式を LAMBDA式に置き換えたもの

この 変数を使った計算結果の変数化も LAMBDAで処理できるんですが、残念ながら一つのLAMBDA内で連続で記述することが出来ません。

一度最初(外側)のLAMBDAで a,b,cという変数を宣言した上で、その中の入れ子にしたLAMBDAで a+b を xと置くという式にする必要があります。

これが増えていくとカッコの整合性がわかりづらくなり記述ミスを起こしやすくなる上に、どれを何の変数としたかパッと見でわかりにくくなります。

つまり、変数化においては LAMBDAよりも LETの方が圧倒的にわかりやすく、シンプルに記述できるってことです。

もちろんLETでも入れ子にする書き方もできます。

=LET(a,A2,b,B2,c,C2,LET(x,a+b,IF(x>10,x*c,x/c)))

ただ、このような LETの入れ子記述は めったに使いません。唯一ありえるのが、LAMBDAヘルパー関数と組み合わせる処理の時です。これはLET関数の応用を検証する際に実例を出したいと思います。


そのほか、Googleスプレッドシートにおける LET関数についての解説は、「いきなり答える備忘録」さんが導入後にソッコーで書かれています。



LET関数 使用の際の注意点

LAMBDA利用の注意点と重複する部分もありますが、以下が注意点となります。

  1. 利用する変数名は、セル参照と見なされるものは使えない

  2. アルファベットの変数名を入力した状態でエンターすると、勝手に関数候補に置きかえされる

  3. 関数名と重複する変数名は、式内でその関数が使われてなければ使える

  4. 変数は再代入できない

  5. 変数はあくまでもスコープ内(そのLET式内)でのみ有効である

  6. 日本語の変数名も使えるが、個人的には好きじゃない



1. 利用する変数名は、セル参照と見なされるものは使えない

アルファベットと数字の組み合わせは注意が必要です。V1とか C1が使えないのはわかりますが、意外とシート内に存在しない列でもNGで、アルファベット3文字と数字でもエラーとなります。

上は CEL1 という変数名がNGと見なされエラーになっています。

CELL1 とアルファベット4文字以上にするか CEL_1 のように間にアンダーバーを入れることで回避できます。

また、このように変数 を範囲演算子( : )と組み合わせて利用も出来ますが、この変数名が a と cだと、a:c とした時に列全体の A:C と見なされるので、変数名を工夫する必要があります。


2. アルファベットの変数名を入力した状態でエンターすると、勝手に関数候補に置きかえされる

このように、例えば変数名を a に変えようと、 aを入力した状態(a の後ろにフォーカスされた状態)でエンターを押してしまうと、a が勝手に Aから始まる関数 ABS に置き換えられてしまいます。

この関数候補は 気を利かせてくれてるのはわかるんですが、LETやLAMBDAで変数名を扱う場合は、ちょっとウザいんですよね。

フォーカス位置を動かせば発生しないので慣れれば問題ないです。



3. 関数名と重複する変数名は、式内で「その関数が使われてなければ」使える

たとえば、ifsという関数は存在しますが、上の式では LET内で ifs関数は登場しないので A2を ifsという変数名でおくことが出来ています。

でも LET内に登場する ifを変数名として使おうとすると、このようにエラーとなります。

なるべく関数名と重複する変数名は使わない方がいいってことです。



4. 変数は再代入できない

プログラミングの let は再代入ができますが、シート関数の LET関数は 変数の再代入は出来ません。 

上記のように 同じ変数の値を置き換えようとするとエラーになります。



5. 変数はあくまでもスコープ内(そのLET式内)でのみ有効である

変数の再代入はできませんが、上のように LETを入れ子にしてスコープを変えると 同じ変数が使えます。

=LET(a,A2,b,B2,LET(a,a^2,a+b))

最初のLETで A2を a、B2をb としたうえで、その中の LETでは a^2(A2の2乗)を aと置き、a + b という計算をしています。

もちろん、このような書き方は間違いのもとなのでおススメしませんが、スコープ(変数の適用範囲)を理解するには良い事例かなと。

これは 外側のLETで宣言した 変数は 、その中(内側)の LETで使うことが出来るけど、内側のLET内の宣言は 外側の式には干渉しない(使えない)ってことです。

もう一つ例を出すと、こんな感じで 内側の LET式で 宣言した c が 外側の LETでは使えずエラーになります。 内側LET → 外側LET は 変数を渡せないってことがわかりますね。

ま、あまり使うことはないでしょうから 参考程度に。



6. 日本語の変数名も使えるが、個人的には好きじゃない

=LET(値1,A2,値2,B2,値3,C2,計算結果1,値1+値2,IF(計算結果1>10,計算結果1*値3,計算結果1/値3))

このように 変数名は 日本語も使えるんですが・・・。なんか長くなるし、カッコ悪いし個人的には好きじゃないです。

式の説明として使えるとは思いますが、日本語多いと 可読性は逆に落ちるような。。



LET登場で LAMBDAは出番なくなるのか?

セル参照や 値、計算結果の 変数化 において、LET関数の方がLAMBDA関数よりも簡潔な式になる(わかりやすい)という印象ですが、

じゃあ LAMBDAは今後出番がなくなるのか?

と聞かれたら答えはNOです。

  • ヘルパー関数と組み合わせた スピル処理

  • 名前付き関数化 と それを応用した再帰計算

これらは LAMBDAがないと成り立ちませんし、特にヘルパー関数との組み合わせでしか対応できない処理は多いので、 LAMBDAは今後も最強関数の一つであることは間違いありません。

単純に式内の処理をシンプルにするための 変数化 だけなら、LET関数を使うって感じでしょうか。

LAMBDAとLET、両方を使うケース も今後は多く出てくることでしょう。

というわけで、Googleスプレッドシートに 2023年2月に 導入された 11新関数の最新動向シリーズ 全4回は、こちらで終了となります。



Q. LET関数と 配列操作新関数で 1行カレンダー式を シンプル化できるか?(答えは次週)

ここからは LET、配列操作新関数の 応用例を考えていきます。

=LAMBDA(m,y,
  ARRAYFORMULA(
    IF(OR(y<1900,y>2200),,
      {
        TEXT(SEQUENCE(1,7),"ddd");
        LAMBDA(z,
          LAMBDA(x,
            IF(x=0,,x)
          )(
            Query(
              LOOKUP(
                SEQUENCE(12*42/7,7),SEQUENCE(12*42),
                FLATTEN(IFS(MONTH(z)=m,z, z=DATE(y,m+1,1),0, true,))
              ),"where Col1 is not null OR Col7 is not null",0
            )
          )
        )(DATE(y,m,SEQUENCE(1,42)-WEEKDAY(DATE(y,m,1))+1))
      }
    )
  )
)(SEQUENCE(12),A1)

LETが使えるケース(お題)として、過去の noteで作成した 1行式年間カレンダー LAMBDAバージョンを使ってみましょう。

これでも LAMBDAの利用で、元の式から圧倒的に短くなっています。

でも、式中に LAMBDAが3つも登場しており、それ故にカッコの整合性も非常にわかりづらい複雑な式になっていますね。

これを 最新のLETに置き換えることで簡略化、さらに LETと同タイミングで追加された 配列操作系新関数を使うことで、よりシンプルにより短い記述に置き換えてみましょう!というお題です。

が、長くなってしまったので続き(回答)は次回で。

面白そうだなと思った方は、是非挑戦してみてください。

上のLAMBDA式はインデントなしにすると 326文字の式ですが、250文字くらいに できます!


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