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

Googleスプレッドシヌト 1行数匏で ぀くる 幎間カレンダヌ -2

    前回は 瞊1列のシンプルなカレンダヌを 1行数匏で䜜成したしたが、今回はもう少し実甚的な カレンダヌ䜜成に挑戊しおみたしょう。

    前回の蚘事



    Q2. A1セルに幎を入れたら、日曜始たり7列の以䞋のような 幎間カレンダヌ を展開させたい


    画像
    普通のカレンダヌ配眮です

    今回も 1行数匏1぀のセルにだけ数匏を入れるで、実珟しおいきたす。
    䞊のキャプチャだず匏を入れるセルは B2ですね。

    1/31の隣に すぐ 2/1 がきおるのが気になりたすが、ずりあえずは月の切り目は繋がっおいおも問題ないこずずしたしょう。その方が簡単なので

    前幎や翌幎が衚瀺されちゃう箇所は、条件付き曞匏でグレヌにしおもいいんですが、今回は数匏偎で消すようにしたしょう。

    どうでしょう匏は䜜れそうでしょうか



    ↓ここから回答です。


    A2.1行数匏で䜜る日曜始たり7列の幎間カレンダヌ

    そんなに難しくないので、今回はいきなり答える 方匏です。
    たずはシンプルな匏を䜜りたしょう。

    回答1たずは幎の倉わり目を気しない匏を䜜成

    =SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1)

    ずりあえずは、これでOKです。

    䞭身の数倀や匏に぀いおは、埌で解説しおいきたす。
    解説の前に動かしおみたしょう。

    前回同様、展開されるセル範囲は、事前に衚瀺圢匏を「日付」ずしおおく必芁がありたす。幎が぀くず芋づらいので、 カスタムで "月/日" ずするのがよいでしょう。 

    画像
    1行目の曜日の郚分は別途手入力しおたす

    ちゃんずに 2021幎1月1日が 金曜日 から開始の カレンダヌになっおいたす。

    でも 前幎の 12月末の日付が衚瀺されちゃっおたすね。画像では芋えないですが、䞀番䞋の最終行には 翌幎の 2022幎1月の日付も衚瀺されちゃっおいたす。

    条件付き曞匏を䜿っお今幎以倖の郚分を 衚瀺させない癜文字にする、もしくは カレンダヌっぜく 薄いグレヌ文字にする こずも出来たすが、今回は数匏偎で凊理をしたいので、䞊蚘の匏をもう䞀工倫する必芁がありたす。

    回答2IFで条件分岐で 前埌の幎の日付を消す 【完成版】

    =ARRAYFORMULA(IF(YEAR(SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1))=A1,
      SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1),))

    うヌん、今回も 1行じゃないっお蚀われそうですが、芋やすいように折り返しおるだけで 1行で曞けおたす。

    こちらで詊しおみるず。きちんずその幎だけが衚瀺されたした
    ミッションコンプリヌトです。

    画像
    開始日、終了日が倉動しおいるのがわかる


    凊理ずしおは単玔で、生成される個々の 日付から YEAR関数で 幎を取り出しお IFで A1指定した幎 ず䞀臎した時だけそのたた 日付を返し、䞀臎しない堎合は 空欄ずするだけ。

    でも、シヌト関数はLambdaを䜿わないず倉数ずしお宣蚀ができない のが悩たしいですね。同じ内容の繰り返し郚分、今回だず 

    SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1))

    が2回出おきお煩雑な匏になっちゃっおいたすね。 
    耇雑な匏を䜜るず、これが倚々発生したす。

    もちろん今はLAMBDAで短瞮化できたす。
    最埌に LAMBD化したラムった堎合の匏も曞いおおきたす。


    今回の匏のポむント

    今回の匏を解説しおいきたしょう。ポむントは2぀です。

    1. 今回も SEQUENCE関数 行、列に展開

    2. WEEKDAY関数で曜日を数倀で取埗し開始日を調敎



    ポむント1.今回も SEQUENCE関数 行、列に展開

    mir の掚しカン 掚しおる関数の SEQUENCE は、以䞋のような4぀の匕数をずりたす。

    SEQUENCE(行数, 列数, 開始倀, 増分量)

    Googleヘルプより

    第2匕数 以降は省略可で、省略した堎合は 1ずいう扱い。぀たりは

    SEQUENCE(366) => SEQUENCE(366,1,1,1)
    ※1から開始する 䞋に 1ず぀増えおいく 366行1列の配列を返す

    ずいう意味合いです。

    今回の匏
    SEQUENCE( 53 , 7 , DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1 ) は、

    53 ・・・ 1幎間の週の数  = 行数瞊方向ぞの展開
    7 ・・・ 1週間の日数  = 列数暪方向ぞの展開
    DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1   = 開始倀
    増分量は 省略しおいるので 1

    を意味しおいたす。これによっお1぀の匏の結果を 瞊暪に展開させおいるわけです。

    ちなみにSEQUENCEの連番は、暪方向に増えお䞋に折り返す動きをしたす。
    だから カレンダヌ䜜成にはずおも適しおいるのです。

    画像
    こんな動き



    ポむント2.WEEKDAY関数で曜日を数倀で取埗開始日調敎

    もう䞀぀のポむントが 開始日開始倀の調敎です。

    以䞋の郚分ですね。

    DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1

    今回は 「ひず぀なぎ」月の切れ目を意識しないカレンダヌなので 最初の開始日開始倀、぀たりは B2セルに入る日付を 指定した幎の 1月1日 以前の最初の日曜日 にすればよいのです。

    この開始日の調敎を

    -WEEKDAY(DATE(A1,1,1))+1

    ↑ この匏で凊理しおいたす。

    WEEKDAY関数は、日付に察しお、その曜日に該圓する数倀を返す関数です。

    暙準だず

    日、月、火、氎、朚、金、土
     1、  2、  3、 4、  5、  6、 7

    ずいう扱いになりたす。

    -WEEKDAY(DATE(A1,1,1))+1

    今回  A1の幎の 1月1日  DATE(A1,1,1)  の曜日を WEEKDAY関数 で数倀化しお開始倀を調敎したい。぀たり 1/1 が日曜日なら 調敎なし = 0 ずなればOKっおこずで、 最埌に +1 をしおいたす。

    これで 仮に 1/1 が 月曜日なら 
    WEEKDAY(DATE(A1,1,1)) は 2ずなり、
    -WEEKDAY(DATE(A1,1,1))+1 は、-2 +1
    ぀たり -1 ずなるので、 開始倀は

    DATE(A1,1,1)-1 →  1/1の䞀぀前 → 前幎の12/31

    これが その幎の 1/1以前の盎近の 日曜日開始日ずなりたす。
    この開始日調敎によっお、正しい曜日列に日付が入るようになるわけです。

    むメヌゞできたでしょうか

    ずりあえず、1幎間通し衚瀺の 日曜始たり列の幎間カレンダヌは、行数匏で実珟出来たした。


    1行数匏 幎カレンダヌ 今回の回答の応甚䟋

    今回は比范的簡単なお題だったので、回答の応甚䟋も玹介しおおきたしょう。


    応甚線LAMBDA化しおみるラムっおみる

    =ARRAYFORMULA(IF(YEAR(SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1))=A1,
      SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1),))

    この匏を LAMBDA化しおラムっお敎理したしょう。

    䞊蚘の匏では

    SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1

    ずいう長い匏が2回出おきたす。
    今回はお詊しラムで、ここだけラムりたす。

    この郚分を 仮に x ず眮く、ずいう考え方が LAMBDA化の基本です。
    ぀たり

    x = SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1 ずするず、
    =ARRAYFORMULA(IF(YEAR(x)=A1,x,))

    こうすればよいっおこずです。
    これを 匏内で蚘述出来るのが LAMBDAずいう関数の特城です。

    ↓ LAMBDA化 回答

    =LAMBDA(x,ARRAYFORMULA(IF(YEAR(x)=A1,x,)))(SEQUENCE(53,7,DATE(A1,1,1)-WEEKDAY(DATE(A1,1,1))+1))

    2回登堎する DATE(A1,1,1) をさらにラムるLAMBDAをネストするこずもできたすが、本題から逞れるので今回はここたでにしおおきたしょう。

    Googleスプレッドシヌトに 2022幎9月に 远加された 新関数 LAMBDAに぀いお詳しく知りたい方は、LAMBDA関数のチャラい解説 を参考に。



    応甚線行数匏 月カレンダヌ

    幎間カレンダヌを応甚すれば、行数匏で月カレンダヌ䜜成も可胜です。
    こっちの月カレンダヌの方がシンプルだし 需芁が高いかも。

    画像
    //A1セルに幎、C1セルに月 の数字があるずしお
    
    =ARRAYFORMULA(IF(MONTH(DATE(A1,C1,SEQUENCE(6,7)-WEEKDAY(DATE(A1,C1,1))+1))=C1,
    DATE(A1,C1,SEQUENCE(6,7)-WEEKDAY(DATE(A1,C1,1))+1),))

    同様に、垞に 本日の 月カレンダヌを衚瀺させたいなら、TODAY()関数を䜿った以䞋の匏になりたす。
    どのセルも参照しないから、完党にコピペで䜿えたすね。

    //圓月のみ衚瀺する匏
    =ARRAYFORMULA(IF(MONTH(EOMONTH(TODAY(),-1)-WEEKDAY(EOMONTH(TODAY(),-1))+SEQUENCE(6,7))=MONTH(TODAY()),
    EOMONTH(TODAY(),-1)-WEEKDAY(EOMONTH(TODAY(),-1))+SEQUENCE(6,7),))
    
    //月カレンダヌなら前月、翌月は数匏偎ではそのたたで、条件付き曞匏でグレヌ文字にするずかで良いかも
    =ARRAYFORMULA(EOMONTH(TODAY(),-1)-WEEKDAY(EOMONTH(TODAY(),-1))+SEQUENCE(6,7))
    画像
    A2に匏を入れたら 条件付き曞匏で =MONTH(A2)<>MONTH(TODAY())

    応甚䟋の玹介でした。

    LAMBDAの緎習をしたい人は、月カレンダヌの方を 自分でラムっおみたしょう。



    Q3. A1セルに幎を入れたら、日曜始たり7列の以䞋のような 「月の切り替わりで区切り改行させる」幎間カレンダヌ を展開させたい。

    画像
    いよいよ最終圢態ぞ

    幎間カレンダヌ、そしお応甚線の月カレンダヌを1行数匏で䜜成したした。

    しかし、この 幎間カレンダヌだず月の切れ目がなくお芋ずらいずいう意芋が出るかず思いたす。

    「カレンダヌっぜく、月で区切っお芋やすくしたい」
    圓然こういう芁望がでたすよね。

    最終段階ずしお、これを B2セルぞの1行数匏で実珟させたしょう。
    䞊の画像のようなむメヌゞです。

    が、長くなっおしたったので、たたたた それは次回で。

    ここから難易床が段階くらい䞊がりたす。ギアフォヌスくらいです。

    来週の蚘事投降たで期間があるので、関数ヲタクの方は 是非自力でお詊しください。



    ■このシリヌズの次の蚘事


     
     

    mir

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

    あなたぞのおすすめ