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

【番倖線】Googleスプレッドシヌト 幎間カレンダヌ (土日祝を色付けしよう)

    Googleスプレッドシヌトで 1行数匏で カレンダヌを䜜成する方法を å…š3回ず前回の番倖線で曞いおきたした。

    ↓前回の蚘事


    本線の最埌に完成した カレンダヌ関数は、前回の番倖線で LAMBDA、数匏結合、名前付き関数を䜿うこずで、庵野氏もビックリの シン・カレンダヌ関数 に進化したした。

    画像
    匏完成に至るたでの流れは過去蚘事を読んでね

    今回は カレンダヌの芋栄えをよくする為の、 色付けをやっおみたしょう。

    色付け凊理は 関数・数匏ではカバヌできないなので、「番倖線」の扱いずしたした。


    Q1.幎間カレンダヌの 土・日 に自動で色を぀けたい

    画像
    たずは土日から、こんな感じにしたい

    祝日は少しハヌドルが䞊がるので、先に土日の色付けを考えたしょう。
    芁件ずしおは以䞋になりたす。

    ■幎間カレンダヌ 土日色付け芁件
    ・日曜日は 薄い赀で色付けしたい
    ・カレンダヌ1行目曜日行の「日」も同じく 薄い赀にしたい
    ・土曜日は 薄い青で色付けしたい
    ・カレンダヌ1行目曜日行の「土」の同じく 薄い青にしたい
    ・カレンダヌのセル䜍眮が倉わっおも察応させたい

    「条件付き曞匏」を䜿うのはわかりたすね

    カレンダヌの䜍眮が固定なら、範囲の䞀番巊が 日曜日で、䞀番右が 土曜日だから、列を指定しお「空癜でないセル」をそれぞれ色付け蚭定しおあげるだけで超簡単なんですが・・・。

    今回は 列䜍眮が倉わる可胜性があるっおこずなんで、ちゃんずに そのセルの䞭身を条件ずしたカスタム数匏で色付けする必芁がありたす。

    前回たでに比べればだいぶ簡単ですが、土日色付けできそうでしょうか





    ↓ここから回答です。



    A1.幎間カレンダヌの 土・日 に自動で色を぀ける

    画像

    セルの色 や 曞匏 は 関数・数匏ではどうにもなりたせん。
    「条件付き曞匏」ずいう機胜を䜿いたす。

    メニュヌ から 衚瀺圢匏 > 条件付き曞匏 を開きたしょう。


    「条件付き曞匏」 EXCELずの比范

    mirは Googleスプレッドシヌト職人で 掚進掟なんですが、それでも Excelに比べお Googleスプレッドシヌトが䞍䟿だなず感じる点が幟぀かありたす。

    グラフ回りやビゞュアル系 に加えお、この「条件付き曞匏」もGoogleスプレッドシヌトが Excelに比べ 匱い郚分の䞀぀です。

    画像
    Excel2019ずの比范

    比范しおみるず、EXCEL偎から「圧倒的じゃないか、我が軍は」ず聞こえそうなくらい差がありたすね。

    Googleスプレッドシヌトの 条件付き曞匏は、EXCELに比べ 出来るこずが少ない かなり限られおいるのです。

    EXCELでシヌトカレンダヌを䜜ったずきは、 1ヶ月が6週あるずきは 枠線を拡匵させたり、 1日だけ 月/日ずいう衚瀺 にしお他は日付のみにしたり、文字サむズを条件に応じお倉えたり、色々できたしたが・・・。

    画像
    無料のExcelオンラむンでもスプシより倚機胜

    他にも 条件付き曞匏関連で䞍満があるのですが、それは埌述したす。

    ずりあえず、衚瀺圢匏、文字サむズ・フォント、眫線回りなどの 出来ないこずは諊めお、Googleスプレッドシヌトで出来るこずをやりたしょう



    条件付き曞匏を䜿っおみよう

    土、日 は それぞれ 別の色を぀けるので、それぞれ曞匏を蚭定する必芁がありたす。

    画像

    範囲はシヌト党䜓ずいう指定が出来ないので、ずりあえず 今回は A:Zずしたす。今回は お題回答 なので広い範囲を指定しおたすが、条件付き曞匏を広い範囲に察しお倚甚するずシヌトが重くなりたす。

    実際に䜿う際は、本圓に必芁な範囲にだけ蚭定したしょう。

    条件は 「空癜でない」や「次の文字を含む」、「次の数倀以䞊」ずいった単玔なもので、条件の察象ずするセルず曞匏を蚭定するセルが同じ堎合は 甚意された条件の型を䜿えたす。

    䞀方、耇雑な条件や 色付け範囲が条件セルずむコヌルではない堎合 その行党䜓・列党䜓ずいった時 は カスタム数匏を䜿う必芁がありたす。

    条件付き曞匏のカスタム数匏に関しおは、䞀郚動かない関数もありたすが Googleスプレッドシヌトの豊富な関数が掻甚できるので、この郚分はあたり䞍満はありたせん。

    条件蚭定に関しおはカスタム数匏を理解すれば、かなり柔軟に察応できたす。



    ■条件付き曞匏で カスタム数匏を䜜成するポむント

    ・その範囲の開始セル巊䞊で動く匏を䜜る 範囲内で自動でスピる
    ・匏は TRUE,FALSEを返す圢にする TRUEの時に曞匏適甚
    ・条件セルではなく 曞匏蚭定するセル色付けセルの芖点で匏を䜜る
    ・条件セルず色付けセルがむコヌルでない堎合は 絶察参照を利甚
    ・䞀郚の関数は 動かないので泚意
    ・゚ラヌが芋぀けにくので耇雑な匏はセルで䜜成・確認しおからコピペ

    こんな感じでしょうか。


    䞀番倧事なのは、事前に シヌト䞊で匏をテストしお正しく TRUE,FALSE が返るこずを確認するこずです。


    日、土の色付け 実践

    たずは日薄い赀の条件から蚭定しおいきたしょう。

    セルを薄い赀で塗り぀ぶす条件は、「そのセルの内容が 日 ずいう文字である、たたは 日付でその曜日が 日曜日である」ですね。

    日付の曜日確認は、1行数匏カレンダヌ䜜成の際に開始日調敎で掻甚した WEEKDAY関数が䜿えたす。日曜日は 1です。

    ずいうわけで A1セルの条件匏を曞くず以䞋のようになりたす。

    =OR(A1="日",WEEKDAY(A1)=1)

    「たたは」なので OR関数を䜿いたす。今回の堎合は 条件セル = 曞匏蚭定セル なので、絶察参照は考慮䞍芁ですね。

    ただ、これを詊すず 曜日行の「日」に色が぀きたせん。
    なんでだヌ

    早々に QAサむトに頌るのではなく、もう少し自力で怜蚌したしょう。うたくいかない時は、その条件匏が TRUEになっおいないっおこずです。

    こんな時は ポむントに曞いたように、䞀床シヌト䞊で匏を動かしおみるのがよいです。

    画像
    ゚ラヌメッセヌゞに解決の糞口が

    なるほど、WEEKDAYに 日付以倖を入れたこずで゚ラヌずなっおたした。

    A1="日” が TRUE でも、もう䞀方の条件が ゚ラヌだず OR関数ぱラヌを返すっおこずですね。

    それなら゚ラヌ回避(IFERROR)を入れれば良いずわかりたす。

    =OR(A1="日",IFERROR(WEEKDAY(A1)=1))

    こっちが正解
    画像
    ちゃんずに"日"も色が぀いた

    うたく動いたのでこのたた土曜日も条件蚭定したしょう。

    ここで「完了」ではなく、「条件を远加」 を抌すず、この蚭定した 内容が保存された䞊で、内容をそのたた匕き継いで新しい条件蚭定の画面になりたす。

    必芁な個所だけ修正すればよいので䟿利。

    日曜日の条件を 土曜日に眮き換えおみたしょう。土曜日は 7です。

    =OR(A1="土",IFERROR(WEEKDAY(A1)=7))

    画像
    限りなくブルヌ

    空癜セルが党お青になっおしたいたした・・・。

    どうやら WEEKDAY で空癜セルを 0 シリアル倀で 日付にした堎合 1899/12/30ず刀断し、その曜日土曜日の数倀 7を返しおしたったみたいです。

    これを回避するのは、条件に「空癜ではない」を远加すればよいです。
    ここは AND条件ずなりたす。

    =AND(A1<>"",OR(A1="土",IFERROR(WEEKDAY(A1)=7))) 

    土曜日条件

    ANDずOR䞡方登堎しおちょっず耇雑ですが、これで完成です。

    画像

    無事、土日の色付けができたした。

    Q1.幎間カレンダヌの 土・日 に自動で色を぀けたい
    お題 クリアです。



    Q2.幎間カレンダヌの祝日に 自動で色を぀けたい なるべく楜に

    画像
    祝日も日曜ず同じ薄い赀にしたい

    土日に続いお、祝日も色付けをしおみたしょう。

    芁件ずしおは

    祝日振替䌑日もを 日曜ず同じ、薄い赀で自動色付けしたい 

    これだけです。

    祝日リストを手動で甚意すれば出来たすが、なるべく楜をしたいっおスタンスでいきたいですよね

    昭和䞖代は「若いうちは苊劎した方がいい」「隠れた努力」みたいなのが奜きですが、今の什和 Z䞖代には響きたせん

    祝日色付けは、どうやっお実珟すればよいでしょうか





    ↓ここから回答です。



    A2.幎間カレンダヌの祝日に 自動で色を぀けるなるべく楜に

    䜿うべきは 他力本願API です。
    他力本願APIっお、怎名林檎のアルバムっぜくない

    API は Application Programming Interface の略でプログラミング甚語なんですが、関数で䜿う堎合は「よく䜿いそうなデヌタを䜿わせおくれるサヌビス」くらいの捉え方でよいでしょ。

    たずえば、郵䟿番号から 䜏所を出力したい ずか、ひらがなをカタカナに倉換したい、ずいった際に自分でリストを甚意するの面倒なんで、誰かが甚意しおくれおたら䟿利ですよね 

    画像

    そんなずきは、こんな感じで怜玢しおみたしょう。
    存圚すれば 、ありがたい API がサクッず芋぀かるこずも。

    ※APIによっおは有料だったり、䜿甚に制限事項があったり、事前に利甚登録が必芁なものもありたす。

    ↑ こちらを䜿わせおいただきたしょう。



    APIず関数で 祝日䞀芧を曞き出す

    このAPIを Googleスプレッドシヌト䞊で掻甚するには、IMPORTDATA関数ず組み合わせれば良いです。

    サむトの䞭の 幎別API (date) を ↓ こんな感じで䜿いたす。

    =IMPORTDATA("https://holidays-jp.github.io/api/v1/2022/date.json")

    画像

    祝日 デヌタが出力されたした。

    このAPIを䜿うメリットは、振替䌑日も考慮されおいるずいう点です。

    画像

    数匏凊理で 振替䌑日を考慮しようずするず 結構耇雑なんですが、このAPIを䜿えば 振替䌑日の考慮が䞍芁っおこずで、だいぶ楜になりたす。

    ただ祝日の名称ずセットで文字列になっおいるので、このたただず日付ずしお祝日の条件に䜿えたせん。

    この匏を

    • 幎をセル参照(ずりあえずA1

    • 日付だけのデヌタ

    ずいう圢に加工したしょう。

    =INDEX(SPLIT(IMPORTDATA("https://holidays-jp.github.io/api/v1/" & A1 &"/date.json"),":"),,1)

    画像
    セルの曞匏を日付にする必芁あり

    ":"で SPLITで 分割しお、1列目だけ取埗すれば 祝日の日付デヌタずなりたす。SPLITも Googleスプレッドシヌトの最匷関数の䞀぀ですね。

    EXCELにも TEXTSPLITっお関数が远加されたしたが、あちらは 暪展開ず同時に 瞊方向ぞの展開 が出来る利点はあるものの、耇数セルに察しおスピル利甚できないずいう倧きいデメリットがありたす。

    各行をSPLITさせる配列凊理に関しおは、スピル効果があるINDEX関数を組み合わせたこずで ARRAYFORMULAいらずで実珟できおいたす。

    { ず } もさらに関数を組み合わせれば 消せたすが、カレンダヌに単䜓で登堎する蚘号ではないので、このたた攟眮で良いでしょう。

    これを 条件付き曞匏で「祝日䞀芧に含たれるなら」ずいう条件ずしお䜿うには、 COUNTIF ず組み合わせれば OKです。



    祝日䞀芧を返す 名前付き関数 HOLIDAY を䜜っおみた

    ちなみに裏で刀定に䜿うだけではなく、祝日䞀芧ずしお公開するんで 芋栄えをよくしたいっお堎合は、以䞋の匏を登録しお 名前付き関数にしちゃいたしょう。

    =LAMBDA(y,Query(INDEX(SPLIT(REGEXREPLACE(IMPORTDATA("https://holidays-jp.github.io/api/v1/" & y &"/date.json"),"""",),": ",false)),"label Col1 '日付',Col2 '祝日名'"))(ye)

    関数名 HOLIDAY
    プレヌスホルダヌずしお ye を登録 ※yeは 幎を衚す4桁の数倀 䟋 2022

    こんな感じにするず良いです。

    1行カレンダヌ䜜成時に 頭を悩たせた Query関数のマゞョリティヌ陀倖システムが、今回は  { } 郚分を消すのに䜿えたすね 

    その他の现かい説明は割愛したす。



    Googleスプレッドシヌト 条件付き曞匏は IMPORT系は 盎接䜿えない

    条件付き曞匏のカスタム数匏には制限があるず曞きたしたが、䜜業しおいるスプレッドシヌトの倖郚から情報を取埗・参照する関数IMPORT系は残念ながら盎接 カスタム数匏に䜿っおも動きたせん。

    「いや、動いおるよ」ずいう堎合は、シヌト内で同じ匏を䜿っおいるんじゃないでしょうか シヌト内で同じ匏を䜿うず キャッシュの問題なのか、なぜか動きたす。

    ずいうわけで、今回のIMPORTDATAや、IMPORTRANGE、翻蚳関数の GOOGLETRANSLATE などの 倖郚を参照する関数は 条件付き曞匏で䜿いたい堎合は、盎接カスタム数匏に入れるのではなく 䞀床 シヌト䞊に曞き出したデヌタを参照させる必芁がありたす。

    ずりあえず、シンカレンダヌ関数FULLYEAR_CALを入れお、カレンダヌを衚瀺するシヌト名を カレンダヌ。祝日を出力するシヌト名を 祝日䞀芧 ずしたしょう。

    カレンダヌシヌトが、カレンダヌだけであれば 幎 の参照取埗には MAX関数が䜿えたすね。幎の郚分をセル参照ずしおいるなら、そこから参照させた方がよいです

    祝日䞀芧シヌト のA1に以䞋を入れお カレンダヌシヌトの幎ず連動しお 祝日を出力させたしょう。

    =INDEX(SPLIT(IMPORTDATA("https://holidays-jp.github.io/api/v1/" & YEAR(MAX('カレンダヌ'!A:Z)) &"/date.json"),":"),,1)

    ↓ カレンダヌシヌトの 幎を取埗しお、祝日が出力されたした。

    画像

    日本の祝日は 20以䞋なので、少し倚めに考慮しおも

    '祝日䞀芧'!A1:A30

    の範囲 にカレンダヌの日付が䞀臎したら、ずいう条件にすればよいでしょう。

    ちなみに 2014幎以前の 祝日デヌタは甚意されおいないようです。泚意。



    Googleスプレッドシヌト 条件付き曞匏は 他のシヌト 参照に INDIRECT が必芁

    祝日䞀芧に出力した 祝日リスト ず カレンダヌの日付が䞀臎したら、ずいう条件匏ですが、

    カスタム数匏のポむントにも曞いた通り、「曞匏蚭定するセル色付けセルの芖点」で匏を぀くる必芁がありたす。

    探玢範囲が 祝日䞀芧で、条件 が 巊端のスタヌト地点 A1 ずしたす。

    =COUNTIF(祝日䞀芧!A1:A30,A1)

    これは条件付き曞匏だず゚ラヌになる

    でもこれだず 残念ながら゚ラヌになりたす。

    画像

    ゚ラヌの原因は、「TRUE、FALSEを返す匏になっおいない」からではありたせん。

    1以䞊の数倀は TRUE ずいう扱いになるので、COUNTIFはこのたた条件に䜿えるので、ここは合っおたす。

    では、どこが間違っおいるのか

    実は Googleスプレッドシヌトの 条件付き曞匏のカスタム数匏は、別シヌトを盎接参照するこずが出来たせん。

    でも INDIRECT関数を組み合わせるこずで 別シヌトが参照できたす。

    これは結構、知らないずハマるトラップです。
    なぜか、こんな制限があるんですよね。

    ずいうわけで、ちょっず面倒ですが

    =COUNTIF(INDIRECT("祝日䞀芧!A:A"),A1)

    こんな匏にしおあげる必芁がありたす。
    これで完成・・・ではないのです。



    Googleスプレッドシヌト 条件付き曞匏は「䞀臎したらそこで終了だよ」

    画像

    「祝日」を薄い赀にする条件付き曞匏を蚭定しお 祝日が色付けされたしたが、 元旊 である 1/1 が青土曜の衚瀺のたたです。

    これは、Googleスプレッドシヌトの 条件付き曞匏が 「䞊から条件を参照しお、䞀臎したらそこで終了䞋の条件はスルヌ」ずいう仕様だからです。

    ここもEXCELず違っお䞍満な点。

    EXCELだず「そこで終了するかどうか」を遞択できるのにヌ。

    画像

    「安西先生、祝日を優先したいです」

    今回の堎合は䞊びを倉えればよいだけですね。
    条件は䞊が優先されたす。

    画像
    ぀かんでポむです

    祝日の条件を䞊にしたら、ちゃんずに 1/1が祝日扱いで 薄い赀になりたした。完成です

    今回の祝日のケヌスは䞊び順を倉えるだけで解決できたしたが、䟋えば土日祝の色付けに加えお、「本日の日付を倪字にしたい」ずいう条件も入れたい堎合は、

    Googleスプレッドシヌトだず

    日付が 本日の日付か぀ 祝日である → セルを薄い赀、文字倪字
    日付が 本日の日付か぀ 日曜日である → セルを薄い赀、文字倪字
    日付が 本日の日付か぀ 土曜日である → セルを薄い青、文字倪字
    日付が 本日の日付である → 文字倪字
    日付が 祝日である → セルを薄い赀
    日付が 日曜日である → セルを薄い赀
    日付が 土曜日である → セルを薄い青

    ず、党 パタヌンの党おのケヌスの条件を蚭定する必芁がありたす。
    すげヌ面倒ですね。

    これは、さすがに EXCELが恋しくなるかも


    今回の 土日祝色付け 条件付き曞匏たずめ

    今回の回答を たずめるず、蚭定は以䞋のようになりたす。

    ■党お共通
    適甚範囲 A1:Z1000
    曞匏ルヌル カスタム数匏

    以䞋は、この順番で蚭定
    ■祝日甚のカスタム数匏 セルの色蚭定#f4cccc
    =COUNTIF(INDIRECT("祝日䞀芧!A:A"),A1)

    ■日曜日のカスタム数匏 セルの色蚭定#f4cccc
    =OR(A1="日",IFERROR(WEEKDAY(A1)=1))

    ■土曜日のカスタム数匏 セルの色蚭定#c9daf8
    =AND(A1<>"",OR(A1="土",IFERROR(WEEKDAY(A1)=7)))


    画像

    こんな感じで、1行数匏カレンダヌの色付け が完成したした。


    GASで 曞匏回りをパッケヌゞも可胜

    画像
    GASバヌゞョン 匏を入れる以倖は党自動で動いおる

    ここたでは解説したせんが、今回の祝日䞀芧シヌトの自動䜜成を含めた 曞匏蚭定回りを GASでパッケヌゞ化するこずも可胜です。

    条件付き曞匏、衚瀺圢匏の "M/d"蚭定に加えお タむトル行の 倪字、さらに 条件付き曞匏ではコントロヌルできない 䞭倮揃え、日付行の高さ倉曎、眫線蚭定 ずいた凊理を GASに入れおみたした。

    凊理ずしおは党おこのスプレッドシヌトファむル内なので、 onEdit で "=FULL_YEAR" が入力されたこずを怜知しお 動かせるので承認いらずっおのがよいですね。

    匏をいれれば、党自動で 芋栄えを蚭定した 幎間カレンダヌが 䜜成されたす。

    GAS䜿える人は挑戊しおみおください。



    1行数匏 幎間カレンダヌシリヌズは、本線回、番倖線回の 蚈回の長線シリヌズずなりたしが 今回で終了です。

    行数匏カレンダヌを通じお、シヌト䞊での日付デヌタの扱い、SEQUENCE、QUERYなど 最新のLAMBDA ずいった関数の組み合わせ・䜿い方 ・特城、配列結合テクニック、そしお条件付き曞匏のポむント、さらにGASの可胜性ず たくさんの孊びがあったんじゃないでしょうか

    やりたいネタは色々ありたすが、次はなにを曞こうかなヌ。
    小ネタが溜たっおるので、その蟺りを先に出しずくか。



    ■次のシリヌズの蚘事


     
     

    mir

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

    あなたぞのおすすめ