2017-01-24 2 views
0

Ich versuche, einen Google-Kalender mit meiner Rails-Anwendung zu synchronisieren. Ich habe die Dokumentation von Google verfolgt: Synchronize Resources Efficiently.Google Kalender inkrementelle Synchronisierung mit initial time_max

Mein Ziel ist es, Ereignisse nur ein Jahr in die Zukunft zu synchronisieren und wiederkehrende Ereignisse in einzelne Ereignisse aufzuteilen, so dass ich mich nicht mit der Komplexität von Wiederholungsregeln und der Erstellung untergeordneter Ereignisse für wiederkehrende Elternereignisse befassen muss.

Während der ersten Synchronisierung habe ich time_max auf 1 Jahr in der Zukunft eingestellt und während der ersten Synchronisierung bekomme ich nur wiederkehrende Ereignisse bis zu einem Jahr in die Zukunft.

Wenn ich eine inkrementelle Synchronisierung führe, übergebe ich das Sync-Token und erwarte, dass wiederkehrende Ereignisse innerhalb eines Jahres nach der ursprünglichen Synchronisation time_max begrenzt sind, aber das sehe ich nicht. Ich sehe Ereignisse weit nach einem Jahr (~ 10 Jahre).

Während der inkrementellen Synchronisierung konnte ich kein time_max einstellen, da ich diesen erwarteten Fehler von Google erhalte.

Fehler abgefangen syncTokenWithRequestRestrictions: Das Sync-Token kann nicht mit anderen Anforderungseinschränkungen verwendet werden.

Hier ist der Code, den ich verwenden, um Ereignisse von Google in meine Anwendung

def sync_from_google 
    next_page_token = nil 

    begin 
     if sync_token.nil? # full sync 
     response = @calendar_service.list_events(google_id, 
      time_min: Time.now.utc.strftime("%FT%TZ"), 
      time_max: 1.year.from_now.utc.strftime("%FT%TZ"), 
      single_events: true) 
     else # incremental sync 
     response = @calendar_service.list_events(google_id, 
      sync_token: sync_token, 
      page_token: next_page_token, 
      single_events: true) 
     end 

     response.items.each do |gevent| 
     GoogleCalendarEvent.create_event(self.id, gevent, nil) 
     end 
     next_page_token = response.next_page_token 

    rescue Google::Apis::ClientError => error 
     if error.status_code == 410 
     self.unsync 
     end 
    end while (response.next_sync_token.nil?) 

    update_attributes(synced: true, sync_token: response.next_sync_token) 
end 

Bin ich ein Dummy ist zu synchronisieren und offensichtlich etwas fehlt?

Sollten sync_token, die von der anfänglichen Synchronisierung bereitgestellt werden, den Zeitraum der gewünschten Ereignisse speichern?

Gibt es eine andere Möglichkeit, den Zeitbereich der inkrementellen Synchronisierung zu begrenzen?

+0

Haben Sie versucht, das Entfernen 'time_max' zu sehen, ob dies noch auftreten? Ist dies nicht der Fall, kann es sich um einen der Filter handeln, mit denen das Sync-Token nicht verwendet werden kann, wie im [Beispielcode] (https://developers.google.com/google-apps/calendar/v3/sync#sample_code) angegeben. –

+0

SingleEvents = true ist bei incremental sync erlaubt (nur die timeMin und timeMax sind nicht und Sie sollten uninteressante Einträge filtern, die mit incremental sync kommen) – luc

Antwort

1

Ich beendete das Entfernen der single_events param dann manuelle Durchläufe Instanzen eines wiederkehrenden Ereignisses manuell mit einer definierten time_min & time_max.

Hier ist der aktualisierte Code, falls jemand in der Zukunft darauf stößt.

def sync_from_google 
    next_page_token = nil 

    begin 
     if sync_token.nil? # full sync 
     response = @calendar_service.list_events(google_id, 
      time_min: Time.now.utc.strftime("%FT%TZ"), 
      time_max: 1.year.from_now.utc.strftime("%FT%TZ")) 
     else # incremental sync 
     response = @calendar_service.list_events(google_id, 
      sync_token: sync_token, 
      page_token: next_page_token) 
     end 

     response.items.each do |gevent| 
     if gevent.recurrence 
      sync_reccuring_events(gevent) 
     else 
      GoogleCalendarEvent.create_event(self.id, gevent, nil) 
     end 
     end 
     next_page_token = response.next_page_token 

    rescue Google::Apis::ClientError => error 
     if error.status_code == 410 
     self.unsync 
     end 
    end while (response.next_sync_token.nil?) 

    update_attributes(synced: true, sync_token: response.next_sync_token) 
end 

und die zugegebenen Verfahren einer Schleife durch Instanzen eines wiederkehrenden Ereignisses

def sync_reccuring_events(google_event) 
    next_page_token = nil 

    begin 
     response = calendar_service.list_event_instances(google_id, 
     google_event.id, 
     time_min: Time.now.utc.strftime("%FT%TZ"), 
     time_max: 1.year.from_now.utc.strftime("%FT%TZ"), 
     page_token: next_page_token) 

     response.items.each do |gevent| 
      GoogleCalendarEvent.create_event(self.id, gevent, nil) 
     end 
     next_page_token = response.next_page_token 

    end while (next_page_token) 
end 
Verwandte Themen