I track my hours on Google calendar. I know, high-tech, right?
Like a savage, at the end of every month I’d count up the hours for billing — but no more! That’s for the machines.
If getting a list of events from Google’s Calendar API between a specified date range seems useful to you — well, here, have some code:
// The API was installed by composer
require 'vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile('/path/to/config.json'); // Replace this with your JSON file
$client->addScope(Google_Service_Calendar::CALENDAR_READONLY);
$client->setRedirectUri('http://location/of/oauth2callback.php'); // Replace this with your callback URL
// This is my timezone
date_default_timezone_set('America/Los_Angeles');
// Connect to a google account
session_start();
if (!array_key_exists( 'accessToken', $_SESSION ) ) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
die();
}
$accessToken = $_SESSION['accessToken'];
$client->setAccessToken($accessToken);
if ($client->isAccessTokenExpired()) {
if (!array_key_exists( 'refreshToken', $_SESSION ) ) {
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
die();
}
$client->refreshToken($session['refreshToken']);
$session['accessToken'] = $client->getAccessToken();
}
// Retrieve data
$service = new Google_Service_Calendar($client);
$calendarList = $service->calendarList->listCalendarList();
$calendarId = 'calendar/id'; // Replace this with your calendar ID
// Check the current month
$start = date('Y-m-01');
$end = date('Y-m-').date("t");
$optParams = array(
'maxResults' => 2500,
'orderBy' => 'startTime',
'singleEvents' => TRUE,
'timeMin' => dateconv($start),
'timeMax' => dateconv($end, true)
);
try {
$events = $service->events->listEvents($calendarId, $optParams);
} catch( Exception $e ) {
print_r( $e );
}
while(true) {
try {
foreach ($events->getItems() as $event) {
$name = $event->getSummary();
$delta = strtotime($event->getEnd()['dateTime']) - strtotime($event->getStart()['dateTime']);
$hours = $delta/(60*60);
}
} catch( Exception $e ) {
print_r( $e );
}
$pageToken = $events->getNextPageToken();
if ($pageToken) {
$optParams['pageToken'] = $pageToken;
$events = $service->events->listEvents($calendarId, $optParams);
} else {
break;
}
}
You’ll need to specify your calendar ID. You can get a list of all of them like this:
while(true) {
foreach ($calendarList->getItems() as $e) {
echo $e->getId().": ".$e->getSummary()."\n";
}
$pageToken = $calendarList->getNextPageToken();
if ($pageToken) {
$optParams = array('pageToken' => $pageToken);
$calendarList = $service->calendarList->listCalendarList($optParams);
} else {
break;
}
}
But wait, what’s this oauth2callback.php? Basically it’s the location google hits when you confirm the site should be allowed to access your account.
require 'vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfigFile('/path/to/config.json'); // Replace this with your JSON file
$client->setRedirectUri('http://location/of/oauth2callback.php'); // Replace this with your callback URL
session_start();
if ( array_key_exists( 'code', $_REQUEST ) ) {
$_SESSION['accessToken'] = $client->authenticate($_REQUEST['code']);
$_SESSION['refreshToken'] = $client->getRefreshToken();
header('location: index.php');
} else {
echo "error";
}
Now, you may be wondering where this config.json comes from. Basically you have to blah blah the api and create a new client id under credentials blah blah. It’s probably just about as confusing as they could make it, but here’s a link to their wizard and, probably more useful, a link to their PHP quickstart guide. The Step 1: Enable the Google Calendar API section is the one you’re looking for.