Every 15 minutes
Keep a Google Sheet of every work calendar event
Your sheet always lists every event on your work calendar with its title, time, guests and status, and updates when events change.
- Runs
- Every 15 minutes
- Apps
- Google Calendar, Google Sheets
- AI
- Not needed
- Access
- Calendar read; Sheet edit
Send this to your assistant
Create a ClickRuntime automation: keep a Google Sheet updated with every event on my work calendar: title, time, attendees, and status.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A consultant bills clients by the hour and has to report how many meetings she held with each one. Her calendar has the facts, but getting them into a spreadsheet means exporting, cleaning and re-doing it every time something moves.
This automation keeps a live copy of her calendar in a Google Sheet, so she can filter, total and share meeting data whenever she needs it, and cancelled or moved meetings are already reflected.
What you get out of it
Meeting data you can work with
A sheet can be filtered, totalled and charted in ways a calendar cannot, such as hours per client or meetings per week.
Always current
New, moved and cancelled events are updated in the sheet, so reports never rely on an old export.
Easy to share
An assistant, manager or accountant can see the sheet without access to your calendar itself.
A lasting record
The sheet keeps a history of meetings, useful for timesheets, invoices and year-end reviews.
How it works
What happens, step by step
Every 15 minutes ClickRuntime asks your Google Calendar for events that are new or changed since the last check.
If nothing has changed, it stops there.
For each changed event it finds the matching row in your sheet and updates it, or adds a new row if the event is new.
Each row holds the title, start and end time, guests and status.
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
- Act only on the items that match your own rules, and skip the rest
- 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 google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, state, report_fetched
SHEET_ID = "your-spreadsheet-id"
@on_trigger
def run(event):
creds = Credentials(credentials.connection("google", "work"))
cal = build("calendar", "v3", credentials=creds, cache_discovery=False).events()
token = state.get("sync_token")
res = cal.list(calendarId="primary", syncToken=token, singleEvents=True).execute() if token else \
cal.list(calendarId="primary", singleEvents=True, maxResults=2500).execute()
items = res.get("items", [])
report_fetched(len(items))
if not items:
return {"changed": 0}
sheet = build("sheets", "v4", credentials=creds, cache_discovery=False).spreadsheets().values()
ids = [r[0] if r else "" for r in sheet.get(spreadsheetId=SHEET_ID, range="Events!A2:A").execute().get("values", [])]
new_rows = []
for e in items:
row = [e["id"], e.get("summary", ""), e.get("start", {}).get("dateTime", ""), e.get("end", {}).get("dateTime", ""),
", ".join(a["email"] for a in e.get("attendees", [])), e.get("status", "")]
if e["id"] in ids:
n = ids.index(e["id"]) + 2
sheet.update(spreadsheetId=SHEET_ID, range=f"Events!A{n}:F{n}", valueInputOption="RAW", body={"values": [row]}).execute()
else:
new_rows.append(row)
if new_rows:
sheet.append(spreadsheetId=SHEET_ID, range="Events!A:F", valueInputOption="RAW", body={"values": new_rows}).execute()
state.set("sync_token", res.get("nextSyncToken"))
return {"changed": len(items)}FAQ
Common questions
What happens when a meeting is cancelled?
Will moved meetings create duplicate rows?
Can I log more than one calendar?
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
Invite new sheet registrants to your calendar event
Each new email in your registrations sheet is added as a guest to your event and gets a calendar invite.
See how it worksPut unpaid bills from a sheet into your calendar on their due dates
Every unpaid bill in your sheet shows up in your calendar on its due date with a reminder, and the event updates if the amount changes.
See how it worksFill cancelled appointments from your waitlist sheet
When an appointment is cancelled, you get an email naming the next person on your waitlist to offer the slot to.
See how it worksKeep exploring
Set up “Keep a Google Sheet of every work calendar event” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.