📅
給料日が来たら、自動で指定範囲を変更して合計値を出す
はじめに
私はGoogle Spreadsheetで金銭管理や健康状態の管理をしています。
基本的には、左端のカラムで日付、上部3行はタイトルや合計値の表示で固定して使用しています。
はじめのうちは特に難しいことはしていなく、SUM関数や条件付き書式等で充分満足していたのですが、月イチで手動で変更していたSUM関数の範囲指定を月が変ったら(正確には給料日になったら)自動で変わるようにしたいな…と思うようになりました。
仕様
- 更新中の範囲の直近の給与支給日以降のセルの値の合計を取得
- 給与支給日が土曜や日曜の場合、直前の金曜に日時の指定を繰り上げる
使用した関数
- SUM関数 => 指定した範囲の合計値を求める
- INDIRECT関数 => 文字列で範囲を指定できる
- MATCH関数 => 指定した範囲内で指定の値のあるセルの行番号を求める
- IF関数 => 条件分岐処理を行う
- DATE関数 => 計算に使用できる日付の値を生成する
- NOW関数 => 現在の日付・時刻を求める
- YEAR関数/MONTH関数/DAY関数 => NOWやDATEで得た値から年・月・日の数字を求める
- WEEKDAY関数 => 指定された日付の曜日を1から7の数値で返す(日〜土)
最終的なコード
=SUM(INDIRECT("N"&MATCH(date(YEAR(NOW()),IF(DAY(NOW())>25,MONTH(NOW()),MONTH(NOW())-1),IF(WEEKDAY(date(YEAR(NOW()),IF(DAY(NOW())>25,MONTH(NOW()),MONTH(NOW())-1),25))=1,23,IF(WEEKDAY(date(YEAR(NOW()),IF(DAY(NOW())>25,MONTH(NOW()),MONTH(NOW())-1),25))=7,24,25))),A:A)&":N"))
見やすく展開してみた(コメントも追加)
=SUM( # SUM(NXXX:N)でカラムNの範囲をXXX以降として合計を出す
INDIRECT( # INDIRECT("文字列")でセル範囲を指定
"N"&
MATCH( # MATCH(値,範囲)で該当するセルの番号を検索
date( # DATE(年,月,日)で日付(土日変わる給料日)の値を生成
YEAR(NOW()), # YEAY()で年の数値を取得、NOW()で現在の時刻を指定
IF( # IF(条件式,真の場合,偽の場合)の条件分岐
DAY(NOW())>25, # DAY()で日を取得、25以上ならその月を、以下なら前月を
MONTH(NOW()), # MONTHで月を取得
MONTH(NOW())-1 # -1で前月を取得
),
IF(WEEKDAY( # WEEKDAY(日付)で曜日を確認し、日の数値を条件分岐して確定する
date(YEAR(NOW()),
IF(DAY(NOW())>25,MONTH(NOW()),MONTH(NOW())-1),25))=1,
23, # WEEKDAYが1(日曜日)なら 23日(金曜日に支給)
IF(WEEKDAY(
date(YEAR(NOW()),
IF(DAY(NOW())>25,MONTH(NOW()),MONTH(NOW())-1),25))=7,
24, # WEEKDAYが7(土曜日)なら 24日(金曜日に支給)
25 # それ以外なら25日
) # 日曜?土曜?それ以外という入れ子のIF。同じ条件式が何度もでてきて判読しづらい
)
)
,A:A) # MATCHで検索する範囲 A4とかすると、ずれるのでその場合は要補正
&":N"
)
)
課題
祝日をまったく想定していないので、その辺も考慮したい…
ちなみに国民の祝日は、前年の2月に国から発表される
国民の祝日について - 内閣府
方法としては、休日のAPIかなにかたたくかなぁとか思ってたけど、天皇誕生日(2月23日)、秋分の日(9月22日)、勤労感謝の日(11月23日)あたりしか該当しなさそうで、23になった場合の条件分岐で、月の条件(2/9/11)が合致した場合に曜日を確認して金曜だったら、さらに1日前倒し…とかでよさそう。
そのうち対応する。
補足 スプレッドシートで条件式書式設定メモ
冒頭の画像で、セルの色がついている部分もカラムAを元に自動で色付しています。
- 過去の日付はグレーに
- 土日は青赤に
- 給与支給日はグリーンに
指定は以下のような感じ。(順番が重要だったりする。)
条件付き書式 | 各条件の一例 |
---|---|
- 適用範囲 => A4:BL1059
- 条件の式:過ぎ去った日々 => =$A4<TODAY()
-
条件の式:土日 => =WEEKDAY(
A4,1)=7A4,1)=1 / =WEEKDAY( -
条件の式:給料日(土日が該当する場合のために3つ設定)
- 通常の場合 => =AND(WEEKDAY(
A4)<7,DAY($A4)=25)A4)>0,WEEKDAY( - 金曜で24日だった場合 => =AND(WEEKDAY(
A4)=24)A4)=6,DAY( - 金曜で23日だった場合 => =AND(WEEKDAY(
A4)=23)A4)=6,DAY(
- 通常の場合 => =AND(WEEKDAY(
Discussion