Calendar Timesheet

How to turn Google Calendar into a timesheet

Updated 12 October 2026. About 7 minutes to read.

If you already put your client work in Google Calendar, you have most of a timesheet. What you do not have is a list with dates and durations, and totals per client. Google Calendar does not produce one: its export is a calendar file, not a table. Here are three ways to get there, from free and manual to fully automatic, and the details that quietly make totals wrong.

Method 1: by hand, in a spreadsheet

Open Google Calendar in week view, open an empty Google Sheet next to it, and type one line per meeting: date, start, end, client. Add a column with =(C2-B2)*24 to get hours, and a total at the bottom.

It costs nothing and works for a handful of meetings a week. Past that, it takes time every week, and typing errors are invisible: nobody re-checks a typed 14:30 against the calendar.

Method 2: a short script in Google Sheets

Google Sheets can read your calendar with Apps Script, Google's built-in scripting. In a new sheet, open Extensions, then Apps Script, paste this, adjust the two dates, and run listMonth. Google will ask you to authorise your own script.

function listMonth() {
  var cal = CalendarApp.getDefaultCalendar();
  var start = new Date(2026, 9, 1), end = new Date(2026, 10, 1); // October 2026
  var rows = [['Date', 'Start', 'End', 'Hours', 'Title', 'Colour']];
  cal.getEvents(start, end).forEach(function (e) {
    if (e.isAllDayEvent()) return;
    var hours = (e.getEndTime() - e.getStartTime()) / 3600000;
    rows.push([e.getStartTime(), e.getStartTime(), e.getEndTime(), hours, e.getTitle(), e.getColor()]);
  });
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.clear();
  sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}

Months in Apps Script count from 0, so new Date(2026, 9, 1) is 1 October. You get one line per event with its duration and colour number. From there, a pivot table or SUMIF gives totals (the counting guide shows how).

This is a good free option if you are comfortable with a little code. It reads only your main calendar, and it inherits every pitfall listed below unless you handle them yourself.

Method 3: automatically, with an add-on

An add-on does the same reading for you, on a schedule. Calendar Timesheet, which we make, reads the calendars you choose every hour, puts each meeting under a client by colour, calendar, a word in the title or the guest's email domain, and keeps a This month tab up to date. On the 1st it closes the previous month into one statement per client and emails you a summary. Export of any period is free; clients, rates and autopilot are part of Pro, with a trial that lasts until your first month-end.

Other add-ons export raw events to a sheet; that suits people who want to build their own report. The pitfalls below are what separates a raw export from a timesheet you can invoice from.

The pitfalls that make totals wrong

Meetings across a boundary

A workshop from 22:00 to 01:00 on 31 October belongs to two months. Counting it whole in October overbills October and leaves November short. Only the part inside the period should count.

Declined and unanswered invitations

Calendar scripts return events you declined. If someone invites you to a meeting you turned down, it still lands in a naive export. Filter on your own response.

All-day events and "free" time

Holidays, travel days and reminders are often all-day events or marked "free". They are not work time, and an all-day event read as 24 hours wrecks a total.

The same meeting in two calendars

If a client invites you and you also copy the meeting into your work calendar, an export of both calendars counts it twice. Events share an identifier (iCalUID) you can use to keep one.

Recurring meetings with exceptions

A weekly call moved one week and cancelled another must count as it happened, not as the series says. Read expanded occurrences, not the series.

Time zones

If your sheet and a calendar use different time zones, start times shift. Use one time zone for the timesheet, usually the sheet's.

A timesheet you can trust: the checklist

  1. Choose one way to tag clients (colour, calendar, title word or guest domain) and keep to it.
  2. Count only the part of each meeting inside the period.
  3. Leave out declined invitations, all-day events and time marked free.
  4. Count a meeting found in two calendars once.
  5. Freeze each month once invoiced, so later edits in the calendar do not change what you sent.

Want it done for you every hour? Calendar Timesheet handles each point of this checklist, in your own Google Sheet, without an account.

Get the free sheet