![見出し画像](https://assets.st-note.com/production/uploads/images/112280867/rectangle_large_type_2_ce43ed2cfd4dfc94b8542e2b9d4e38ad.png?width=1200)
繰り返し処理で理解する!Googleスプレッドシート 新関数活用
Googleスプレッドシートをメインにした自分が読んで面白い記事を書きたいなと noteを初めたのが 2022年の8月末。そろそろ1年になります。
途中 週2ペースで更新してみましたが、さすがにきつくなったんで 再び週1ペースに落としました。でも、なんとか 毎週更新は継続できてます。
![](https://assets.st-note.com/img/1691205978493-01i4WIHC1F.png)
この1年で Googleスプレッドシートは 様々なアップデートや 関数の追加がありました。
この noteでも 登場時にイチ早く紹介していますが、今までのシート関数とは大きく違う挙動の新関数もあり、
なかなか理解できない
使いこなせない
使いどころがわからない
といった声も多いようです。
今回は 最近 知恵袋 で回答した質問をベースに した「繰り返し」処理を お題として、新関数、既存関数の理解を深める回にしたいと思います。
前半は簡単ですが、後半は LETとLAMBDAを組み合わせた 難易度の高い 再帰式も登場します。
関数得意な人もそうでない人も、是非最後まで読んでみてください。(そして「スキ」をポチってくださいな)
↓ 前回の note 。連動プルダウンの究極系(アルティメット)に挑戦してみた記事です。
Googleスプレッドシート 2022年~2023年までのアップデート まとめ
2022年から この2023年6月 までのアップデートをまとめてみました。
重要度とコメントは、あくまでもmirの主観ですw
2022年1月-3月
Google スプレッドシートのセル数の上限が 2 倍に
重要度:★★★★
大量データが扱えるようになりました。
でも、ぶっちゃけ上限の半分でも かなり動きがわるくなります。。
2022年4月-6月
Google スプレッドシートで数式の修正をインテリジェントに提案
重要度:★★
あまり意識して使ったことないけど。不慣れな人には良い機能かと。
2022年7月-9月
スプレッドシートの関数がさらに柔軟に
重要度:★★★★★
Excelで話題になった LAMBDA 、MAPやBYROWなどのヘルパー関数、XLOOKUP,XMATCHが Googleスプレッドシートに 輸入されたのがこの時期。名前付き関数も利用可能に!
↓ noteでも早々に取り上げました。
2022年10月-12月
スマートチップを使用して Google スプレッドシートにカレンダーの予定を追加
Google スプレッドシートでスマートチップを使用してファイルのプレビューや操作を行う
重要度:★★★
スマートチップが 登場したのがこの時期ですね。まだこの段階では Googleドライブ内のファイルのチップや 連絡先情報、カレンダーの予定といった Googleのコアサービスのみのチップ連携。
Google スプレッドシートの新しいタイムライン ビューでプロジェクトとタスクを管理
重要度:★★★
タイムラインビューも この時期に実装されましたね。結局登場時にちょろっと検証しただけで、それ以降使ってない。。もうちょい使い勝手が向上すると良いんですが。
↓ 早々にnoteで取り上げたからか当時プチバズった。
この時期に プルダウン操作が改定され、プルダウンチップも登場。
ちなみに 公式では特に発表がありませんでしたが、Googleスプレッドシートの LAMBDAヘルパー関数の仕様が改良されて 配列ネストが出来ようになったのもの 2022年12月です。
この変更で LAMBDA関数 の操作感、出来ることは Excelを超えたと言ってよいでしょう。
↓ 個人的には メガ進化、重要度:★★★★★ レベルなんですが、あんま世間は反応しなかったなー。
2023年1月-3月
Google スプレッドシートに便利な関数が新たに加わり、高度な分析が可能に
重要度:★★★★★
LAMBDA や XLOOKUP追加から 半年もたたずに LETや TOROW、WRAPROWS、VSTACKなどが 追加されたのは驚きました。
これらの関数を Googleスプレッドシートには無い Excelの新関数として紹介して、同じことを Googleスプレッドシートではどう代替処理するか?にフォーカスをあてた 「Googleスプレッドシートから見た!」Excel 14の新関数 というシリーズを書いていたので ショックが大きかったw
もちろん 追加されて早々に こちらも noteで取り上げています。
1回使えるようになってから早々に バグで2週間くらい 使えなくなったんで、カバー画像を沈没船にしてますw
Google ドライブ、Google ドキュメント、Google スプレッドシート、Google スライドのインターフェースを一新
重要度:★★★
メニューのデザイン、構成が変更されました。使いやすくなったと思いますが、いきなり変わるんでユーザーが混乱するんですよね。。
Google スプレッドシートと Google ドキュメントに新しいスマート キャンバス機能が登場
重要度:★★★
場所(マップ)チップや ファイナンスチップが追加されたのがこのタイミング。
この中の ストップウォッチ チップ ↓ が使えない・・という声を聴きますが、法人または学校向けの GoogleWorkspace 限定の機能みたいです。
![](https://assets.st-note.com/img/1691210113120-TN8pnosmJa.png)
ちなみに ChatGPT が一気に広まったのもこの時期。Googleスプレッドシートで使える GASで自作した GPT関数 も話題になりました。
↓ 話題のChatGPTを タイムリーに紹介し、かつ困りごとを解決する記事だったんで 結構バズった。
2023年4月-6月
週間まとめ: 2023 年 5 月 19 日(タイマーチップの追加)
これも残念ながら 法人版 Workspace 限定の機能。
![](https://assets.st-note.com/img/1691210631117-T4dyPfkoMu.png)
Google スプレッドシートの新しいスマートチップ データ抽出機能で、データに基づくタスクの作業時間を短縮
重要度:★★
スマートチップから情報を抜き出せるようになったんですが、法人版の GoogleWorkspace じゃないとあまり使えないのと、抜き出せる情報が少ない、自動で情報が更新されないってことで、noteでは取り上げていません。もう少し改善されるとよいです。
Googleの生成AI「Bard」が「Google スプレッドシート」へのエクスポートに対応
重要度:★★★
これはどちらかと言えば Bard の更新ですが、回答の 表を Googleスプレッドシートにエクスポートできるようになりました。
GoogleWorkspace環境だと標準では使えないので、これを使えるようにする設定ににつては、 けいすけ さんの note にコメントを入れさせていただいております。(要 管理者権限)
Duet AI for Google Workspace を発表
重要度:?
同じく これも AIネタですが、Microsoft 365 Copilot に該当する Google版のAI サポート がこちら。言語を英語にすれば Labs申し込みで利用可能になるようですが試してない。日本語対応はいつになるか??
たぶん、どっかでCopilot と同じように 有料(投資回収モード)になるんだろうなー。
全てを拾っているわけではありませんが、スプレッドシートだけでも1年の間に目まぐるしいアップデートがありますね。
長くなりましたが、ここまでは前置きですw
ここからが本題
繰り返し処理のお題で学ぶ 新関数活用(基本)
上で記載した通り、この1年間のアップデートで 2回 、主にExcelで人気だった新関数が Googleスプレッドシートに追加されました。
その中の一部とはなりますが、繰り返し処理のお題を通じて 新関数の活用を学ぼう!というのが、今回の趣旨です。
まずベースとなる お題です。
1つの数式で 1から m までの数字を 横に n回 繰り返して表示させたい
わかりにくいので、具体的な数字にします。
たとえば mが 5、nが 3だったら
![](https://assets.st-note.com/img/1691213481201-Hf8jdoaHEI.png?width=1200)
このように1つの式で 1~5までを 3回繰り返した配列を 横に展開したいってことです。
ぶっちゃけ、新関数を使わずに出来る処理なんですが、これを制限(関数縛り)を加えることで、新関数を使ってお題をクリアしていこう!って感じで進めていきます。
まずは、この手の繰り返し処理の基本となる MOD関数を使う 解決法を3問いってみましょう!
Q1. 基本 Arrayformula + SEQUENCE + MOD 関数を使って式を作る
1つの数式で 1から m までの数字を 横に n回 繰り返して表示させたい
まずは、このお題を 新関数を使わず 上にあげた3つの関数を使って実現してみましょう。
これは大丈夫ですよね?(式の文字数 41文字)
↓↓↓
回答は以下
↓↓↓
A1. 基本 Arrayformula + SEQUENCE + MOD 関数を使った繰り返し式
=ARRAYFORMULA(MOD(SEQUENCE(1, m*n )-1, m )+1)
先ほどと同じく 1~5までを 3回という具体的な数字にすると
=ARRAYFORMULA(MOD(SEQUENCE(1, 5*3 )-1, 5 )+1)
こうなります。
以降はわかりやすいように、 1~5までを 3回 を基準に回答していきます。
ちなみに SEQUENCE(1, 5*3 )-1 の箇所を SEQUENCE を 0開始にする
SEQUENCE(1, 5*3, 0 )
という書き方にしても良いです。式の文字数は一緒ですね。
![](https://assets.st-note.com/img/1691214621601-M3E9D6VsrJ.png)
SEQUENCEは連番を生成し式を入れたセル以外にも自動で スピる 関数です。mirの推し関 の一つで、連番といったらコレですね!
これだと 単に1~15の連番なのですが、これを 1~5の繰り返し 3回にしたいわけです。
ここで 登場するのが 割り算の余りの数を返す MOD関数です。
SEQUENCEで生成した連番を 5で割った 余を使って 繰り返し 配列を生成したいんですが、5,10,15 は 5で割ると 割り切れるので MOD関数は 0 を返してしまいます。
これを調整する為に -1 して +1 という技を使います。
![](https://assets.st-note.com/img/1691215304602-RJC9kwJvdF.png?width=1200)
このように -1 した数値を MODした後、最後に +1 することで、指定した数までを繰り返す 特殊な連番を作ることが出来ます。
そして SEQUENCE は自動で スピりますが、SEQUENCEが返す個々の数値を 他の関数で 配列処理する為に必要になるのが ARRAYFORMULA です。
ARRAYFORMULA も Googleスプレッドシートを代表する関数ですね。
この組み合わせは 繰り返し連番生成の基本中の基本です。
Q2. A1で作成した式を 短くしたい!
![](https://assets.st-note.com/img/1691215768794-89Ze4LVm0l.png?width=1200)
A1で作成した 式
=ARRAYFORMULA(MOD(SEQUENCE(1, 5*3 )-1, 5 )+1)
これを FORMULATEXT関数とLEN関数で 式の文字数をカウントすると 41文字あります。
ちょっと長いんで、これを短くできないか?
という お題です。画像をみると式の出だし部分を変えて 7文字削減で 34文字で作成できています。
知ってる人には簡単な問題ですが、どう変えればよいか? まずは考えてみましょう!
↓↓↓
回答は以下
↓↓↓
A2. Arrayformula の代わりに INDEXが使える
![](https://assets.st-note.com/img/1691215895796-EripKxSmXU.png?width=1200)
=INDEX(MOD(SEQUENCE(1,5*3)-1,5)+1)
INDEXは 表の中の 指定した一部を取得する際に使う関数ですが、実はINDEX関数は ARRAYFROMULAと同じ効果があるんです。
面白いのは INDEX関数の 引数を カンマ含め完全に省略できる点。
Excel の INDEX関数は このような省略はできません。(そもそも スピル対応 Excelは スピらせる為の関数自体が不要ですが)
もちろん INDEXの本来の使い方ではないので、mirも普段は ARRAYFORMULAを使いますが、式の短さ勝負みたいな時は INDEXが使えることを知っていると良いです。(そんな勝負することないでしょうが・・・)
Q3. A2の式を MAP で置き換えてみよう
=INDEX(MOD(SEQUENCE(1,5*3)-1,5)+1)
A2 で Arrayformula を INDEXに置き換えたこちらの式、これを今度は 新関数のMAP で置き換えられるか? というお題です。
ぶっちゃけ、これをMAPに置き換えるメリットはありませんw
式の短さも INDEXが最短です。単に練習だと思ってお付き合いください。
やってみよう!(式の長さ 44文字)
↓↓↓
回答は以下
↓↓↓
A3. MAPを使った式に置き換える
![](https://assets.st-note.com/img/1691216737442-TpSTYeEdnA.png?width=1200)
=MAP(SEQUENCE(1,5*3),LAMBDA(v,MOD(v-1,5)+1))
最初の Arrayfomrulaの式より長くなっちゃいましたねw
新関数の MAPは LAMBDAと組み合わせて使う 特殊な関数で、MAP の引数の配列 (今回の場合は SEQUENCE(1,5*3) )から 1セルずつ 取り出したもの(これを上の式では 引数 vとしている) を LAMBDA以降の式に渡して 処理しています。
MAPについては Googleスプレッドシートに登場した時に解説しています。
今回は MAPを使う必要のない場面ですが、ARRAYFORMULAを組み合わせても配列処理されない 関数もあるので、そんな時は MAPが非常に役に立ちます。
↓ たとえば SUMIFSをMAPと組み合わせる等は過去 noteで紹介しています。
以上が、MODを使う 基本の処理方法3問でした。
繰り返し処理のお題で学ぶ 新関数活用(応用)
基本編の 3つは、いずれも MODを使った処理でしたが、他のアプローチも考えてみましょう。
たとえば
![](https://assets.st-note.com/img/1691217663913-de1VxxhbiC.png?width=1200)
1~5までの 横1行を3つ重ねた配列を生成して、これを 横1行に変換できたら、繰り返し配列になりますよね。
この 「横1行に変換できたら」を実現するのが、新関数の TOROW です。
この TOROWを組み合わせた式で3問 いってみましょう!
引き続きお題は、具体的な数字化した 以下とします。
1~5までを 3回繰り返した配列を 横に展開したい
Q4. ARRAYFORMULA と TOROW と SEQUENCE だけで 出来るか?
それでは、この 3つの関数だけで 1~5までを3回 横方向に繰り返す配列は作れるでしょうか? 式の長さ 49文字。
チャレンジしてみましょう!
↓↓↓
回答は以下
↓↓↓
A4. SEQUENCEの掛け算で 繰り返しを縦に積み重ねる
![](https://assets.st-note.com/img/1691218453243-bAvs7BTCnz.png?width=1200)
=TOROW(ARRAYFORMULA(SEQUENCE(1,5)*SEQUENCE(3)^0))
TOROWは最後に 横一本にする時に使うとして、その手前の 1~5までの連番を縦に3回積み重ねた 配列生成を考える必要があります。
これをSEQUENCE同士の掛け算で
SEQUENCE(1,5)*SEQUENCE(3)^0
このように記述しています。
m^0 は mを 0乗するという意味で、^ はべき乗演算子と呼ばれます。
つまり 2^3 だったら 2の3乗 ⇒ 2*2*2 ⇒ 8 ですね。
算数のお話になりますが、0以外の数値を0乗すると 全て1になるという性質をここで使っています。
1~5の横1行の配列と、縦1行の 1が 3つ並んだ 配列をかけることで、
以下のような 求めていた配列を生成しているわけです。
![](https://assets.st-note.com/img/1691218795766-iTljZlMgje.png?width=1200)
SEQUENCE(3)^0 の箇所は、SEQUENCEの第4引数(増分)を 0とすることで、SEQUENCE(3,1,1,0) と書くこともできます。
こちらの方が Arrayformulaつけなくても 1だけの配列を生成できるんですが、結局 SEQUENCE同士を掛ける処理で ARRYAFORMULAが必要になるんで記述の短い SEQUENCE(3)^0 を採用しました。
余談ですが、この SEQUENCE 同士の掛け算を使うとシンプルに1つの数式で、9かけ9の 掛け算 九九表が生成できます。
![](https://assets.st-note.com/img/1691219311064-YAyGg9K81W.png?width=1200)
Q5. TOROW と SEQUENCE と CHOOSEROWS だけで 出来るか?
それでは、そろそろ脱 ARRAYFORMULA(INDEXも含め)の式も考えていきましょう。まず1つ目は 先ほどの TOROWと SEQUENCEに 新関数の CHOOSEROWSを組み合わせて作れるか? というお題です。
この3つの関数で出来るでしょうか?式の長さ 51文字。
↓↓↓
回答は以下
↓↓↓
A5. CHOSEROWSで繰り返し処理
![](https://assets.st-note.com/img/1691219695227-GLUEHhthx5.png?width=1200)
=TOROW(CHOOSEROWS(SEQUENCE(1,5),SEQUENCE(3,1,1,0)))
新関数 CHOOSEROWSの特徴は、欲しい行を 欲しい順番で 欲しいだけ取得できる という点です。
今回 SEQUENCE(3,1,1,0) で {1;1;1} と1が3回縦に並ぶ配列を生成しています。これを CHOOSEROWSの 第2引数とすることで、
SEQUENCE(1,5) ・・・ 1~5の連番横並び 1行の配列
から、1行目1行目1行目 と1行目だけを3回取得することで、1~5を 3つ積み重ねた配列を生成しているのです。
ここは 先ほどのQ4のケースとは逆で、他に Arrayformulaを必要とする箇所がないので、 SEQUENCE(3)^0 としてArrayformula を式に追加するよりも SEQUENCE(3,1,1,0) の方が短く書けます。
Q6. TOROW と MAKEARRAY(LAMBDA) だけで 出来るか?
それでは ARRAYFORMULAに加え、さらに SEQUENCEも使わない という制限があったらどうでしょうか?
さすがに、このハンデは飛車角落ちレベルですが、ヒントを出すと 新関数の MAKEARRAYを使えば できます!
挑戦してみましょう。式の長さ 36文字。
↓↓↓
回答は以下
↓↓↓
A6. MAKEARRAYで繰り返し処理
![](https://assets.st-note.com/img/1691220538323-JPeaRPxLfr.png?width=1200)
=TOROW(MAKEARRAY(3,5,LAMBDA(r,c,c)))
いままで長くなる一方だった別解でしたが、MAKEARRAY方式はかなりシンプルで短い式になりました。
INDEXに置き換えた式には惜しくもかないませんが、ARRAYFORMULAを使う他の式よりも短いです!
MAKEARRAYは 指定した行数(高さ)、列数(幅)の配列を生成できる 関数なんですが、その配列の中身に行番号・列番号を使うことができます。
![](https://assets.st-note.com/img/1691221811621-Tx8eNaQD86.png?width=1200)
LAMBDA内が r, c, c となっていて、わかりづらいですが、上の図解の通り 最初の c はLAMBDA の引数として 列番号で、 後ろの c は 実際の式の部分になります。今回は 行番号 r はまったく出番なく、cをそのまま使えばいいわけです。
MAKEARRAYについても 登場時に紹介しています。ちょっとクセが強めですが、使いこなせると便利な関数です。
TOROW を絡めた 3つの回答例を紹介しました。
繰り返し処理のお題で学ぶ 新関数活用(特級術師)
MODを使う基本の回答、そして TOROWを使う応用回答を 3つずつみてきました。
これで終わりでもいいんですが、さらに無理やり 難しい関数を使った特殊ケースの回答で 特級クラスの関数を学んでみましょう。
引き続きお題は、具体的な数字化した 以下とします。
1~5までを 3回繰り返した配列を 横に展開したい
Q7. REPTを使って回答してみたい
これは新関数ではないのですが、面白い例なので入れておきます。
「繰り返し」の関数と言えば、EXCELでもおなじみの REPT関数があります。
REPT関数は テキスト(文字列)を指定した回数繰り返す関数です。これを無理やり今回のケースに使いたい!ってお題ですw
どうでしょうか、出来そうでしょうか?式の長さ 42文字。
↓↓↓
回答は以下
↓↓↓
A7. REPT関数で配列の繰り返し処理
![](https://assets.st-note.com/img/1691222784368-4BnbWXbihp.png?width=1200)
=SPLIT(REPT(JOIN(",",SEQUENCE(5),),3),",")
簡単に言うと、SEQUENCEで 生成した 1~5の連番配列を JOINでカンマ区切りで文字列化して、それをREPTで3回繰り返したものを 最後に SPLITで カンマで分割。という処理です。
42文字に抑えるには、ポイントが幾つかあって、
文字列結合するので、SEQUENCE(1,5) でなく SEQUENCE(5) でよい
TEXTJOIN より短い JOIN を使う
JOIN(",",SEQUENCE(5),) の最後の カンマ
この3点です。 最後のカンマに関しては、
![](https://assets.st-note.com/img/1691223127506-djtp912gTJ.png)
単純に JOIN(",",SEQUENCE(5)) としてしまうと、上のように 最後が5で終わっている文字列を REPTで繰り返すことになり、51 の箇所がくっついてしまいます。
これを 空白の削除ができない JOIN の最後にカンマをつけることで、
JOIN( "," , SEQUENCE(5) , )
↑ カンマの後ろの空白も連結している
![](https://assets.st-note.com/img/1691223600247-pSR5CCvwQP.png)
1,2,3,4,5,(空白) をカンマ連結して 文字列を生成しているわけです。
空白を EXCELのように "" と空文字にしなくても機能する Googleスプレッドシートならではの書き方ですね。
Q8. REDUCEを使って回答してみたい
今回のお題である 「横方向に 1~5を 3回 くりかえしたい。」、実は この処理をこのままの式にしたものに最も近いのが、 REDUCE関数を使った式です。
LAMBDA ヘルパー関数 最強クラスの REDUCE関数は、シート関数で今まで出来なかった繰り返し処理ができる関数です。
では、このREDUCE関数で どのように式をつくればよいでしょうか?式の長さ 60文字。
↓↓↓
回答は以下
↓↓↓
A8. REDUCE関数で繰り返し処理
![](https://assets.st-note.com/img/1691224179671-jOYYREbAzB.png?width=1200)
=TOROW(REDUCE(,SEQUENCE(3),LAMBDA(x,y,{x,SEQUENCE(1,5)})),1)
さすがに複雑になってきましたね。
REDUCE関数?まったくわかりませーん。
という方は、REDUCE登場時の検証 noteを先に見ておきましょう。
TOROWは 一旦置いといて、まず REDUCEの冒頭部分
REDUCE(,SEQUENCE(3),
初期値 ・・・ 空白
配列 ・・・ SEQUENCE(3) (つまり 1,2,3 の縦配列)
このような意味合いです。なんで 1,2,3なんて配列を生成したかというと、REDUCEで 3回繰り返し処理する為には、適当な要素数が3の配列が必要だからです。
で、実際の処理を表す式が 以下の部分です。
LAMBDA(x,y,{x,SEQUENCE(1,5)})
x ・・・ 前回の結果(1回目の処理時は初期値)
y ・・・ 配列から一つずつ取り出したもの
{x,SEQUENCE(1,5)} ・・・ 実際の処理の式
x と SEQUENCE(1,5) を横に連結
このようになっています。
y は 処理回数を指定する為だけのもので、今回のケースでは 実処理の式では使いません。
このループ処理を見える形にすると
![](https://assets.st-note.com/img/1691224929476-YIrwaD4VHD.png?width=1200)
このようになります。
前回の結果である x に SEQUENCE(1,5) をどんどん連結しているのがわかりますね。
で、お気づきの通り 初期値の空白が邪魔なんです。シート関数の REDUCEはこの初期値の処理が面倒なのは あるあるネタです。
Excelでよく使われる方法は、最後に DROP関数で 先頭列(行)を除外するテクなんですが、残念ながら TAKE関数、DROP関数は 現状では Googleスプレッドシートには輸入されていません。
ただ、今回の場合は 1行 かつ途中に空白がない 配列を生成しているので、
先頭セルの削除 = 空白除外で左詰め
と 処理を代替できます。
だから最後(式の一番外側)に、TOROW で引数 1(空白除外)すれば先頭の空白を削除することができます。これで完成です。
REDUCEは 最初のうちは理解できなくても、なんとなくで ガンガン使っていきましょう。そのうち理解が追い付きます。
Don't think. Just feel! (考えるな、感じろ)です!
Q9. SCANを使って回答してみたい
REDUCE とセットで 覚えると便利なのが SCAN関数です。ただし、途中の処理結果を都度出力する SCAN関数は、 REDUCEよりも使いどころが制限される ことが多いです。
今回のケースを SCAN関数で 実現することは出来るでしょうか?
挑戦してみましょう!式の長さ 49文字。
ヒントですが TOROWは使いません。
↓↓↓
回答は以下
↓↓↓
A9. SCAN関数で繰り返し処理
![](https://assets.st-note.com/img/1691225962008-cDKlgQTFqN.png?width=1200)
=SCAN(,SEQUENCE(1,5*3),LAMBDA(x,y,IF(x=5,1,x+1)))
SCANは 配列の並びで結果が出力されるので、最後にTOROWを使わないのであれば、5*3 の 15個の横並びの配列を 渡す必要があります。
それが
=SCAN(,SEQUENCE(1,5*3)
この冒頭部分です。初期値は 空白としています。
LAMBDA(x,y,IF(x=5,1,x+1))
x ・・・ 初期値(前回の結果)
y ・・・ 配列から一つずつ取り出したもの
IF(x=5,1,x+1) ・・・ 実際の処理の式
x が5なら 1を 5以外なら x+1を 返す
![](https://assets.st-note.com/img/1691238019539-7B7rAuO0Mf.png)
処理を簡単に言えば、
一つ左を見て 5でなければ 左の数字 に +1を する。左の数が5なら 1に戻す
としています。
初期値を 0としてもいいんですが、空白でも +1したら 1が返るので 初期値を省略して空白としています。
![](https://assets.st-note.com/img/1691238391230-aF775ne95c.png?width=1200)
=IF(A2=5,1,A2+1)
感覚的には A1に1を入れて、上の式をB2に入れて 横にフィルしたのと一緒ですね。この手の一つ前の値を次の計算に使う処理では SCAN関数が使えるケースが多いです。
↓ たとえば 結合セル入りの厄介な表の集計でも SCANが使えます。
REDUCE に続いて SCANを使った 繰り返し処理を紹介しました。
Q10. LETとLAMBDAを使った 再帰処理 で実現できるか?
これが最後です。LAMBDA関数登場に合わせて、GASを使ったエディタ上で作成する自作関数とは別に、シート関数を組み合わせた 名前付き関数を定義できるようになりました。
そして、さらに 名前付き関数内 で名前付き関数を使うことでシート上で 再帰的な処理が 出来るようになったわけです。
REDUCE関数も 再帰っぽい処理と言えるんですが、条件を満たしたら ループを抜けるといったことが出来なかったり、前回から引き続ける値(配列) が1つのみという縛りがあります。
それに対して 名前付き関数を使った再帰的処理は 自由度が高く、引数を複数持たせたり、○○という条件を満たしたら処理終了と定義することが出来ます。
より プログラミング的なループ処理を シート関数で記述できるようになったわけです。
ただし、
非常に式が解読しづらい(扱うのが難しい)
早々に 計算数が上限に達してしまう
といった欠点があります。
で、さらに この名前付き関数 化の部分に LETを使う記述法 が存在します。
Excelガチ勢が Twitter上で使っていて mirも知った 式の書き方なんですが、Googleスプレッドシートにも LETが追加されたことで Excelと 同じように LET と LAMBDA を使った再帰式 が記述できるようになりました。
基本の型としては
=LET(a,LAMBDA(b,c,IF(
という書き方になります。
たとえば
=LET(a,LAMBDA(b,c,IF(c,b(b,c-1),c)),a(a,5))
という式は 結果として 0が返りますが、処理としては 第2引数でしてした5という数値から始まり、ひたすら -1 していくという処理を ループして4,3,2と徐々に小さくなっていき、 0となったら FALSE扱いとなって ループを脱出。
最終的に その時点での c つまり 0を返すという動きをしています。
![](https://assets.st-note.com/img/1691241182536-KN2UVOXEJS.png?width=1200)
なに言ってるか全然わからない?って人も多いですかね。
これは、申し訳ないですが 自分でも 伝わらなそうだなーと思いながら 解説していますw
この LETとLAMBDAの 再帰式は 現状では最高に難解な数式 の一つなんで、まずは「ほへー、こんな式があるんだ」ってくらいの理解でOKです。
最強だけど難解といえば、呪術廻戦だと 五条先生の術式ですね。
無下限呪術 について「収束する無限級数」など、それっぽい数学的な説明があるもののイマイチ理解ができません。
なんとなくのイメージですが、
収束していく 無下限呪術 蒼 を REDUCE関数 とすると、この LET と LAMBDAで創る 再帰式は 無限に発散していく 無下限呪術 赫 または 両方を掛け合わせた 虚式 茈 と言えるかもしれません。
(ループを抜ける IF式の部分を誤ると、本当に無限回ではないですが上限まで 計算が走ってエラーになりますw)
たとえが適切かは微妙ですが、要は めっちゃ難しいってことです!
さらに注意点として、LET と LAMBDAの再帰式を 書いてると 結構シートが固まることが多いです。
今まで 大量データを扱う以外で スプレッドシートが固まることは無かったんですが、再帰計算は よっぽど負荷が高いんでしょうか。
まさに、無量空処 でオーバーヒート状態w これには 要注意です。
とりあえず、この再帰処理の記述を使って A7 の REDUCEの式を置き換えてみよう! というお題をいってみましょう。
自信がある(使ったことある)人は自力でやってみましょう! (これは 自由度が高いんで 式の文字数は指定なしです)
↓↓↓
回答は以下
↓↓↓
A10. LETとLAMBDAの再帰式で繰り返し処理
![](https://assets.st-note.com/img/1691242116746-7PFHchrk4Y.png?width=1200)
=LET(a,LAMBDA(b,c,d,e,
IF(e,b(b,{c;SEQUENCE(d)},d,e-1),TOROW(c,1))),a(a,,5,3))
一例としてこんな式を作ってみました。
LAMBDA 内は
b は LAMBDA式 自身
c は 一つ前の処理の結果 (初期値は 空白としている)
d は 1~5 の 5 を格納 (SEQUENCE(d) で縦並びの連番を生成)
e は 繰り返し回数の 3 (処理毎に e-1で 減っていく)
実際の処理は
{c;SEQUENCE(d)}
ここですね。 1つ前のループの結果 cに SEQUENCE(d) 1~dまでの縦並びの連番を 中カッコと ; で縦方向に連結しています。
ループ回数は e-1の部分で制御しています。eが 0になったら FALSE扱いで IF分岐でループを抜けて最後に TOROW(c,1) で横並びに変換して 先頭の空白を除去しています。
![](https://assets.st-note.com/img/1691284774715-XKCcr3bEEF.png?width=1200)
今回の使い方は 再帰というよりは、プログラミングの for ループ
for(i=3; i>0; i--){…. }
に近いものですが、なんとなく挙動は理解できましたでしょうか?
再帰式が活かせるケースとしては、素因数分解などがありますが、これがまた作るのも説明もかなり難しい・・・。
以上、特級クラスの 回答 4つでした。
新関数が使えると 出来ることが広がる
A2で 回答した INDEX、MOD、SEQUENCEで作った式が 34文字 なのに対して、最後の A10 の回答 LETとLAMBDAの再帰式だと 77文字。倍以上ですねw
もちろん、今回のお題は こんな複雑な式を使う必要は一切ありません。
新関数をフル活用した 様々なアプローチを通じて、新関数の理解を深めるきっかけや新関数の可能性を感じる機会れば良いなってのが、今回の noteの趣旨です。
Excelでは 買い切りインストール版の利用者が多く、XLOOKUP以降の新関数、特にLAMBDAに関しては 365と オンライン版しか使えず、まだまだ一般の Excelユーザーには 新関数は浸透していません!
互換性の問題もある為、他の人に送ったり 共有する可能性がある Excelブックでは 新関数を使うべきではない!という 謎マナーまであったりします。
一方、Googleスプレッドシートは 関数に関しては 無料ユーザー含め 全員が 同じ最新関数が使えるという点が強みです。
イチ早く新関数をマスターして、シート上で出来ることを広げていきましょう!
次回は関数じゃなくて、GASか機能的なネタにしようかな~。
いいなと思ったら応援しよう!
![mir](https://assets.st-note.com/production/uploads/images/85302011/profile_6bb7e63e3aff027fa87115b6d37e1556.jpg?width=600&crop=1:1,smart)