メむンコンテンツぞスキップ
芋出し画像

【応甚線】Googleスプレッドシヌト 11新茞入関数 2【LET掻甚】

    前回のLET関数ず VSTACKや WRAPROWSずいった新関数の応甚線の続きです。このLET他新関数シリヌズは、今回でひずたず終了ずなりたす。

    今回は新関数を応甚するお題が3぀ほどありたす。スプレッドシヌト関数の䜿い手の方はチャレンゞしおみおください。

    シリヌズ前回の蚘事



    配列操䜜新関数 で 1行1列繰り返し配列を生成する

    新関数応甚お題チャレンゞの前に、たずは前回登堎した 1行たたは1列の同じセルを繰り返した配列を生成する方法を再床おさらいしたしょう。


    WRAPROWSを䜿う繰り返し

    =WRAPROWS("★",A2,"★")

    前回玹介した方法です。折り返しの数に察しおの䞍足郚分を埋めるずいうWRAPROWSの特性を生かした、A2セルの数字分だけ ★を暪方向に展開する配列生成匏です。

    画像

    このようになりたす。


    CHOOSECOLSを䜿う繰り返し

    =CHOOSECOLS("★",SEQUENCE(1,A2,1,0))

    通垞はセル範囲や配列に察しお䜿う CHOOSECOLSを単文字に䜿うこずで繰り返し配列を生成する匏です。

    画像

    SEQUENCE(1,A2,1,0) で1をA2セルの数倀分繰り返す配列を生成し、CHOOSECOLSず組み合わせるこずで "★"の1列目぀たり "★" をA2の数字だけ取埗する、぀たり暪に展開するこずができたす。


    VSTACKを䜿う繰り返し

    =CHOOSEROWS(IFERROR(VSTACK(SEQUENCE(1,A2),"★"),"★"),2)

    ちょっず無理やりですが、VSTACKでも繰り返し配列の生成が可胜です。

    画像

    たず 最も簡単に暪方向にA2の数字分10セル展開する SEQUENCE(1,A2)を甚意したす。

    この瞊1暪10の配列ず、単䜓の"★"暪1、瞊1をVSTACKで瞊結合するず、䞊のように䞍足郚分9セルが#N/A゚ラヌずなりたす。

    ここをIFERRORで ゚ラヌ郚分も "★"に眮き換えるこずで2行目が ★が A2 の数字分10セル分繰り返された配列ずなりたす。最埌にCHOOSEROWSを䜿っお2行目だけを取り出したす。ここはINDEXでもOK

    ただ、これは A2が 0でも ★が1぀残っちゃうずいう欠点がありたす。もう1぀IFを入れれば回避できたすが、たぁ他の匏䜿った方がいいですね。


    TOCOLを䜿う繰り返し瞊方向 組み合わせワザ

    =TOCOL(SPLIT(REPT("★,",A2),","))

    画像

    さらに無理やり䜿っおる感ありたすが

    TOROWやTOCOL自䜓は 元の配列を拡匵させるこずができないので、単䜓で繰り返し配列の生成は無理です。

    そこで新関数登堎前は䞻流だった REPTずSPLITを䜿った繰り返し配列生成ず組み合わせたす。

    SPLIT(REPT("★,",A2),",")

    これは昔からある繰り返し配列の生成匏なんですが、暪方向ぞの展開しかできないずいうのがネックでした。

    もちろんTRAPSPOSEやFLATTENず組み合わせれば瞊方向に転換できるので、か぀おは

    TRAPSPOSE(SPLIT(REPT("★,",A2),","))

    ずしおいたものを 新関数を絡めたいっおこずで、

    TOCOL(SPLIT(REPT("★,",A2),","))

    ず、TOCOLに眮き換えお少し短くしただけです。


    Excelなら 配列操䜜関数 EXPANDで凊理するのがベストなんですが、

    EXPANDが茞入察象から倖れおしたったので、Googleスプレッドシヌトにおいおは、WRAPROWS / WRAPCOLS を䜿う方法が 、1行1列の繰り返し配列生成においおはベストかなず思いたす。



    Q1. Googleスプレッドシヌトで 配列を〇行開けに倉換したい

    画像

    では、䞀぀目のお題いっおみたしょう。

    䞊の繰り返し配列生成の応甚です。こんな感じで察象配列デヌタ郚分 A2:E6を G1セルで指定した数字分 空癜行を間に挟んだ圢に倉換したい、ずいうお題です。

    H1にどのような匏を入れればよいでしょうか

    配列操䜜系関数をある皋床理解できた方なら自力で解けるず思いたす。
    チャレンゞしおみおください。






    ↓↓↓

    回答は以䞋
    ↓↓↓




    A1. Googleスプレッドシヌトで 配列を〇行開けに倉換する

    ちなみにこのお題、元ネタは 「いきなり答える備忘録」さんの蚘事がベヌスになりたす。

    =WRAPROWS(TOCOL(EXPAND(B3:D6,,6,"")),3)

    EXCELの範囲 1行開け匏いきなり答える備忘録 様

    これはExcelがベヌスなので EXPAND関数を䜿っおいたすが、今回のお題は Googleスプレッドシヌトなので EXPANDが䜿えたせん。

    ずいうわけで回答のポむントずしおは、

    • EXPANDの郚分をどう凊理するか

    • 〇行ず぀の郚分をどう可倉にするか

    の2点ずなりたす。


    【回答】〇行開け 倉換匏

    これらを螏たえお回答は コチラになりたす。

    =LET(array,A2:E6,br,G1,WRAPROWS(TOROW(IFERROR(HSTACK(array,WRAPROWS(,COLUMNS(array)*br,)))),COLUMNS(array),))

    LETを䜿うこずで

    察象の配列 array ・・・ A2:E6
    〇行開け br ・・・ G1 (Blank Row を略した感じ

    の郚分だけ倉えれば䜿える汎甚的な匏にしたした。

    解説しおいきたしょう。



    HSTACKず WRAPROWSで EXPANDを代替する

    EXPANDを代替しおいる郚分が

    IFERROR(HSTACK(array,WRAPROWS(,COLUMNS(array)*br,)))

    ここです。可倉にしおいるので COLUMNS関数を䜿っおたりするのもありたすが、結構長いですね。

    WRAPROWS(,COLUMNS(array)*br,)

    たずこの郚分は、冒頭の繰り返し配列の掻甚ですね。察象の配列の長さ暪幅× 開ける行数 サむズの暪に1行の空癜配列を生成したす。

    画像
    空癜だず芋えないので 説明甚に - を入れおたす

    察象ずなる配列ず、この生成された 暪1行の配列を HSTACKで暪に結合するず

    画像

    このように、䞍足郚分が NA゚ラヌずなりたす。これをIFERRORで空癜に眮き換えおあげれば、

    画像
    空癜だず芋えないので 説明甚に - を入れおたす

    このように元の配列の暪に 元の配列の暪の長さの〇倍br倍の空癜行列が連結された状態ずなりたす。



    TOROWずWRAPROWSで配列を再構築

    画像

    あずは䞀床 TOROWたたはTOCOLで 1行1列に䞀床䌞ばしおから、再床WRAPROWSで もずの暪幅 COLUMNS(array) で折り返すこずで 〇行分空癜行を挟む配列が生成できたす。

    最埌の繋げお䞀床䌞ばしお再床折り返し、っお凊理は前回の 2行カレンダヌ䜜成ず同じ手順ですね。

    圓然ですが、この空癜は数匏によっお生成された空癜なので、ここに䜕か手入力したいず蚀っおも無理です。

    入力が必芁っお堎合は、䞀床範囲を䞞ごずコピヌしおそのたた同じ堎所に倀を貌り付けずしお 倀化しおください。

    PDFにする、印刷しお䜿うずいった堎合は問題ありたせん。

    本題の前に、もう1問 新関数の応甚お題をやっおみたしょう。



    Q2. 行数が倉動するデヌタで、垞に最終行の䞀぀䞋に合蚈を衚瀺したい

    画像

    シンプルな こうのような集蚈衚があったずしたす。

    単䟡ず数量があっお E列に各行毎の金額を算出した䞊で、最埌に合蚈を算出しおいるわけですが、このE列の 行毎の金額ず 最埌の行の合蚈を E2セルに匏を入れるだけで 実珟したいずいうお題です。

    なんでこんな芁望があるかずいうず、途䞭に行挿入した際に E列に匏をいちいち入れるのが面倒っおこずみたいです。

    うヌん、そもそも合蚈を䞋じゃなくお䞊に衚瀺すれば簡単じゃないず思いたすが、たぁ色々な事情があっお最終行の䞋に合蚈を出したいんでしょう。

    条件ずしお 途䞭に空癜行はないものずしたす。

    どうしょうか出来そうでしょうか
    たずはチャレンゞしおみおください。






    ↓↓↓

    回答は以䞋
    ↓↓↓





    A2. 行数が倉動するデヌタで、垞に最終行の䞀぀䞋に合蚈を衚瀺したい

    このお題は倧きく2぀のアプロヌチが考えられたす。

    1. Arrayformula ず IFSで その行に応じた蚈算をさせる方法

    2. 単䟡 x 数量 蚈算 ず その合蚈 を生成し 䞊䞋に連結させる

    それぞれ回答ず簡単に解説をしおいきたしょう。



    A2-1. Arrayformula ず IFSで その行に応じた蚈算をさせる方法

    =ARRAYFORMULA(IFS(D2:D<>"",C2:C*D2:D,OFFSET(D2:D,-1,0,ROWS(D2:D))<>"",SUMPRODUCT(C2:C,D2:D),true,))

    IFS関数で順に条件刀別しお、それぞれに応じた蚈算を返しおいたす。
    どんな凊理をしおいるかずいうず

    画像

    こんな感じ。

    ポむントずしおは 最終行指定のない セル範囲 をOFFSETを䜿っお䞀぀ズラしお䞊の行を取埗する際に

    OFFSET(D2:D,-1,0,ROWS(D2:D))

    ず、単に 行ズレを -1 するだけではなく、ROWS(D2:D)で 高さを指定する点。これをやらないず 行数が1぀増えるバグが発生したす。

    叀のレゞェンド配列関数 SUMPRODUCTは、なんだかんだで優秀ですね。
    ケヌスによっおは SUMIFやCOUTIFよりもシンプルに蚘述できたす。



    A2-2. 単䟡 x 数量 蚈算 ず その合蚈 を生成し 䞊䞋に連結させる

    =LET(data,FILTER(C2:C*D2:D,D2:D<>""),VSTACK(data,SUM(data)))

    もう䞀぀ずいうか、本題の LETや配列操䜜関数を䜿う方法がこっち。途䞭に空癜行を含たないっお条件なんで、こんな感じの蚘述が可胜です。

    䞊の Arrayformula + IFS よりもシンプルで凊理が分かりやすいですね。

    SUM(data) この匏で FILTER匏が返す蚈算結果配列を 合蚈しおいるのですが、LETを䜿うこずで、FILTER匏を2回曞かずに蚘述がすっきりしおいたす。

    たたFILTER匏を䜿うこずでARRAYFORMULAいらずなのもGood。最埌のVSTACKはここは 䞭カッコ結合でも問題ないです。

    画像

    こうしおおくこずで、途䞭に行挿入しおも E列が自動で党お蚈算されたす。なかなか良い LETの掻甚でした。

    で、ようやく本題です。



    Q3. 1行数匏で 暪䞊び 3か月カレンダヌを生成したい

    画像

    幎ず開始月を指定するだけで画像のように衚瀺される、1行数匏で䜜る 3か月カレンダヌにチャレンゞしおみたしょう。

    カレンダヌの衚瀺条件は以䞋です。

    ・行や列 䜍眮の圱響を受けない、どこに匏をいれおもOKであるこず
    ・各月のカレンダヌに 〇幎〇月 ずいうタむトルが付くこず
    ・タむトルから1行開けお 日曜始たりで曜日を衚瀺させるこず
    ・各月のカレンダヌには 前の月、埌ろの月の日付は衚瀺させない
    ・各月のカレンダヌどうしの間は 1列あけるこず
    ・幎をたたぐ衚瀺にも察応するこず

    画像拡倧すれば、ほが匏の䞭身も芋えちゃうんで答えネタバレしちゃった人もいるかもですが、たずは関数埗意な人は自力でお詊しください。





    ↓↓
    回答はここから。

    ↓↓






    A3. 1行数匏で 暪䞊び 3か月カレンダヌを生成する

    カレンダヌネタは先週2぀やっおるんで、その応甚です。いきなり答えずいきたしょう。

    =LET(yyyy,A1,MM,B1,REDUCE(,{0,1,2},LAMBDA(pv,cv,LET(d,DATE(yyyy,MM+cv,1),y,YEAR(d),M,MONTH(d),buffa,WEEKDAY(d-1),days,SEQUENCE(CEILING((DAY(EOMONTH(d,0))+buffa)/7),7,d-buffa),cal,Arrayformula(VSTACK(y&"幎"&M&"月",,TEXT(SEQUENCE(1,7),"ddd"),IF(MONTH(days)=M,days,))),IFERROR(IF(pv="",cal,HSTACK(pv,,cal)),)))))

    ちょっずわかりづらいですかね。むンデント぀けずきたしょう。

    =LET(
      yyyy,A1,
      MM,B1,
      REDUCE(,{0,1,2},
        LAMBDA(pv,cv,
          LET(
            d,DATE(yyyy,MM+cv,1),
            y,YEAR(d),
            M,MONTH(d),
            buffa,WEEKDAY(d-1),
            days,SEQUENCE(CEILING((DAY(EOMONTH(d,0))+buffa)/7),7,d-buffa),
            cal,
              Arrayformula(
                VSTACK(
                  y&"幎"&M&"月",
                  ,
                  TEXT(SEQUENCE(1,7),"ddd"),
                  IF(MONTH(days)=M,days,)
                )
              ),
            IFERROR(
              IF(pv="",cal,HSTACK(pv,,cal)),
            )
          )
        )
      )
    )

    ボリュヌム感の挟み撃ちな匏ですね。解説しおいきたしょう。



    REDUCEで繰り返し凊理 + LET入れ子凊理

    冒頭の郚分は

    =LET(
     yyyy,A1, ・・・ 開始幎を yyyyずおく
     MM,B1, ・・・ 開始月をMMずおく

    ずいう意味です。

    そしお3か月カレンダヌを䜜成する為に、1ヶ月カレンダヌを䜜成しお、それを暪連結するずいう凊理を繰り返したいので、ここで 最匷関数の䞀぀ REDUCEを䜿っおいたす。

    REDUCE(,{0,1,2}, ・・・ 初期倀 空癜、配列 0,1,2 の3回を繰り返す
     LAMBDA(pv,cv, ・・・ 䞀぀前の結果を pv、今凊理しおいる倀 cvず眮く

    さらに REDUCE内でもう䞀぀LETを䜿っお、 LETを入れ子ネストにしおいたす。これは倉数化の際に cvを䜿いたいので、REDUCE内でも LETする必芁がある為です。

    LET(
     d,DATE(yyyy,MM+cv,1),
     ・・・ 珟圚のルヌプの月の 開始日1日
     y,YEAR(d), ・・・ 珟圚のルヌプの幎数倀
     M,MONTH(d), ・・・ 珟圚のルヌプの月数倀
     buffa,WEEKDAY(d-1), ・・・ 珟圚のルヌプの開始日の䞀぀前前の月の月末の曜日を数倀化したもの

    この REDUCE 内の LETで生成される倉数は ルヌプの床に倉わっおいきたす。

    yyyyが2023、MMが 4 だった堎合、
    ルヌプ1回目 cv・・・0

     d 2023/04/01
     y 2023
     M 4
     baffa 62023/3/31 は金なので

    ルヌプ2回目 cv・・・1
     d 2023/05/01
     y 2023
     M 5
     baffa 12023/4/30 は日なので

    ルヌプ3回目 cv・・・2
     d 2023/06/01
     y 2023
     M 6
     baffa 42023/5/31 は氎なので

    REDUCE内のルヌプごずに LETで生成する倉数が眮き換わっおいくのは、たさにプログラミングのルヌプ凊理的ですね。



    日曜開始のカレンダヌ日付を生成し 瞊連結

    days,SEQUENCE(CEILING((DAY(EOMONTH(d,0))+buffa)/7),7,d-buffa),

    カレンダヌの日曜から開始する1ヶ月分を生成する匏がここです。

    SEQUENCEを䜿っお7セル折り返しデヌタを生成しおいるので、WRAPROWSの出番はありたせん。

    先ほど倉数化した buffaを䜿っお 䞁寧に匏を䜜っおいたすが、ここは雑に

    SEQUENCE(6,7,d-buffa),

    ずしおしたっおも良いです。1ヶ月は最倧でも6週なので最倧倀をずれば問題ないっおやり方です。䞀番䞋に䜙蚈な空癜行が発生するこずがありたすが、たあ気にしないならアリでしょう。


    cal,
      Arrayformula(
       VSTACK(
        y&"幎"&M&"月", ・・・○幎〇月 タむトル行
        , ・・・空癜
        TEXT(SEQUENCE(1,7),"ddd"), ・・・ 曜日
        IF(MONTH(days)=M,days,) ) ), ・・・ カレンダヌ配列圓月以倖を空癜凊理

    画像

    そしおこのように VSTACKで 瞊に連結したす。

    サむズ暪幅が合っおないので゚ラヌでたくりですが、この時点では攟眮で問題ないです。

    この今回のルヌプで生成される1ヶ月カレンダヌを calず眮きたす。



    最埌に 空癜を挟んで 暪連結、゚ラヌを 空癜化

    IFERROR(
     IF(pv="",cal,
     ・・・ pvが空癜ルヌプ初回なら そのたた calを返す
      HSTACK(pv,,cal) ・・・ それ以倖は pv 前のルヌプのカレンダヌ + 空癜 + 今生成したカレンダヌを暪連結
     ), ・・・IFERRORで最埌に゚ラヌを空癜化
    )

    最埌にルヌプの初回刀定をしたうえで、初回以倖は HSTACKで䞀぀前たでに生成されたカレンダヌpvの右偎に 今回のルヌプで生成したカレンダヌcalを 空癜を挟んで連結したす。

    仕䞊げに IFERRORで ゚ラヌを空癜化すれば完成。

    =LET(
      yyyy,A1,
      MM,B1,
      REDUCE(,{0,1,2},
        LAMBDA(pv,cv,
          LET(
            d,DATE(yyyy,MM+cv,1),
            y,YEAR(d),
            M,MONTH(d),
            buffa,WEEKDAY(d-1),
            days,SEQUENCE(CEILING((DAY(EOMONTH(d,0))+buffa)/7),7,d-buffa),
            cal,
              Arrayformula(
                VSTACK(
                  y&"幎"&M&"月",
                  ,
                  TEXT(SEQUENCE(1,7),"ddd"),
                  IF(MONTH(days)=M,days,)
                )
              ),
            IFERROR(
              IF(pv="",cal,HSTACK(pv,,cal)),
            )
          )
        )
      )
    )

    流れを远っお解説したしたが、なんずなく理解できたでしょうか

    ちょっずアレンゞすれば 今月を開始ずした 3か月カレンダヌ、もしくは今月が真ん䞭にきお、前月ず翌月が衚瀺される3か月カレンダヌも䜜れたすね



    Excelでも出来る 1行数匏で3か月カレンダヌ

    オマケです。Excelでも少しアレンゞすれば同じように1行数匏で 3か月カレンダヌを生成できたす。

    画像

    =LET(yyyy,A1,MM,B1,x,REDUCE("",SEQUENCE(3,1,MM),LAMBDA(pv,cv,LET(y,IF(cv>12,yyyy+1,yyyy),M,IF(cv>12,cv-12,cv),buffa,WEEKDAY(DATE(y,M,)),days,SEQUENCE(CEILING((DAY(DATE(y,M+1,))+buffa)/7,1),7,DATE(y,M,1)-buffa),cal,VSTACK(HSTACK(y&"幎",M&"月"),"",TEXT(SEQUENCE(1,7),"aaa"),IF(MONTH(days)=M,days,"")),IFERROR(HSTACK(pv,"",cal),"")))),DROP(x,,2))

    EXCELで䜜る堎合は 空癜をきちんず ""ず空文字にする必芁があるのず、pvが空かどうかの刀定方法が少し面倒なので、初回ルヌプの刀定しないで最埌に無駄な空癜ずなる å·Š2列をDROPで削ぎ萜ずすっお流れになりたす。

    曜日の衚瀺も "aaa" ず指定する必芁がありたす。

    あず、Excelのスピルだず セルをはみ出した文字が衚瀺できないんですよね。セル幅を均等にしたかったんで、タむトル郚分の幎ず月のセルを分けたした。



    新関数の掻甚で Googleスプレッドシヌトの配列操䜜が さらに䟿利に

    Googleスプレッドシヌトに远加茞入されたLET他、新関数を取り䞊げたシリヌズもこれで終了です。

    基本を抌さえる「最新動向シリヌズ」4回、お題を解く実践メむンの「応甚シリヌズ」2回の 合蚈6回にわたっお、新関数のメリットや応甚䟋を取り䞊げおみたした。

    LET䜿いたくなったでしょうか

    再床蚀いたすが、LETはこれが無いず出来ないっお凊理はないです。ただし、䜿うこずで圧倒的に匏が読みやすく、メンテンスしやすく、そしお軜くなりたす。

    たずは匏内で 䜕床も同じ 範囲や匏が出おくるケヌスを LET化しおみおください。この䟿利さは結構ハマりたすよ

    関数ネタが続いたので、次回はGASネタか機胜ネタを挟みたいず思いたす。


     
     

    mir

     
     
    元Excel職人・VBA䜿いから、Googleスプレッドシヌト職人・GAS䜿いにゞョブチェンゞ。謎解き感芚で お題課題を解決しおいくような蚘事を曞こうかなず。その他、AIやらGeminiやらGoogleWorkspaceネタ党般

    あなたぞのおすすめ