javascriptgoogle-apps-scriptgoogle-sheetsgoogle-calendar-apiextended-properties

How can I retrieve an extended property for a Google Calendar event?


I have several extended properties I've added to various events using PHP. Now I want to retrieve them using Google Apps Script in Google Sheets. I'm able to access the calendar, all events and the standard data elements like this:

 var mycal = "... my calendar id ....";
 var cal = CalendarApp.getCalendarById(mycal);

 var events = cal.getEvents(new Date("January 12, 2015 00:00:00 CST"), new Date("January 18, 2017 23:59:59 CST"))

 for (var i=0; i < events.length; i++) {

      var myStart = events[i].getStartTime();
      var myTitle = events[i].getTitle();
      var myDesc = events[i].getDescription();
      var myTalkNo = ??

 }

How do I query the private extended property named "talk-number" on each event?


Solution

  • Within Google Apps Script you have two ways to interact with Google Calendar; the Calendar Service and the Advanced Calendar Service (aka Calendar API) which must be enabled via Advanced Google Services.

    The ACS uses the resource representations from the Google Calendar API, so the extendedProperties are available as a part of the event objects you can obtain through the API.

    Here's a simple modification of the example from the ACS docs that will log the "talk-number" for every event that has one.

    function listNext10Events() {
      var calendarId = 'primary';
      var now = new Date();
      var events = Calendar.Events.list(calendarId, {
        timeMin: now.toISOString(),
        singleEvents: true,
        orderBy: 'startTime',
        maxResults: 10
      });
      if (events.items && events.items.length > 0) {
        for (var i = 0; i < events.items.length; i++) {
          var event = events.items[i];
          if (event.start.date) {
            // All-day event.
            var start = parseDate(event.start.date);
            Logger.log('%s (%s)', event.summary, start.toLocaleDateString());
          } else {
            var start = parseDate(event.start.dateTime);
            Logger.log('%s (%s)', event.summary, start.toLocaleString());
          }
          /********************************************************************/
          if (event.hasOwnProperty("talk-number"))
            Logger.log(event.extendedProperties.private["talk-number"]);
          /********************************************************************/
        }
      } else {
        Logger.log('No events found.');
      }
    }
    

    You can update your function with this:

    var eventId = events[i].getId().replace(/@.*/,'');  // Remove @google.com from eventId
    var event = Calendar.Events.get(calendarId, eventId)
    myTalkNo = event.extendedProperties.private["talk-number"];