Notion DataBaseでのクレジット決済スケジュール管理で日付を関数処理してみた
支払に使っているクレジットカードの管理をSpreadsheetで行っていましたが、NotionAIを活かしてみようとNotionのデータベース上に持ってきました。
問題は期日のフォーマット。Notionの日付プロパティでは年月日のいずれも入力する必要があり、月日での管理を行いたい場合には他の手段が必要です。今回は日付ではなくテキストプロパティとして扱うことにしました。ネックとしてはカレンダー表示に対応できないことくらいでしょう。
NotionはSpreadSheetほど日付の扱いが柔軟というわけでもなく、内容によってはテキストに対して関数を使っての整形が求められます。特にSpreadSheetで手軽だった日付表記のコンバートはNotionの場合やや厄介です。決済期日を元に、日付の扱いを関数に起こした例として挙げてみました。
関数での日付フォーマットについて注意するポイント
テキストを元に日付へ一回で変換する場合、テキストはISO8601標準 YYYY-MM-DD
に合わせる必要があります。テキストが年月日表記の場合はreplace
とsplit
を多用しつつ、月日を0詰めした上でISO8601のフォーマットへ合わせます。
0詰めを怠うと、エラーは出ないものの空欄になる等で原因は掴みにくいことが多くあります。期待通りにいかなかった場合は、一行ずつ出力確認することをおすすめします。
毎月及び毎年の両ケースを交えた上での日付表示
以下、決済予定日に月日構成で入力されたデータを元に、次回決済日を年込みで導き出す関数式です。決済が年に1回と月に1回の両ケースに対応しているため、やや煩雑な処理となっています。
lets( date_array, split(replace(replace(prop("決済日"), "月", "/"), "日", ""), "/"), month, toNumber(slice(date_array,0,1).first()), day, toNumber(slice(date_array,1,2).first()), check_month, month > 9, check_day, day > 9, zero_month, if(check_month,month,join(["0", month],"")), zero_day, if(check_day,day,join(["0", day],"")), next_zero_month, if(month + 1 > 9, month + 1, join(["0", month + 1], "")), transaction_year, if(prop("決済時") == "毎年", if(now().month() > month, now().year() + 1, now().year()), now().year()), transaction_month, if(prop("決済時") == "毎月", if(now().month() == month && now().day() > day, next_zero_month, zero_month), zero_month), transaction_date, parseDate(format(join([transaction_year,transaction_month,zero_day],""))), if(prop("決済日").empty(), "", if(transaction_date.timestamp() > today().timestamp(), transaction_date, parseDate( format( join([ transaction_year, transaction_month, zero_day ],"") ) ) ) ) )
処理の大半は0詰めとparseDate
用にフォーマットを揃えるためのものです。let
関数のお陰で行数は抑えられています。この処理を実際に行うと以下のような表示になります。
あとがき
個人的にデータベースのカレンダー表示を利用する機会が殆どないため、割り切っての処理としました。関数の動作検証が辛い場合は、GASの日付ライブラリにてデータを加工してNotionAPI経由でデータベースに収めるのも手です。