概要
前回の続きです。
前回は、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
},
}
ここで最低限必要なのはSummary
、Start:
と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)