Google Calendar v3 API [事件:列表]请求返回空列表

时间:2013-09-02 05:48:32

标签: google-api google-calendar-api

我正在使用python urllib在Google日历(API V3)上发出请求。

现在,问题在于,当我提出“Events: list”请求时,虽然该日历中有事件,但我的回复项为零。

示例

   {  "kind": "calendar#events",
   "nextPageToken": "CigKGm83a292ZzZ2YXBsNXRsMHJhZnV2cGprdHVvGAEggIDA97TfuYYUGg0IABIAGOjEqd_6q7kC",
   "items": [  ] 
   }

如果我在下一个请求中使用“ nextPageToken ”,则正常。(但我不想发出任何额外请求。)

每次都不会出现此问题。如果我创建新的email_id,这工作正常。但一两个月后,这个问题又重新出现了。

  

这是Google Calendar API中的错误吗?

     

     

是否有任何解决方案可以在一个请求中获取任何日历的事件列表?

提前致谢。

4 个答案:

答案 0 :(得分:11)

我一直试图弄清楚同样的问题,我相信我有答案。

此处的问题是,当Google计算要返回的事件的“页面”时,它会在该计算中包含已删除的事件,并且您的第一页内容中包含您未看到的已删除事件,除非您的请求具有“showDeleted” =真“。

我为用户提供了一种“清除”日历并重新填充日历的方法,并遇到了这个问题。请考虑以下情况:

  • 用户在其日历中有250个事件,为了论证,让Googles的“页面”大小相同。

  • 当用户运行要重新填充的流程时,将删除这250个事件并创建250个“新”事件。

  • 当我们接下来要在重新填充过程之前删除事件时,第一页返回时没有事件 - 这是因为列表中的前250个是最初删除的那些事件。 (我已使用API Explorer

  • 对此进行了验证
  • 使用nextPageToken获取下一页结果的工作原理 - 正如您所指出的那样。

  • 这就是为什么创建一个新日历可以工作一段时间 - 也就是说,直到你超过那个'page'限制并开始返回0个事件,这就是我们遇到问题的地方。

  • 随着时间的推移,如果用户经常使用这种重新填充功能,他们的 已删除事件的列表可能会变得很大,而且需要很多 请求返回所有事件。 (我知道无法清除所有被删除的内容 完全来自Google Cal的活动 - 它们似乎永远存在)

  • 我无法在一次通话中返回所有事件。您需要循环访问一次获取页面的过程,直到不再返回“NextPageToken”。这是有道理的,因为对于拥有1000个约会的巨大日历的用户来说,在一个请求中返回所有内容是低效的。

在这里使用Google Calendar API V3是我在VB.Net中使用的一个示例,用于删除所有事件。 (服务是Google.Apis.Calendar.v3.CalendarService)

    Private Sub ClearAllEvents()

        Dim pageToken As String = Nothing
        Dim events As Events
        Dim qry As New ListRequest(Service, GCalId)

        Do
            qry.PageToken = pageToken
            events = qry.Execute()
            For Each ev As [Event] In events.Items
                Dim dr As New DeleteRequest(Service, GCalId, ev.Id)
                dr.Execute()
            Next
            pageToken = events.NextPageToken
        Loop While Not IsNothing(pageToken)
    End Sub

答案 1 :(得分:1)

将showDeleted = false和pageToken = next_page_token添加到url并再次调用api。

答案 2 :(得分:1)

我遇到了类似的问题(gleng&#39答案中的完整描述)。我找到的唯一解决方案,我现在仍在使用它:只需添加一个参数(singleEvents=true)即可。这将从日历API中删除空响应。祝你好运。

答案 3 :(得分:0)

这是C#版本

private void ClearAllEvents()
{
    string pageToken = null;
    Events events;
    EventsResource.ListRequest qry = service.Events.List(CALENDAR_ID);

    do
    {
        qry.PageToken = pageToken;
        events = qry.Execute();

        foreach(Event ev in events.Items)
        {
                service.Events.Delete(CALENDAR_ID, ev.Id).Execute();
         }
         pageToken = events.NextPageToken;
     } while (pageToken != null);
 }