How to turn Google Calendar into a timesheet in Google Sheets
If you bill clients by the hour, your calendar probably already has most of the information you need: who you met, when, and for how long. The hard part is getting it out of Google Calendar and into a spreadsheet where you can total hours per client. Here are three ways to do it, from free and manual to fully automatic.
Method 1: Export your calendar (free, manual)
- In Google Calendar, open Settings → Import & export → Export. You get a .zip with one .ics file per calendar.
- The .ics format isn't a spreadsheet, so convert it with any "ICS to CSV" converter, then open the CSV in Google Sheets.
- Add a column for duration:
=(END-START)*24gives hours. - Add a "Client" column and fill it in by hand, then build a pivot table: Rows = Client, Values = SUM of hours.
Good for: a one-off report. Downsides: it exports your whole calendar history, time zones can shift, and you redo every step each month.
Method 2: A small Apps Script (free, for the technical)
Open a Google Sheet, choose Extensions → Apps Script, paste this, and run exportEvents:
function exportEvents() {
var start = new Date('2026-09-01'), end = new Date('2026-10-01');
var events = CalendarApp.getDefaultCalendar().getEvents(start, end);
var rows = [['Date', 'Title', 'Hours']];
events.forEach(function (e) {
if (e.isAllDayEvent()) return;
rows.push([e.getStartTime(), e.getTitle(),
(e.getEndTime() - e.getStartTime()) / 36e5]);
});
var sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.getRange(1, 1, rows.length, 3).setValues(rows);
}
You'll still need to map events to clients (for example with =IF(REGEXMATCH(B2,"(?i)acme"),"Acme","")) and build a pivot table for totals. Rounding to 15-minute increments needs =CEILING(C2, 0.25).
Good for: people comfortable editing code. Downsides: you maintain it yourself, and declined meetings, all-day events and rates need extra logic.
Method 3: Calendar Timesheet add-on (one click)
Calendar Timesheet does all of the above inside Google Sheets:
- Pick a calendar and date range.
- Write rules like
acme => Acme Corp | 120(keyword → client → hourly rate), or start event titles with[Client]. - Click Generate timesheet and get a detailed Timesheet tab plus a Client Summary with hours and amount per client.
- Round to 6, 15 or 30 minutes; all-day events and declined meetings are skipped automatically.
It's free for up to 30 events per report; Pro ($4/month) removes the limit. Your calendar data never leaves your Google account.
Tips for accurate billable hours
- Name events consistently. A client keyword or a
[Client]prefix in every work block makes matching reliable. - Block focus time on your calendar. Deep work that isn't a meeting is still billable, so put it on the calendar.
- Decide your rounding rule upfront and state it in your contract (e.g. "billed in 15-minute increments, rounded up").
- Review before invoicing. Any automated report is only as good as your calendar.