この記事の結論
「第1・3月曜の前日」のような繰り返しは、RRULEをやめて実際の日付をRDATEで並べました。2026年8月21日、ごみ出し準備の予定6件をClaudeでGoogle カレンダーに登録し、月ごとの3件は2036年12月分まで入れています。
目次9項目
【無料・メールだけ】Claude Code 2daysセミナー(第二の脳構築講座)の次回開催の案内を受け取る →
Google カレンダーの繰り返しで「第1・3月曜の前日」を入れるとき、僕に必要だったのはRRULEの工夫ではなく、実際の日付をRDATEで並べることでした。毎週の予定はRRULEの終わりのない繰り返しに任せ、月をまたぐことがある予定だけを日付の一覧にして、Claudeに登録させています。
2026年8月21日、地域のごみ収集日の看板をもとに、前の夜の準備予定6件をClaudeに登録させました。毎週の3件はRRULE、月ごとの3件はRDATEで2036年12月分まで並べてあります。
RRULEで書けなかった理由、RDATEとEXDATEの違い、登録で起きたこと、約10年後の延長まで書きます。「第2・第4火曜の前日」のような予定、どう入れればいいの?と迷う方への記録です。
Google カレンダーの繰り返し設定は「第◯曜日の前日」を素直には書けない
「第1月曜」は書けても「第1月曜の前日」をそのまま表す書き方は、繰り返しのルールにありません。前日は月をまたぐことがあるためです。
Google カレンダーの API では、予定の繰り返しを recurrence という欄に書きます。中身は RFC 5545(予定表のデータの国際的な決まり)の RRULE・RDATE・EXDATE の行です。
開発者向け文書には、この欄に DTSTART と DTEND の行は書けないとあり、開始と終了は別の欄で指定します。
ここでいうRRULEとは、「毎週月曜」「毎月第1月曜」のような規則で回を作る行です。RFC 5545 では、曜日の前に数字を付けた 1MO が「その月の第1月曜」、-1MO が「その月の最後の月曜」を表します。
ただ、曜日の指定は「その月の中で何番目か」を数えるだけで、「ある日の1日前」という指定はありません。第1月曜が1日の月は、前日が前の月の末日になります。数え方の単位である「月」の外に出てしまうのです。
画面での設定について、公式ヘルプに書かれている手順は「繰り返さない」の横の矢印から、繰り返しの間隔と終了日を選んで保存する流れです。繰り返しの予定は730回までという上限も書かれています。
「第◯曜日の前日」を選べるかどうかの記載は、僕は見つけられませんでした。
2026年8月21日、ごみ出し準備の予定6件をClaudeに登録させた
登録したのは、ごみの収集日の前の夜、18時から18時30分の準備の予定です。2026年8月21日に6件を作り、全件にもう1人を招待しました。
日付・件数・時刻は、どれも僕の会社の作業の記録に残っています。
看板の決まりでは、前の夜に外へ出すのは不可で、当日の朝までに出します。そこで夜の枠は「家の中でまとめる準備用」とし、そのことを予定の説明欄に書かせました。
6件の内訳は、毎週の予定が3件、月ごとの予定が3件です。何を何曜日の夜に準備するかを表に並べます。
| 準備する夜 | ごみの種類 | 収集日 | 登録の方法 |
|---|---|---|---|
| 毎週月曜 | 一般ごみ・有害ごみ | 火曜 | RRULE(終わりなし) |
| 毎週木曜 | 一般ごみ・有害ごみ | 金曜 | RRULE(終わりなし) |
| 毎週火曜 | プラスチック製容器包装 | 水曜 | RRULE(終わりなし) |
| 第1・3月曜の前の日曜 | びん・かん・金属類 | 第1・3月曜 | RDATE(2036年12月分まで) |
| 第2・4火曜の前の月曜 | 紙類 | 第2・4火曜 | RDATE(2036年12月分まで) |
| 第2・4月曜の前の日曜 | ペットボトル・繊維類 | 第2・4月曜 | RDATE(2036年12月分まで) |
毎週の3件と月ごとの3件で、登録の方法を分けたのが要点です。毎週の方は一度入れれば手入れが要らず、月ごとの方は期限が来る前に日付を足す必要があります。
毎週の3件は RRULE の終わりのない繰り返しで済んだ
毎週の3件は、RRULEに曜日を書くだけで済みました。回数(COUNT)も終了日(UNTIL)も書かなければ、予定は終わりなく続きます。
Google の開発者向け文書には、繰り返しの終わりは COUNT か UNTIL のどちらかで指定すると書かれています。どちらも書かない形が、手入れの要らない予定です。
毎週火曜の朝の収集なら、月曜の夜の予定を次の形で作ります(日付は例です)。
{
"summary": "ごみ出しの準備(一般ごみ)",
"start": { "dateTime": "2030-01-07T18:00:00", "timeZone": "Asia/Tokyo" },
"end": { "dateTime": "2030-01-07T18:30:00", "timeZone": "Asia/Tokyo" },
"recurrence": ["RRULE:FREQ=WEEKLY;BYDAY=MO"]
}
繰り返しの予定では、timeZone の欄が必須です。開発者向け文書では、どの時間帯の暦で回を展開するかを決める欄とされています。時刻つきの予定は、ここを Asia/Tokyo にしておけば日本の暦で回ります。
月ごとの3件は月をまたぐ:第1・3日曜で代用すると年1〜2回ずれる
月ごとの3件は、RRULEで素直に書けませんでした。「第1・3月曜の前日」を「第1・3日曜」で代用すると、年に1〜2回ずれるからです。
ずれるのは、1日が月曜の月です。例えば2030年4月は1日が月曜で、第1月曜の前日は3月31日になります。「4月の第1日曜」は4月7日なので、代用した予定は収集日の6日後に入ってしまいます。
第2・4の収集日は月をまたぎません。第2月曜は早くても8日なので、前日は同じ月の中です。それでも「第2・4日曜」とは一致しない月があります。1日が月曜の月は、第2月曜の前日が第1日曜になるからです。
僕の会社では、年1〜2回ずれる近似をやめて、実際の日付を並べると決めました。
なお RFC 5545 の表を読むと、理屈の上では1本のRRULEで書ける形もあります。月の中の日(BYMONTHDAY)で候補の日を広げ、曜日(BYDAY)で日曜に絞る組み合わせです。
RFC の表では、月ごとの繰り返しで両方を書くと、曜日の指定は「絞り込み」として働きます。
RRULE:FREQ=MONTHLY;BYDAY=SU;BYMONTHDAY=1,2,3,4,5,6,14,15,16,17,18,19,20,-1
1〜6日の日曜は第1月曜の前日、14〜20日の日曜は第3月曜の前日です。-1 は月の最後の日で、そこが日曜なら翌月1日の第1月曜の前日に当たります。
ただ、このルールを Google カレンダーに登録して確かめてはいません。読んで意味をつかみにくい形でもあるので、僕は日付を並べる今の形で十分だと考えています。
RDATE で実際の日付を並べた:RRULE・RDATE・EXDATE の違い
月ごとの3件は、RDATEに実際の日付を並べて登録しました。RRULEを書かず、日付の一覧だけで繰り返しの予定を作る形です。
RDATEとは、規則ではなく日付そのもので回を足す行です。Google の開発者向け文書では、回の全体は「RRULEとRDATEで作った回を合わせ、EXDATEで外したものを除いたもの」と説明されています。
RFC 5545 でも同じ考え方で、重なった回は1つに数えます。
3つの行の違いを並べます。
| 行 | 何を書くか | 向く予定 | 手入れ |
|---|---|---|---|
| RRULE | 規則(毎週月曜・毎月第1月曜など) | 規則どおりに回る予定 | 終わりなしなら不要 |
| RDATE | 日付そのものの一覧 | 規則で書きにくい予定・飛び飛びの予定 | 一覧の最後の日付の前に足す |
| EXDATE | 外す日付 | 休みの回を除く | 外す日が出るたび |
規則で書けるならRRULE、書きにくい予定はRDATE、例外はEXDATEと分けるのが分かりやすいと考えています。EXDATEは、規則が作った回を指す必要があると開発者向け文書にあります。
日付の一覧は、手で打たずに計算で作らせました。記録にある作り方は「第N曜日の前日の18時を python3 で作り、RDATEに入れる」です。考え方を例のコードにすると、次の形になります(年の範囲と時刻は例です)。
from datetime import date, timedelta
def nth_weekday(year, month, weekday, n):
d = date(year, month, 1)
d += timedelta(days=(weekday - d.weekday()) % 7)
return d + timedelta(weeks=n - 1)
dates = []
for y in range(2030, 2032):
for m in range(1, 13):
for n in (1, 3): # 第1・第3
eve = nth_weekday(y, m, 0, n) - timedelta(days=1) # 0=月曜の前日
dates.append(eve.strftime("%Y%m%dT180000"))
print("RDATE;TZID=Asia/Tokyo:" + ",".join(dates))
出てくる行は RDATE;TZID=Asia/Tokyo:20300106T180000,20300120T180000,20300203T180000,... の形です。2030年4月の第1月曜の前日は、ちゃんと3月31日になります。
予定の最初の回(start)には、一覧の最初の日付を入れておきます。
Claude Code から Google カレンダー MCP で登録したときに起きたこと
Claude Code から Google カレンダーのコネクタ(MCP)で登録すると、6件とも登録できました。ただ、頼んでいないものが1つ付いてきました。
作った予定には、オンライン会議の URL が自動で付いていました。僕の会社で使っているコネクタには、それを外す指定がありませんでした。実害はないと記録に残し、そのままにしています。
コネクタで予定を入れるときのつまずきは、ほかにもあります。終日の予定を時刻つきの形で渡すと、時差の変換で1日前に入る件です。僕の会社では12件ずれて、日付だけの形で渡すように直しました。
詳しくはMCPとは?実際につないだ接続先と注意点に書いています。
AIに外部の道具を動かさせると、人が画面で入れたときには起きないずれが出ます。Gmail のコネクタでも、下書きの本文のドメインが別の文字列に化けたことがありました。
その確かめ方はGmail MCPでドメインが化ける原因と確認手順にまとめています。
Google Drive のコネクタでは、50KBを超えるPDFを置けませんでした。その分け方はGoogle Drive MCPで50KB超のPDFが置けない原因に書いています。
僕の会社では、Claudeに予定を入れさせる前に、同じ予定がもう無いかを先に一覧で確かめさせています。ごみ出しの定期予定も、二重に入れないよう確かめる相手として記録に挙がっています。
RDATE 方式の弱点:2036年12月で切れるので延長が要る
RDATEで並べた予定は、一覧の最後の日付で止まります。月ごとの3件は2036年12月分までなので、2036年の後半に日付を足す必要があります。
延長の手順は記録に残してあります。同じ計算で「第N曜日の前日18時」の日付を作り直し、3件の繰り返しの欄を書き換える(update)だけです。新しく予定を作り直さないので、招待や説明欄はそのまま残ります。
約10年後の作業なので、延長が要ることは僕の会社の記録の要約の行にも書いてあります。計算の手順も同じ記録にあるため、記録を読めば同じやり方で延長できます。
公式ヘルプにある730回の上限が、RDATEで並べた日付にも当てはまるかは、公式の記載を見つけられていません。10年以上先まで並べたいときは、上限に近づかない長さで区切り、延長で足していく方が安全だと考えています。
まとめ
- Google カレンダーの繰り返し(RRULE)は「第1月曜」は書けても、「第1月曜の前日」をそのまま表す指定はない
- 「第1・3日曜」で代用すると、1日が月曜の月にずれる。僕の会社の記録では年1〜2回
- 2026年8月21日に6件を登録し、毎週の3件はRRULEの終わりのない繰り返し、月ごとの3件はRDATEで2036年12月分まで並べた
- RDATEは一覧の最後で止まるので、延長の手順と期限を記録に残しておく
- 僕なら、規則で書ける予定はRRULEに任せ、書きにくい予定だけをRDATEの日付の一覧にするところから始めます
よくある質問
Google カレンダーの画面の繰り返し設定だけで「第1月曜の前日」は入れられますか?
公式ヘルプには「繰り返しの間隔と終了日を選ぶ」とあるだけで、「第◯曜日の前日」を選べるという記載は見つけられませんでした。僕の会社では、Claudeにカレンダーの API の形で実際の日付を並べて登録させています。
RDATEで並べた予定は、あとから日付を足せますか?
足せます。予定の繰り返しの欄(recurrence)を、日付を足した一覧で書き換えます。僕の会社では2036年12月分まで入れてあり、2036年の後半に同じ計算で日付を作り直して書き換える予定です。
1回だけ休みにしたいときは、どうすればいいですか?
その回だけを取り消すか、EXDATEで外します。Google の開発者向け文書では、EXDATEは繰り返しのルールが作った回を指す必要があるとされています。RDATEで並べた予定なら、一覧からその日付を消して書き換える方法もあります。
