特定の日(毎月20日)を基準とした経過回数の算出について

計算式プラグインを利用して、以下の要件を実現したいと考えておりますが、意図した数値が算出できず苦慮しております。
お手数ですが、正しい設定方法をご教示いただけますでしょうか。


1.実現したい要件

「異動日(日付フィールド)」から本日までの期間において、「毎月20日」という節目を何回通過したかを計算したいと考えています。

回数算出のイメージ(本日が 2026/04/22 の場合)

  • 異動日が 2026/03/01 の場合: 2回** (3/20と4/20の計2回を通過)
  • 異動日が 2026/04/01 の場合: 1回** (4/20を1回通過したため)
  • 異動日が 2026/04/20 の場合: 1回** (4/20を1回通過したものとする)
  • 異動日が 2026/04/21 の場合: 0回** (20日を経過していない)
  • 異動日が 2026/05/21 の場合: 0回** (未来日付のため)

このような「特定の日(20日など)」を基準にした月数・回数計算を行う場合、推奨される計算式の構成はありますでしょうか。
フェリスくんとフォルトンくんにも相談しましたが、答えを得ることができませんでした。

お忙しいところ恐縮ですが、 何卒よろしくお願いいたします。

フェリスくんとフォルトンくんから答えが得られなかったということなので、Claude くんに助けてもらいます。
Claude くんに考え方を聞いてみて、フェリスくんに計算式を作ってもらいます。

「毎月20日」通過回数の計算ロジック(Claude くんの回答)

基本の考え方

「異動日から本日までに、20日という日を何回跨いだか」を数えます。シンプルに分解すると、異動日の月の20日 から 本日の月の20日 までに含まれる「20日」の個数を数えることに帰着します。

計算式

回数 = (本日の年 - 異動日の年) × 12 + (本日の月 - 異動日の月) + 調整値

この「調整値」を異動日と本日それぞれの「日」で決めるのがポイントです。

調整値の決め方

条件 意味
異動日の「日」が20以下 その月の20日を「通過対象に含める」→ +1
本日の「日」が20未満 本日の月の20日はまだ通過していない → -1

つまり両端の「20日を含むか否か」を個別に判定します。

検証(本日 = 2026/04/22)

異動日 月差 異動日≤20? 本日≥20? 計算 結果
2026/03/01 1 +1 +0 1+1 2回
2026/04/01 0 +1 +0 0+1 1回
2026/04/20 0 +1 +0 0+1 1回
2026/04/21 0 +0(21>20) +0 0 0回
2026/05/21 -1 +0 +0 -1 → 0にクランプ 0回

未来日付のケースは計算結果が負になるので、最後に Math.max(0, 回数) でクランプすればOKです。

別解:ループで素直に

ロジックが直感的でない場合は、異動日から本日まで月単位でループして「その月の20日が 異動日 ≤ 20日 ≤ 本日 の範囲にあるか」を判定する実装でも同じ結果になります。パフォーマンス差は数十年分でも無視できるレベルなので、可読性重視なら素直なループの方が保守しやすいと思います。

フェリスくんがこの考え方で計算式を作成

// 異動日が本日より後の場合は 0 を返す(クランプ処理)
IF(DATE_DIFF(異動日, TODAY(), "days") < 0, 0,
  LET(
    // 1. 月差のベースを計算(単純な月単位の差)
    月差, DATE_DIFF(DATE_FORMAT(異動日, "YYYY-MM-01"), DATE_FORMAT(TODAY(), "YYYY-MM-01"), "months"),
    // 2. 異動日の調整(20日以前ならその月をカウントに含める)
    異動日調整, IF(DATE_FORMAT(異動日,"D") <= 20, 1, 0),
    // 3. 本日の調整(20日未満ならまだ今月分は通過していないので差し引く)
    本日調整, IF(DATE_FORMAT(TODAY(),"D") < 20, -1, 0),
    // 4. 合算
    結果, 月差 + 異動日調整 + 本日調整,
    // マイナスにならないよう 0 でクランプ
    MAX(0, 結果)
  )
)
「いいね!」 1

ご回答いただきありがとうございます。
Claudeでは質問したことがございませんでしたので盲点でした。
まさに要望通りの挙動となりました。

また、関連して何点か質問がございます。

GPTs、gem等について

Claudeは触ったことが無いのですが、ClaudeでもフォルトンくんやフェリスくんのようなGPTs、gemに該当する物が存在するのでしょうか?

また、フォルトンくんについては画面左上に「作成者はGPT-5.1を推奨しています。現在、GPT-5.3を使用中です。」と表示されますが、引き続きGPT-5.1を使用した方が良いのでしょうか?

計算式プラグインで行高を調整した時に表示内容が追随しない

先ほど長い数式を設定していて気付いたのですが、設定画面で数式の行高を拡げても記載内容が追随して広く表示されないようです。
不具合であればご修正願います。

202600423_screenshot01

数式内でフィールドコードが認識されない

日付フィールド「初回締日」というフィールドを設置しています。
他フィールドの計算式中に「初回締日」を登場させると、「Error: getVal FIELD CODE NOT FOUND: 初回締日」と表示されてしまいます。
フィールドコードも全く同様のはずなのですが、原因が分かりますでしょうか?

202600423_screenshot02

Claudeは触ったことが無いのですが、ClaudeでもフォルトンくんやフェリスくんのようなGPTs、gemに該当する物が存在するのでしょうか?

Projects という機能がありますが、一般公開できません。

また、フォルトンくんについては画面左上に「作成者はGPT-5.1を推奨しています。現在、GPT-5.3を使用中です。」と表示されますが、引き続きGPT-5.1を使用した方が良いのでしょうか?

バージョンによってどの程度変化があるかは検証していませんが、私はとりあえず最新版を使っています。
好みで使い分けでいいと思います。

計算式プラグインで行高を調整した時に表示内容が追随しない

対応可能か検討させていただきます。

数式内でフィールドコードが認識されない

「初回締日」で、試してみましたが問題はありませんでした。
原因としてテキスト中に「見えない制御文字」がある可能性があります。
コピペ時に「見えない制御文字」で含まれていると、それを含めてフィールコードとして扱います。

「見えない制御文字」の例

1. NBSP(ノーブレークスペース)

  • U+00A0
  • 見た目:普通のスペースと同じ
  • 問題:
    • 検索・比較に引っかからない
    • trimしても消えないことがある
  • 混入元:Webページ、Word、PDF

2. ZWSP(ゼロ幅スペース)

  • U+200B
  • 見た目:完全に見えない
  • 問題:
    • 文字列比較が一致しない
    • URLやIDが壊れる
  • 混入元:Web記事、SNS、チャット

3. BOM(Byte Order Mark)

  • U+FEFF
  • 見た目:基本見えない(先頭にだけ出る)
  • 問題:
    • JSONパースエラー
    • 先頭の文字がおかしくなる
  • 混入元:Excel、Windows系ツール

ChatGPT で、チェックができるようです。

:white_check_mark: 一番シンプルな使い方

そのまま貼ってこう言う:backhand_index_pointing_down:

この文字列に見えない文字が含まれているかチェックして
各文字のコードポイントも出して

:backhand_index_pointing_right: するとこんな感じで出せます:

a (U+0061)
[NBSP] (U+00A0)
b (U+0062)

「いいね!」 1

GPTs、gem等について

承知いたしました。
ご丁寧に教えていただき、ありがとうございます。

計算式プラグインで行高を調整した時に表示内容が追随しない

ありがとうございます。
よろしくお願いいたします。

数式内でフィールドコードが認識されない

見えない制御文字というものが存在するのですね。
初めてお聞きいたしました。
ご指示いただいた方法で調べたところ、特段そのような文字は含まれなかったようです。

rex0220様の環境では再現されなかったとのことでしたので、諦めて別の計算方法を利用することにしました。
色々とお手数をおかけしました。
ありがとうございました。