LoginSignup
13
14

More than 5 years have passed since last update.

golangで、 google calendar api v3 を使ってカレンダーにイベントの登録と更新を行う

Posted at

概要

前回の続きです。
前回は、Client IDの取得とOAuth認証でアクセストークンを取得と、CalendarListまでを行いました。
今回は、イベントの新規登録と更新を行います。

Event構造体

Event構造体を用意してEvents.Insertで登録します。
Event構造体は以下のように定義する事で繰り返しイベント等も登録できるようです。

Event構造体
import "code.google.com/p/google-api-go-client/calendar/v3"

    event := calendar.Event{
        Id:      "123456abcdef", // ID(適当なstring)
        Summary: "test test",  // タイトル
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`, //開始日時
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`, //終了日時
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{  // 繰り返しの指定(繰り返さない場合は定義不要)
            "RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20140801T000000Z", // 平日の月〜金、終了日が2014/08/01の00:00
            "EXDATE:20140716T123000", // 例外日時1(※繰り返しから例外日を指定したい場合)
            "EXDATE:20140717T123000", // 例外日時2
        },
    }

ここで最低限必要なのはSummaryStart:End:なのかな。それ以外は不要なら省略すればよい。他にもいろいろありますgodocのEventに載ってます。

Eventの登録、更新

実際の登録やら更新処理ですが、
また後でテストしやすいようにinterfaceにして、カレンダー操作メソッドをラップします。

google-clender.go
package lib

import (
    "net/http"

    "code.google.com/p/google-api-go-client/calendar/v3"
)


type Calendar interface {
    Get(string) (*calendar.Event, error)
    Insert(*calendar.Event) (*calendar.Event, error)
    Update(string, *calendar.Event) (*calendar.Event, error)
}

type GoogleCalendar struct {
    calendarId string
    svc        *calendar.Service
}

func NewGoogleCalendar(client *http.Client, calendarId string) *GoogleCalendar {
    this := &GoogleCalendar{}
    this.svc, _ = calendar.New(client)
    this.calendarId = calendarId
    return this
}
func (this *GoogleCalendar) Get(id string) (*calendar.Event, error) {
    return this.svc.Events.Get(this.calendarId, id).Do()
}
func (this *GoogleCalendar) Insert(event *calendar.Event) (*calendar.Event, error) {
    return this.svc.Events.Insert(this.calendarId, event).Do()
}
func (this *GoogleCalendar) Update(id string, event *calendar.Event) (*calendar.Event, error) {
    return this.svc.Events.Update(this.calendarId, id, event).Do()
}
func (this *GoogleCalendar) List() (*calendar.Events, error) {
    return this.svc.Events.List(this.calendarId).Do()
}
func (this *GoogleCalendar) ClendarList() (*calendar.CalendarList, error) {
    return this.svc.CalendarList.List().Do()
}

Oauthで、transportに認証トークンを取得のは前回のコードのままです。

main.go

    // OAuthを実行
    err = lib.GoogleOauth(&lib.GoogleToken{&transport}, lib.LocalServerConfig{port, 30, runtime.GOOS})
    if err != nil {
        log.Fatalf("Error Server: %v", err)
        return
    }   

    googleCalendar := lib.NewGoogleCalendar(transport.Client(), "カレンダーID")

    // 新規登録
    event := calendar.Event{
        Id:      "123456abcdef", // ID(適当なstring)
        Summary: "test test",  // タイトル
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`, //開始日時
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`, //終了日時
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{  // 繰り返しの指定(繰り返さない場合は定義不要)
            "RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR;UNTIL=20140801T000000Z", // 平日の月〜金、終了日が2014/08/01の00:00
            "EXDATE:20140716T123000", // 例外日時1(※繰り返しから例外日を指定したい場合)
            "EXDATE:20140717T123000", // 例外日時2
        },
    }

    ret, err := googleCalendar.Insert(&event) // 新規登録
    if err != nil {
        log.Fatalf("Error calendar.InsertEvent: %v", err)
        return
    }
    pretty.Printf("Insertevnet: %# v\n", ret)

    // 更新処理
    event2 := calendar.Event{
        Summary: "test test",
        Start: &calendar.EventDateTime{
            DateTime: `2014-07-15T12:30:00+09:00`,
            TimeZone: "Asia/Tokyo",
        },
        End: &calendar.EventDateTime{
            DateTime: `2014-07-15T13:00:00+09:00`,
            TimeZone: "Asia/Tokyo",
        },
        Recurrence: []string{
            "RRULE:FREQ=WEEKLY;UNTIL=20140801T000000Z",  // 繰り返しを週1回に
            "EXDATE:20140722T123000",  // 例外日時
        },
    }
    ret, err := googleCalendar.Update("123456abcdef",&event2)  // Idを指定して更新
    if err != nil {
        log.Fatalf("Error calendar.UpdateEvent: %v", err)
        return
    }
    pretty.Printf("Updateevnet: %# v\n", ret)

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14