Ric*_*man 6 ruby ruby-on-rails google-calendar-api
我正在尝试将 Google 日历与我的 rails 应用程序同步。我一直在关注 Google 提供的文档: Synchronize Resources Efficiently。
我的目标是只同步未来一年的事件并将重复发生的事件拆分为单个事件,这样我就不必处理重复规则的复杂性和为重复发生的父事件创建子事件。
在初始同步期间,我将 time_max 设置为未来 1 年,而在初始同步期间,我只获得未来一年内的重复事件。
当我执行增量同步时,我传递了同步令牌,并希望将重复事件限制在初始同步的 time_max 的一年内,但这不是我所看到的。我看到的事件已经过去一年(约 10 年)。
在增量同步期间,我无法设置 time_max,因为我从 Google收到此预期错误。
捕获错误 syncTokenWithRequestRestrictions: 同步令牌不能与其他请求限制一起使用。
这是我用来将来自谷歌的事件同步到我的应用程序的代码
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
Run Code Online (Sandbox Code Playgroud)
我是个傻瓜,遗漏了一些明显的东西吗?
初始同步提供的 sync_tokens 是否应该存储所需事件的时间范围?
有没有其他方法可以限制增量同步的时间范围?
我最终删除了 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
Run Code Online (Sandbox Code Playgroud)
以及添加的方法来循环重复事件的实例
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |