Skip to content

Instantly share code, notes, and snippets.

@khun84
Last active February 4, 2020 03:09
Show Gist options
  • Save khun84/8bd17620c7f550ab2d2c416145509e1e to your computer and use it in GitHub Desktop.
Save khun84/8bd17620c7f550ab2d2c416145509e1e to your computer and use it in GitHub Desktop.
How to implement google calendar api in Ruby

Steps

Somewhat helpful link: https://developers.google.com/api-client-library/ruby/

Go to: https://console.developers.google.com/iam-admin/projects
Click "+Create Project"
Enter a "Project name" and "Project ID" and click "Create"
Under "Library" select "Calendar API"
Click ">Enable"
Return to: https://console.developers.google.com/iam-admin/projects
Click "Service Accounts"
Click "Select a project"
Choose your project and click "Open"
Click "+Create Service Account"
Enter a "Service account name" and choose a "Role" (I chose "editor")
Check "Furnish a new private key"
Click "Create"

A JSON file will be downloaded to your computer. Move this file to some place accessible by your application and rename it to "google_api.json" (or whatever you want as long as it matches the correct path below). Ensure that only the application can access this file (it contains a private key).

Copy the "client_email" from the JSON file and go to the settings of the Google Calendar that you want this application to access.
Click "Calendars"
Choose the correct calendar
Click "Change sharing settings" found under "Calendar Address:"
Add the email you copied and select the proper permission
Click "Save"
Copy the "Calendar ID" to the right of "Calendar Address:"
You can hardcode the calendar ID below or put it in YAML file or as an environmental variable.

Here is a sample file to authorize and access the Googe Calendar API:

# http://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/CalendarV3
require 'googleauth'
require 'google/apis/calendar_v3'

class MyApp::GoogleCalendar

  def initialize
    authorize
  end

  def service
    @service
  end

  def events(reload=false)
    # NOTE: This is just for demonstration purposes and not complete.
    # If you have more than 2500 results, you'll need to get more than    
    # one set of results.
    @events = nil if reload
    @events ||= service.list_events(calendar_id, max_results: 2500).items
  end

private

  def calendar_id
    @calendar_id ||= # The calendar ID you copied in step 20 above (or some reference to it).  
  end

  def authorize
    calendar = Google::Apis::CalendarV3::CalendarService.new
    calendar.client_options.application_name = 'App Name' # This is optional
    calendar.client_options.application_version = 'App Version' # This is optional

    # An alternative to the following line is to set the ENV variable directly 
    # in the environment or use a gem that turns a YAML file into ENV variables
    ENV['GOOGLE_APPLICATION_CREDENTIALS'] = "/path/to/your/google_api.json"
    scopes = [Google::Apis::CalendarV3::AUTH_CALENDAR]
    calendar.authorization = Google::Auth.get_application_default(scopes)

    @service = calendar
  end

end

So now you can call cal = MyApp::GoogleCalendar.new and get the events with cal.events. Or you can make calls directly with cal.service.some_method(some_args), rather than creating methods in this file.

Reference

https://stackoverflow.com/questions/40722687/how-to-set-up-google-calendar-api-using-ruby-client-for-server-to-server-applica

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment