I got a request today along the lines of:
We’re in the process of creating a master calendar of events spreadsheet relevant to [various things]. These [various things] will all then have their own Google calendar so they can be looked at individually, embedded etc and everyone could of course have access to all and view them all via their personal Google calendar, turn different calendars on or off, sync with Outlook etc. etc.
X said “wouldn’t it be great if we made the master spreadsheet with Google docs and it could somehow automate and complete the calendars”.
Sigh…;-) So – is it possible?
I’ve only had a quick play so far with Google Apps script, but yes, it seems to be possible…
Take one spreadsheet, liberally sprinkled with event name, description, start and end times, an optional location, and maybe a even a tag or too (not shown):
The time related columns I specified as a date type using the “Data Validation…” form from the Tools menu:
Now take one Google apps script:
function caltest1() { var sheet = SpreadsheetApp.getActiveSheet(); var startRow = 2; // First row of data to process var numRows = 2; // Number of rows to process var dataRange = sheet.getRange(startRow, 1, numRows, 5); var data = dataRange.getValues(); var cal = CalendarApp.getDefaultCalendar(); for (i in data) { var row = data[i]; var title = row[0]; // First column var desc = row[1]; // Second column var tstart = row[2]; var tstop = row[3]; var loc = row[4]; //cal.createEvent(title, new Date("March 3, 2010 08:00:00"), new Date("March 3, 2010 09:00:00"), {description:desc,location:loc}); cal.createEvent(title, tstart, tstop, {description:desc,location:loc}); } }
(This was largely a copy and paste from Sending emails from a Spreadsheet Tutorial, which I’d half skimmed a week or two ago and seemed to remember contained a howto for bulk mailing from a spreadsheet, and the Apps script Calendar class documentation.)
And here’s the result of running the function:
The email tutorial adds a bit of gloss that allows a further column to contain state information about whether an email has already been set; we could do something similar to specify whether or not an event has been automatically added to the calendar, and if not, add it when the function is run.
Because it can be a pain having to go into the script editor to run the function, it’s easier to just create a menu option for it:
Here’s how:
function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var menuEntries = [ {name: "Shove stuff in calendar", functionName: "caltest2"} ]; ss.addMenu("OUseful", menuEntries); }
I had a little play to see if I could trivially get an RSS feed into the spreadsheet using an =importFeed() formula, and use the details from that to populate the calendar, but for some reason the feed importer function didn’t appear to be working?:-( When I tried using CSV data from a Yahoo RSS2CSV proxy pipe via a =importData() formula, the test function I’d written didn’t appear to recognise the date format…
PS Arghh… the test formula assumes a Date type is being passed to it… Doh!
Hack round importFeed still not working by grabbing a CSV version of the feed into the spreadsheet:
=importdata(“http://pipes.yahoo.com/ouseful/proxy?_render=csv&url=http%3A%2F%2Fopen2.net%2Ffeeds%2Frss_schedule.xml”)
Tweak the calendar event creation formula:
cal.createEvent(title, new Date(tstart), new Date(tstop), {description:desc});
Run the function:
Heh heh :-)
PS it’s also possible to move content from a Google Calendar to a Google spreadsheet, as Grabbing Google Calendar Event Details into a Spreadsheet shows…
PPS it strikes me that the spreadsheets2calendar route provides one way of generating an iCal feed from a list of event times held in a spreadsheet, by popping the events into a Calendar and then making the most of its output formats? A bit like using Yahoo pipes as a quick’n’easy KML generator?
[UPDATE: related, via @mhawksey – Using Google Apps Script for a event booking system (Spreadsheet to Calendar & Site | Form to Spreadsheet, Email and possible Contacts)]
Re: not creating duplicate entries, check out this thread