8

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

现在,问题是当我请求“事件:列表”时,尽管该日历中有事件,但我得到了零个响应项。

例子

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

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

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

这是 Google Calendar API 中的错误吗?

或者

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

提前致谢。

4

4 回答 4

13

我一直试图找出同样的问题,我相信我有答案。

这里的问题是,当 Google 计算要返回的事件“页面”时,它会在该计算中包含已删除的事件,并且您的第一页充满了您看不到的已删除事件,除非您的请求具有“showDeleted = True” .

我为用户提供了一种“清除”他们的日历并重新填充它并遇到此问题的方法。考虑这种情况:

  • 用户的日历中有 250 个事件,为了争论,假设 Google 的“页面”大小相同。

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

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

  • 正如您所指出的,使用 nextPageToken 获取下一页结果有效。

  • 这就是为什么创建一个新日历会在一段时间内起作用的原因——即直到您超过“页面”限制并开始返回 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
于 2013-12-04T21:40:08.887 回答
1

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

于 2015-01-20T14:14:38.687 回答
1

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

于 2016-02-03T11:06:07.107 回答
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);
 }
于 2015-11-07T18:44:57.670 回答