小秘書筆記 | 如何用公式在 Google Sheets 表格中建立「會隨著所選年月自動更新生成」的日曆

情境及需求

可以自行更改黃色儲存格中的值(年份與月份),底下的日曆會跟著改變成當月的日曆

這次想用 Google Sheets 做一個日曆,然後我輸入特定年份和月份的時候,那個日曆會自動調整顯示為那個月的日曆~有需要這個日曆的話也可以直接點這個連結複製去用(選擇「檔案/建立副本」就可以複製一個檔案回去編輯囉),接下來會分享我做這個日曆的公式和步驟,想自己做一個的話就繼續看下去吧~如果有更聰明的做法歡迎留言跟我分享!

解決方法及設定步驟

1. 選定日曆格式和位置

先設定好輸入年月和顯示日曆的位置,後面的公式就可以依據這些儲存格位置來寫。我先將格子定在下圖所示的位置(年份數值:B1,月份數值:D1,日曆日期顯示範圍:B4:H9),接下來在解釋解決方法和設定步驟時都會用這個位置作為範例,可以自行按照你的需求和儲存格位置調整參數運用!

2. 找出當月第一天是星期幾

在第一週的那排儲存格輸入公式,例如在 B4 那格填入 “=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1))”

=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1)):將輸入的年月份換成當月第一天的日期格式。例如在這個例子裡,B1=”2024″,D1=”1″,所以 $B$1&”/”&$D$1&”/01″=”2024/1/01″。不管在哪個儲存格,要對照的年月份位置都是一樣的,所以在公式中把 B1 和 D1 用 “$” 鎖住。

=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1)):用 WEEKDAY() 公式找出當月第一天(”2024/1/01″)是星期幾,公式的回傳值會用 1 代表周日、2 代表週一、以此類推。

=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1)):如果 WEEKDAY() 公式回傳的值跟那格代表的星期相同的話,就寫下 “1”。這裡每格的公式值會不太一樣,B4 是周日, WEEKDAY() 回傳的周日代表值是 1 ,所以這格的公式這部分會是 “If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1“; B5 是週一, WEEKDAY() 回傳的周一代表值是 2 ,所以這格的公式這部分會是 “If(WEEKDAY($B$1&”/”&$D$1&”/01″)=2,1“;以此類推在每格判定WEEKDAY() 回傳的值是不是等於那格代表的星期,如果是的話就寫下 “1” ~

=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1)):如果 WEEKDAY() 回傳的值不是等於那格代表的星期,那就看它左邊那格的值決定,如果左邊那格的值是空白的,這格也不是當月第一天的星期,那就表示還沒找到當月第一天,要繼續填入空白 (“”);如果左邊那格已經有數值,那就表示當月第一天已經找到了,應該要填入左邊的數值加一 (“[左邊儲存格位置]+1”)。

第一排的所有儲存格從左至右公式會長這樣:
=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=[該格星期代表值],1,if([左邊的儲存格]=””,””,[左邊的儲存格]+1))
要快速填入的話可以把 B4 的公式打好、往右拉到 H4 後,再一一點進各個儲存格修改[該格星期代表值],改好後每格會長這樣:
B4(日):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=1,1,if(A4=””,””,A4+1))
C4(一):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=2,1,if(B4=””,””,B4+1))
D4(二):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=3,1,if(C4=””,””,C4+1))
E4(三):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=4,1,if(D4=””,””,D4+1))
F4(四):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=5,1,if(E4=””,””,E4+1))
G4(五):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=6,1,if(F4=””,””,F4+1))
H4(六):=If(WEEKDAY($B$1&”/”&$D$1&”/01″)=7,1,if(G4=””,””,G4+1))

3. 填入第二週的日期

由於每個月的第一天一定會是星期日、一、二、三、四、五、六之中的其中一個,所以第一週七個儲存格一定會有一個 “1”、最後一格也一定會有數值(1 <= H4 <= 7),也就是說在第一週找到當月第一天是星期幾之後,第二周就可以根據第一週最後一天的值推算出日期了!第二週每格的公式會長這樣:

B5(日):=H4+1:第二週第一天的日期等於前一天(第一週最後一天)的日期加一
C5(一):=B5+1:第二週其它天的日期等於前一天(左邊儲存格)的日期加一,填好這格的公式之後可以直接往右拉到 H5~
D5(二):=C5+1
E5(三):=D5+1
F5(四):=E5+1
G5(五):=F5+1
H5(六):=G5+1

4. 填入第三、四週的日期

第二週的日期都填完之後,這兩週只要直接將上方儲存格的值 +7 就好了,所以公式會是 “=[上方儲存格]+7” ,例如 B6=B5+7 、C6=C5+7 ,依此類推到 H7=H6+7 。

考量 1 <= H4 <= 7 ,H7 的值也會在 22 到 28 之間,所以即使是每月天數最短的 2 月(28 天),在 H7 用這個公式也都不會超出當月最後一天,所以可以到下一天的儲存格(B8)再換成找出當月最後一天的公式!

5. 找出當月最後一天

超過當月最後一天的日期後,儲存格就應該要顯示空白(例如 31 號之後的儲存格就應該顯示 “” 而不是 “32”,因為一個月不會有 32 號),所以最後一週(B8:H8 、B9、C9)要輸入另一個公式找出當月最後一天並做適當處理,例如在 B8 那格填入 “=IF(B7+7<=DAY(EOMONTH($B$1&”/”&$D$1&”/01″, 0)),B7+7,””)”

=IF(B7+7<=DAY(EOMONTH($B$1&”/”&$D$1&”/01″, 0)),B7+7,””):一樣先將輸入的年月份換成當月第一天的日期格式。例如在這個例子裡,B1=”2024″,D1=”1″,所以 $B$1&”/”&$D$1&”/01″=”2024/1/01″。不管在哪個儲存格,要對照的年月份位置都是一樣的,所以在公式中把 B1 和 D1 用 “$” 鎖住。

=IF(B7+7<=DAY(EOMONTH($B$1&”/”&$D$1&”/01″, 0)),B7+7,””):接下來用 EOMONTH (End Of MONTH) 公式判斷當月最後一天的日期,EOMONTH([要判斷的日期=輸入的年月份,用第一天代表],[加幾個月:這裡我們想知道的是當月,所以加 0 個月])。

=IF(B7+7<=DAY(EOMONTH($B$1&”/”&$D$1&”/01″, 0)),B7+7,””):但我們想知道的不是當月最後一天的完整日期 (“2024/01/31″),而是日期中”天” 的值 (“31”) ,所以用 DAY() 公式擷取日期中最後的”天”的數值。

=IF(B7+7<=DAY(EOMONTH($B$1&”/”&$D$1&”/01″, 0)),B7+7,””):最後判斷如果沿用「上方儲存格+7」的日期是否還會在當月最大天數的範圍內 (“<= 31”),如果還在範圍內的話就沿用,如果超過 (大於 “31”) 就改為顯示空白 (“”)

考量 1 <= H4 <= 7 、而且一個月最多可以有 31 天,這個公式至少要放到 C9 這格噢!(其實多放到最後一周結束也沒關係,反正也只是會顯示空白~)

這樣就可以擁有一個能自由輸入年份和月份、底下會根據你輸入的值調整顯示的日曆了!

Leave a Comment

Your email address will not be published. Required fields are marked *