いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Gスプレッドシート)万年カレンダーを作成する

 Googleスプレッドシートで簡易な万年カレンダーを作成する方法についてです。テンプレートに毎年のカレンダーが用意されているため必要性は薄いですが、表計算ソフトの学習における定番の「例題」といえます。
 ここではSEQUENCE関数などを使い、1セルへの入力だけで表に日付を並べる例を紹介します。

  • DATE関数やWEEKDAY関数を利用して、年月に応じたカレンダー(日付欄)を作成できます。
  • ARRAYFORMULA関数やSEQUENCE関数を組み合わせることにより、1つのセルに入力するだけで日付を表に展開できます。

手順

f:id:accs2014:20191130234216p:plain:right:w500

 まずは罫線を引き、年月の欄(B3とC3)と日付の表(B6:H11)を設けます。
 B3とC3には手入力でもいいですが、それぞれ「=YEAR(TODAY())」「=MONTH(TODAY())」と入力すればシステムの年月が反映されます。

f:id:accs2014:20191130234221p:plain:right:w500

 ここでいきなりですがB6セルに次のように入力します。

=ARRAYFORMULA(SEQUENCE(6,7,DATE(B3,C3,1)-WEEKDAY(DATE(B3,C3,1))+1))

 ちょっと複雑ですが、SEQUENCE関数により日付を連番として生成しています。
 このSEQUENCE関数の第1,第2引数で表の行数と列数(6と7)を定めています。第3引数は連番の最初の数字をいくつにするかですが、これを「DATE(B3,C3,1)-WEEKDAY(DATE(B3,C3,1))+1」とすることによりB3セルとC3セルを参照して当該月の初日の曜日を求め、最終的にその週の日曜日の値(シリアル値。日付に対応した数値)を求めています。

f:id:accs2014:20191130234224p:plain:right:w500

 これだけで表の中にすべての日付が展開されます。
 ただしシリアル値のままですので、表示形式(書式)を改める必要があります。

f:id:accs2014:20191201012220p:plain:right:w650

 そこでB6:H11を選択した状態にして「表示形式」→「数字」→「表示形式の詳細設定」→「カスタム数式」と進んで選択します。

f:id:accs2014:20191130234233p:plain:right:w450

 ダイアログが現れますので、数式欄に「d」と入力して「適用」をクリックします。

f:id:accs2014:20191130234238p:plain:right:w500

 シリアル値に対応した「日」が表示されました。


f:id:accs2014:20191130234241p:plain:right:w400

 さて、カレンダーには当該月以外の日付も表示されていますので、それらの日付の数字を薄い色に変えることとします。
 そのまま(B6:C11を選択したまま)「表示形式」→「条件付き書式」と選択します。

f:id:accs2014:20191201012224p:plain:right:w550

 条件付き書式のペインです。
 ここで「範囲に適用」欄の値が「B6:H11」であることを確認します(違っていたら手入力)。
 そして「セルの書式設定の条件」では「カスタム数式」を選択し、数式欄には「=MONTH(B6)<>$C$3」と入力します。表内の日付が属する「月」とC3セルに表示されている「月」を比較するというわけです。異なる場合の条件としてスタイルはフォントを灰色、セルの塗りつぶしは「なし」とします。
 最後に「完了」をクリックします。

f:id:accs2014:20191130234248p:plain:right:w500

 当該月の前後の月の日付が灰色になりました。

f:id:accs2014:20191130234252p:plain:right:w500

 あとは文字位置を中央に調整して一応の完成です。
 さらに書式を工夫して土日の色を設ける、といった調整が考えられます。

 なお、日付の表示にSEQUENCE関数を用いていますので、入力は早いですが「日付を一行おきに表示し、間の行をメモ欄的に使う」ということができないのが弱点です。
 そうしたい場合は1セル入力での完成をあきらめ、「2行上の値を参照して+7」といった数式をいくつか配置していくこととなります。