Daily
Put birthdays, anniversaries and probation dates on the calendar
Birthdays, work anniversaries and probation end dates from your employee sheet appear as calendar events ahead of time.
- Runs
- Daily
- Apps
- Google Calendar, Google Sheets
- AI
- Not needed
- Access
- Sheet read; Calendar write
Send this to your assistant
Create a ClickRuntime automation: every day, check my employee sheet and create calendar events for upcoming birthdays, work anniversaries and probation end dates.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
The owner of a twenty-person company keeps staff details in a spreadsheet. Birthdays get missed, a five-year anniversary passes without a word, and a probation review is noticed two weeks after it was due, which is awkward for everyone and sometimes a contract problem.
This automation reads your employee sheet every day and adds the coming dates to your calendar, so they show up alongside your meetings where you will actually see them.
What you get out of it
Probation reviews happen on time
A review that slips past its date can create contract and fairness problems. A calendar event makes the deadline visible in advance.
People feel remembered
Marking birthdays and anniversaries is a small gesture that matters, and it no longer depends on someone's memory.
The sheet stays the source
Add a new starter to the sheet as usual and their dates reach the calendar the next day. Nothing has to be entered twice.
Shared with whoever needs it
Events can go on a shared team or HR calendar, so managers see the dates for their own people.
How it works
What happens, step by step
Every day ClickRuntime reads your employee sheet.
It finds birthdays, work anniversaries and probation end dates coming up in the next 30 days.
Dates that already have an event are skipped.
A new all-day event is added to your Google Calendar for each remaining date.
Before it runs live
- Connect Google Calendar
- Connect your Google Sheets account and pick the spreadsheets it may use
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Google Calendar and Google Sheets steps into one automation
Under the hood
The code that runs this automation
from datetime import date, timedelta
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, state
SHEET_ID = "your-spreadsheet-id"
@on_trigger
def run(event):
creds = Credentials(credentials.connection("google", "work"))
rows = build("sheets", "v4", credentials=creds, cache_discovery=False).spreadsheets().values().get(
spreadsheetId=SHEET_ID, range="Staff!A2:D").execute().get("values", [])
cal = build("calendar", "v3", credentials=creds, cache_discovery=False)
done, today, added = set(state.get("done") or []), date.today(), 0
for name, birthday, start, probation in [(r + [""] * 4)[:4] for r in rows]:
dates = []
for label, raw, yearly in (("Birthday", birthday, True), ("Work anniversary", start, True), ("Probation ends", probation, False)):
if raw:
d = date.fromisoformat(raw)
d = d.replace(year=today.year if d.replace(year=today.year) >= today else today.year + 1) if yearly else d
dates.append((f"{label}: {name}", d))
for title, d in dates:
key = f"{title}|{d}"
if today <= d <= today + timedelta(days=30) and key not in done:
cal.events().insert(calendarId="primary", body={"summary": title, "start": {"date": d.isoformat()},
"end": {"date": (d + timedelta(days=1)).isoformat()}}).execute()
done.add(key); added += 1
state.set("done", list(done))
return {"added": added}FAQ
Common questions
Which columns does it need?
How far ahead are events created?
Will it create the same event twice?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Turn your week's calendar into a timesheet by client
Every Friday your calendar events are sorted by client or project and written to your timesheet sheet with the hours for each.
See how it worksSchedule backlog refinement meetings from your sheet
Before each sprint, the top backlog items are picked from your sheet and refinement meetings are put in the team's calendars.
See how it worksSchedule study sessions around your calendar until the exam
Your syllabus topics are turned into study sessions placed in your free time, all finished before the exam date.
See how it worksKeep exploring
Set up “Put birthdays, anniversaries and probation dates on the calendar” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.