Kayabyte

How to turn Google Calendar into a timesheet (hours per client)

By Caner Kaya, Kayabyte

Google Calendar doesn’t total your hours per client or project. Its closest feature, Time Insights, shows how much time you spend in meetings and with whom, and only on some work and school accounts. For a real timesheet you need to get your events into Google Sheets and add them up there. You can do that for free with Google’s own Apps Script timesheet sample, a short script of your own, or a few formulas.

Below is each option, starting with what Google has built in.

Can Google Calendar show hours per client on its own?

Not directly. The built-in feature is Time Insights, described in View how you spend time in meetings.

Who has it: it’s for work and school accounts. Google’s admin help lists Business Plus, Enterprise Standard and Enterprise Plus, Education Fundamentals, Education Standard and Education Plus, and Nonprofits (Turn Time Insights on or off for users). Personal Gmail accounts, Business Starter and Business Standard aren’t on that list. Your admin can also turn it off.

How to open it:

  1. Open Google Calendar on a computer. Time Insights isn’t in the mobile app.
  2. On the left, click More insights.
  3. Change the date range by changing your calendar view (day, week, month and so on).

What it shows:

What it counts is the catch for client work. An event only counts if you accepted it, it has at least one other guest, it’s marked Busy and it’s shorter than 8 hours. A block you put in your calendar for “Acme: write report”, with no guests, isn’t a meeting by those rules.

Google also lets you put labels on events and track them in Time Insights (Use labels to track calendar entries), which is the closest it comes to per-client time. Google’s articles don’t say whether labelled events follow the same meeting rules, and neither article mentions exporting the numbers. If you have Time Insights, try a label per client for a week and compare it with what you know you worked.

Can I export Google Calendar to a spreadsheet?

Google Calendar exports to .ics, not to a spreadsheet. Google explains it in Export events from Google Calendar:

  1. Open Google Calendar on a computer. Exporting isn’t possible in the mobile app.
  2. For all your calendars: Settings > Import & export > Export. A .zip file downloads with one .ics file per calendar.
  3. For one calendar: point to it under My calendars, click More > Settings and sharing, then Export calendar. An .ics file downloads.

Limits worth knowing:

So the export is a backup format. It isn’t a practical route to a timesheet.

Is there a free Google template for a calendar timesheet?

Yes. Google’s Apps Script samples include Record time & activities in Google Calendar & Google Sheets, maintained by Google with help from Google Developer Experts.

  1. Open the sample page and use its Make a copy link. You get a spreadsheet with the script attached.
  2. In the copy, choose myTime > Settings, authorize the script, pick your calendars and the period, and save.
  3. Choose myTime > Sync calendar events. Each event becomes a row in the Hours sheet, with start, end and duration.
  4. Add your customers, projects and tasks in the Categories sheet, then choose a customer, project and task for each event from the dropdowns.
  5. The Dashboard sheet shows daily and weekly totals and totals by customer, project and task.

The sample is free and well built. The work is in step 4: every event needs a customer chosen by hand. Settings also include options to overwrite event titles and descriptions in Calendar with the values in the sheet, so read them before you save.

Can I total hours per client with a short script?

If your event titles already name the client (“Acme kickoff”, “Globex review”), a script can do the sorting for you. Choose Extensions > Apps Script in a spreadsheet (Google’s guide), paste this, change the client names and dates, and click Run:

function hoursPerClient() {
  const clients = ['Acme', 'Globex'];   // words that appear in your event titles
  const from = new Date(2026, 9, 1);    // 1 October 2026 (months count from 0)
  const to = new Date(2026, 10, 1);     // up to 1 November 2026

  const events = CalendarApp.getDefaultCalendar().getEvents(from, to);
  const totals = {};
  events.forEach(e => {
    if (e.isAllDayEvent()) return;
    if (e.getMyStatus() === CalendarApp.GuestStatus.NO) return; // declined
    const type = e.getEventType();
    if (type === CalendarApp.EventType.OUT_OF_OFFICE ||
        type === CalendarApp.EventType.WORKING_LOCATION) return;
    const title = e.getTitle().toLowerCase();
    const client = clients.find(c => title.includes(c.toLowerCase())) || 'Unassigned';
    const hours = (e.getEndTime() - e.getStartTime()) / 3600000;
    totals[client] = (totals[client] || 0) + hours;
  });

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Hours') || ss.insertSheet('Hours');
  sheet.clear();
  const rows = Object.entries(totals).map(([c, h]) => [c, Math.round(h * 100) / 100]);
  sheet.getRange(1, 1, rows.length + 1, 2).setValues([['Client', 'Hours'], ...rows]);
}

It writes one row per client to a sheet called Hours, plus an Unassigned row for everything else. The methods it uses are in Google’s Calendar and CalendarEvent reference.

What it doesn’t do:

Can I do it with formulas instead?

Yes, once your events are in a sheet (from Google’s sample above, or any import that gives you a title, start and end per event). Say the title is in column A, start in B and end in C:

  1. Hours in D2: =(C2-B2)*24. Sheets stores date-times in days, so multiplying by 24 gives hours.
  2. Client in E2: =IFS(REGEXMATCH(LOWER(A2),"acme"),"Acme",REGEXMATCH(LOWER(A2),"globex"),"Globex",TRUE,"Unassigned"). Add a pair for each client.
  3. Total for one client: =SUMIFS(D:D,E:E,"Acme") (SUMIFS).
  4. All clients at once: select the data and choose Insert > Pivot table (Google’s guide). Put Client under Rows and Hours under Values. To split by month, add a column with =TEXT(B2,"yyyy-mm") and put it under Columns.

Filter out all-day and declined events before you total. An all-day event can show up as 24 hours, and a declined meeting is time you didn’t spend.

Where the built-in options stop

An add-on that builds the timesheet from rules

Full disclosure: I built Kayabyte Calendar Sync & Timesheets, an add-on for Google Sheets™ that works with Google Calendar™.

What it doesn’t do: it totals calendar time, so it’s only as accurate as your calendar. It doesn’t run a timer, apply hourly rates or create invoices. Overlapping events are each counted in full, and an event counts in the week or month it starts. Timesheets, importing several calendars at once and unlimited rows are part of Pro ($5 per user per month, with a 14-day free trial). Your calendar data stays in your own Google account and isn’t sent to Kayabyte.

It’s on the Google Workspace™ Marketplace.

FAQ

Does Time Insights work on a personal Gmail account? Google describes it for work and school accounts, and its admin help lists only some Google Workspace editions. Personal accounts aren’t mentioned.

Can I see Time Insights on my phone? No. Google says you can only view it on a computer.

Why does my meeting not show up in Time Insights? It only counts events you accepted, with at least one other guest, marked Busy and shorter than 8 hours.

Can I export Google Calendar to Excel or Google Sheets directly? No. The export is .ics, which Sheets doesn’t import. Use a script, Google’s timesheet sample or an add-on to get events into a sheet.

Last checked: 22 October 2026

Questions or corrections: support@kayabyte.dev. Google Sheets™, Google Calendar™, Google Workspace™ and Google Apps Script™ are trademarks of Google LLC. Kayabyte is an independent developer and is not affiliated with or endorsed by Google LLC.