我尝试将Google日历与我的rails应用程序同步。我一直在关注Google提供的文档: Synchronize Resources Efficiently。
我的目标是仅将事件在未来一年同步,并将重复事件分成单个事件,这样我就不必处理重复规则的复杂性并为重复的父事件创建子事件。
在初始同步期间,我将time_max设置为未来1年,在初始同步期间,我只会在未来一年内获得重复事件。
当我执行增量同步时,我会传递同步令牌并期望将重复性事件限制在初始同步时间_max的一年内,但这不是我所看到的。我看到的事件已经过了一年(〜10年)。
在增量同步期间,由于Google收到此预期错误,我无法设置time_max。
捕获错误syncTokenWithRequestRestrictions:同步令牌不能与其他请求限制一起使用。
这是我用来将Google中的事件同步到我的应用程序中的代码
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
我是一个假人并且遗失了一些明显的东西吗?
初始同步提供的sync_tokens应该存储所需事件的时间范围吗?
还有其他方法可以限制增量同步的时间范围吗?
答案 0 :(得分:3)
我最终删除了single_events参数,然后使用定义的time_min&手动循环遍历重复事件的实例。 time_max。
这是更新的代码,任何人都会在将来偶然发现这一点。
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
以及循环重复事件实例的附加方法
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