Bouke
Bouke

Reputation: 660

Adding events in bulk to Google Calendar API with PHP

What is the best way I could add possibly 10,000 to 20,000 events at once to a Google Calendar with PHP?

If I try adding them separately I get a "limit exceeded" error far before the daily max.

I've also been looking at importing ICAL/ICS files but I also can't seem to find a function for this besides the calendar subscriptions. Calendar Subscriptions are great but I need to have almost "real-time" updates in my calendars when an event gets changed and it's unclear when calendar subscriptions get updated this could take as much as a day from the initial change in the ICS file.

Upvotes: 0

Views: 1635

Answers (1)

Natali
Natali

Reputation: 51

Need to use Batch Requests. A batch request consists of multiple API calls combined into one HTTP request. Batch processing is a known feature request and is actively worked on. Read the following article about it: https://developers.google.com/google-apps/calendar/batch

See my multipleInsert function for example:

class My_google_calendar
{
  ...

  /** Add single Event for Student */
  function addEvent($lesson, $instructor, $return_request = false, $enable_attendees = false)
  {
    $calendar = $this->getGoogleCalendar(); // get calendar service variable

    $lesson_from = date(DATE_RFC3339, $lesson->from);
    $lesson_to = date(DATE_RFC3339, $lesson->from + $lesson->duration); 

    $event = new Google_Service_Calendar_Event();
    $event->setSummary('Lesson with student: '$lesson->student_full_name);

    $start = new Google_Service_Calendar_EventDateTime();
    $start->setDateTime($lesson_from); 
    $start->setTimeZone($this->getGoogleCalendarTimeZone());
    $event->setStart($start);

    $end = new Google_Service_Calendar_EventDateTime();
    $end->setDateTime($lesson_to);
    $end->setTimeZone($this->getGoogleCalendarTimeZone());
    $event->setEnd($end);
    $event->setColorId(4);

    $description = "...";
    $event->setDescription($description);

    if (isset($student->email) && $enable_attendees) {
      $attendee1 = new Google_Service_Calendar_EventAttendee();
      $attendee1->setResponseStatus('needsAction');
      $attendee1->setEmail($student->email);
      $attendees = array($attendee1);
      $event->setAttendees($attendees);
    }

    $createdEvent = $this->calendar->events->insert($this->calendar_id, $event, array('fields' => 'id'));
    return $return_request ? $createdEvent : $createdEvent->getId();
  }

  /** Push group of events to the Calendar */
  function multipleInsert ($lessons, $instructor)
  {
    $this->use_batch = true;
    $this->client->setUseBatch($this->use_batch);
    $batch = new Google_Http_Batch($this->client);

    foreach($lessons as $time => $lesson) {      
        $lesson = array_shift($group['lessons']);
        $req = $this->addEvent($lesson, $instructor, true);
        $batch->add($req, $time);
      }
    }
    $results = $batch->execute();

    return $results;
  }

}

Upvotes: 1

Related Questions