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

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

    GASが絡んでくるず ややハヌドル䞊がっお重めのネタになっちゃうので、シヌト関数のみで実珟できる小ネタも挟んでいきたしょう。今回は 関数でカレンダヌ生成です。結局は曞いおたら 1回じゃ収たらなくお党3回なんですが・・・。

    ちなみに 1行数匏 ずいう蚀い方ですが、1぀のセルにだけ匏を入れるずいう意味合いです。


    Q1. A1セルに幎を入れたら、A2以降に その幎の日付カレンダヌを展開させたい

    画像
    簡単なカレンダヌ

    ずりあえずは簡単なお題からいきたしょう。

    瞊䞊びに衚瀺させる幎間カレンダヌです。もちろん1行数匏なので、A2セルにのみ関数を入れるこずが前提です。あずは、なるべくシンプルな蚘述の方がカッチョむむですよね。

    たずは自分でお題に察する答えを考えおみたしょう。

    Googleスプレッドシヌトは、い぀でもどこでも、パ゜コンなくおも䜿えるんで、特に関数系ならサクッず怜蚌できるのも魅力です。



    ↓ここから回答です。


    A1.1行数匏で䜜る瞊1列の 幎間カレンダヌ

    耇数のアプロヌチがありたすが、以䞋の匏が䞀番シンプルじゃないでしょうか

    匏を入れお動かしおみよう

    =SEQUENCE(337+DAY(DATE(A1,3,0)),1,DATE(A1,1,1))

    解説の前に動かしおみたしょう。展開されるA2以降は、事前に衚瀺圢匏を「日付」ずしおおく必芁がありたす。

    画像
    地味だけど動いおる

    画像だず「3行じゃん」っおツッコたれそうですが・・・。

    安心しおください。1行ですよ
    画像で芋やすくするために 数匏内で改行を入れおるだけです。

    幎の郚分が倉わるだけなので動きが地味ですが、「うるう幎」の2020幎の堎合は、しっかり1行増えお 366日ずなっおいるのがわかりたす。


    今回の匏のポむント

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

    1. 日付デヌタはシリアル倀ずいう数倀であるこずを理解する

    2. 連番を配列で返す SEQUENCE関数

    3. DATE関数の匕数を制する



    ポむント1.日付デヌタはシリアル倀ずいう数倀であるこずを理解する

    たず、ここが理解できおいないず スプレッドシヌト䞊で日付を扱えたせん。
    恐らくはきちんず理解しおいなくおも、

    A1 に 2022/09/01 っお日付が入っおいたら、
    䞋のセル A2 に = A1+1 で 2022/09/02 (翌日) ずなる。

    こんな凊理は、なんか䜿ったこずがあるっお人も倚いんじゃないでしょうか

    Googleスプレッドシヌトの堎合は、数倀 1を 1899/12/31 ずしたシリアル倀を利甚しおいたす。わざわざ 「Googleスプレッドシヌトの堎合は」ず蚀っおるのは、Excelだず 1を 1900/01/01 ず定矩しおいるからです。

    画像
    1899/12/30 以前の日付は マむナスのシリアル倀ずなる

    1日経過を+1ずしおおり、1日より小さい単䜍、
    たずえば 1時間だず 1/24 = 0.04166
. ← 1÷24
    1 を24時間で割った倀、぀たり1以䞋の 少数になっおきたす。

    でも、開始の 1に察応する日付が ExcelずGoogleスプレッドシヌトで違うなら、 本日 蚘事䜜成の日 2022/09/21 のシリアル倀は ExcelずGoogleスプレッドシヌトで ズレおるの

    ず疑問に思うかもしれたせんが、

    画像
    DATEVALUEの挙動が Excelず違うのを知らんかった。

    これは 同じ 2022/09/21 = 44825 なんですねヌ。
    ※ ちなみに䞊蚘は DATEVALUE関数を䜿っおたすが、衚瀺圢匏を「数倀」にかえれば日付はシリアル倀になりたす。

    スタヌトが違うのに1ず぀増えおいったら、なぜか同じに

    「時を飛ばした、だず」

    キングクリムゟンを発動させたわけではありたせん。
    これは、Excel偎には 疑惑の1900幎うるう幎が存圚するからです。

    その蟺りは、かなりこがれ話になっおくるので ここでは割愛したす。

    興味がある人は以䞋のようなたずめおくれおる方のサむトをお読みください。

    ずりあえずは、日付(カレンダヌが連番である ずいう理解があれば、
    ポむント2で SEQUECEずいう関数を䜿う理由がわかるはずです。


    ポむント2.連番を䜜る SEQUENCE関数

    SEQUENCEは 連番を生成する関数で、いわゆる自動で他のセルに展開されるスピる系の関数です。

    初心者向けの郚分、SEQUENCEずは DATE関数ずは ずいった単䜓の関数の基本的な理解に぀いおは割愛しおたす。ご了承ください。その郚分は公匏ペヌゞなり、他に解説しおるサむトなりで孊べたすので。

    =SEQUENCE(337+DAY(DATE(A1,3,0)),1,DATE(A1,1,1))

    ポむントの2぀目が、よりシンプルな匏にする為に ARRAYFORMULA や ROWを䜿わずにSEQUENCE のみで展開郚分を凊理しおいる点です。

    個人的に SEQUECE は奜きな関数のベスト10に入るレベルの掚しカン掚しの関数で、これだけで党3回くらい蚘事曞けちゃうくらいネタがありたす

    SEQUENCEの蚭定を

    行数  ・・・ その幎の日数
    列数  ・・・ 1
    開始倀 ・・・ その幎の 1月1日

    ずすれば良いだけ。

    極論を蚀っおしたえば、幎間カレンダヌ䜜成は、
    =SEQUENCE(366,1,DATE(A1,1,1))
    でも良いんです。うるう幎を考慮しお 366ずしおたす

    これでA1の幎の 1月1日から 自動で 366日分䞋に展開されたす。
    Excel颚に蚀うず スピりたす

    ただし䞊蚘だず、うるう幎ではない365日の普通の幎は、翌幎の 1月1日たで衚瀺されちゃいたす。これをIFで消し蟌んでもいんですが、そうするず結局 ARRAYFORMULAも䜿うこずになるし、ちょっずカッコ悪いですよね。



    ポむント3.DATE関数の匕数を制する

    この日数倉動を制埡するのがポむントの3぀目、「うるう幎」察応の郚分です。

    337 + DAY( DATE( A1 , 3 , 0 ) )

    この匏の 337っおなんだ っお感じですが、
    この郚分は元々

    365 + ( DAY( DATE( A1 , 3 , 0 ) ) - 28 )

    ずいう匏の 、蚈算できる数字郚分を 365-28 = 337 ずたずめたものです。
    ※今回はいかに短くするかを远求しおたすが、この手の蚈算は実際は たずめない方が良いです。

    では、 365 + ( DAY( DATE( A1 , 3 , 0 ) ) - 28 ) は䜕を珟わしおいるのか

    365は基本ずなる 1幎の日数 365日なので、それ以倖の郚分を芋おいきたしょう。

    匏が入れ子になっおいる堎合は内偎から芋おいくのが基本です。

    たず、DATE( A1 , 3 , 0 ) は、A1の幎 の3月0日、぀たりは 3月1日の1日前、うるう幎に圱響を䞎える 2月の最終日を返したす。

    月末を取埗する関数は EOMONTH があるので、これを䜿っおも良いのですが、幎の数倀から 2月末を取埗しようずするず、

    EOMONTH( DATE( A1, 2, 1), 0 ) ずか
    EOMONTH( DATE( A1, 1, 1), 1 ) っお匏になるんで、

    結局DATE䜿うを絡たせる必芁があるんで、長くなっちゃいたす。

    DATE関数の 3番目の匕数 は 日付を衚す数倀を入れる箇所なんですが、実はここは意倖ず自由で、131 に瞛られるこずなく 今回のように 0だったり、マむナスの数倀だったり、100だったりを入れおもいいんです。

    ちゃんず 幎、月が連動した結果になりたす。日付のシリアル倀を返すんで圓然ちゃ圓然なんですが 䟿利ですね。

    うるう幎 は、2月の日数が1日増えるので、

    A1が 2022普通の幎なら DATE( A1 , 3 , 0 ) → 2022/02/28
    A1が 2020うるう幎なら DATE( A1 , 3 , 0 ) → 2020/02/29

    ずなりたす。

    ここから、 DAY関数で 日にちの郚分の数倀、䞊のケヌスであれば 28 ず29 だけ取り出したす。

    この数倀を うるう幎ではない 普通の幎の 2月の最終日の数倀 28 でマむナスするこずで、

    A1が 2022普通の幎 なら ( DAY( DATE( A1 , 3 , 0 ) ) - 28 ) → 0
    A1が 2020うるう幎なら  ( DAY( DATE( A1 , 3 , 0 ) ) - 28 ) → 1

    ずなりたす。この結果を加算するこずで、うるう幎の際の 365日 → 366日 を切り替えおいるのです。



    別解もあるよ

    今回の瞊1列の幎間カレンダヌは、ポむント2で解説した DATE関数の特性をいかしお、DATE の日 の郚分の第3匕数をSEQUENCEにするずいう方法でも実珟できたす。

    =ARRAYFORMULA(DATE(A1,1,SEQUENCE(337+DAY(DATE(A1,3,0)))))

    この堎合、DATE関数は 匕数に配列をずれない為、ARRAYFORMULAを組み合わせる必芁がありたす。

    匏は少し長くなりたすが、こちらだず セルの曞匏蚭定を日付 ずする準備が䞍芁で、自動で日付衚蚘で結果を返しおくれるずいう利点がありたす。

    Excelスピル察応の堎合は Arrayformulaなしで展開されるので、
    =DATE(A1,1,SEQUENCE(337+DAY(DATE(A1,3,0))))
    こっちの方がシンプルで良いかもしれたせん。



    応甚線タテ1列の1ヵ月カレンダヌの生成

    では、幎ず月を指定した 瞊1列の月カレンダヌの堎合はどうでしょうか

    画像

    幎間カレンダヌず考え方は䞀緒です。
    SEQUENCEで、

    行数  ・・・ その月の 日数
    列数  ・・・ 1
    開始倀 ・・・ その月の1日

    ずするだけです。

    A1セルに 幎、B1セル に 月 、の数倀が入っおるずしたら、 月末の日付を DATE(A1,B1+1,0) で取埗、そこからDAYで日数を取埗すればよいです。

    =SEQUENCE(DAY(DATE(A1,B1+1,0)),1,DATE(A1,B1,1))

    これは難しくないですよね



    1行数匏カレンダヌシリヌズの初回だったので、我ながら芪切めな解説 そのせいでシンプルな瞊1列のカレンダヌなのに長くなっおしたった。。どこたで解説したらいいか難しいですね。

    1行数匏による 瞊1列の幎間カレンダヌ䜜成は、理解できたでしょうか

    ただ、このシンプルな瞊䞊びカレンダヌなら、

    A2 に =DATE(A1,1,1)
    A3 に =A2+1

    ず入れお、
    䞋にオヌトフィルでばばヌっずやっお、バヌン関西おっちゃん颚
    でも良いわけで、あたり匏を組む䟡倀がありたせん。

    Q2.A1セルに幎を入れたら、日曜始たり土曜終わりの 7日間ず぀衚瀺させる幎間カレンダヌを生成したい。

    画像
    ずりあえずこんな感じのむメヌゞ

    せっかくなら、暪方向に 日曜始たり土曜終わりの 7日間ず぀折り返しお衚瀺させるカレンダヌを 1行数匏で実珟したいず思いたす。

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



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


     
     

    mir

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

    あなたぞのおすすめ