Google Calendar API始终是Paginates事件列表

时间:2014-07-23 17:28:29

标签: php calendar google-api google-calendar-api

摘要:

Google_Service_Calendar似乎是"强制分页" $service->events->listEvents();

的结果

背景

google calendar API v3, 使用php客户端库

我们正在开发一种机制,将我们的内部日历与用户的Google日历同步。 请注意,我将在下面提到$ x,它代表谷歌对事件数量的默认限制,类似于$ options [' maxResults'];默认值为250,但无关紧要:我们已经测试了以下有和没有明确定义的请求参数,例如' maxResults',' timeMin'和' timeMax& #39; - 在所有情况下都会出现问题。

我们做了另一个相关测试:将此日历导出到foobar.ics,创建一个新的gmail用户表单,将foobar.ics导入newuser@gmail.com。不要复制这个问题。我们已审核/重置主题日历中的各种选项(共享等),但无法找到任何有效的设置。

问题:

通常,我们称之为:

$calendar='primary';
$optParams=array();
$events = $this->service->events->listEvents($calendar, $optParams);

$ events作为Google_Service_Calendar_Events对象返回,包含$ n" items"。如果有超过$ x的项目,结果可能会被分页,但是对于'正常',结果集((count($ items)< $ x))是单个对象,和$ events-> nextPageToken应为空。

我们正在使用的一个帐户(当然,老板的个人帐户)不会这样做。结果:

$events = $this->service->events->listEvents('primary', []);

Google_Service_Calendar_Events这样的对象:

Google_Service_Calendar_Events Object
(
    [accessRole] => owner
    [defaultRemindersType:protected] => Google_Service_Calendar_EventReminder
    [defaultRemindersDataType:protected] => array
    [description] => 
    [etag] => "-kakMffdIzB99fTAlD9HooLp8eo/WiDS9OZS7i25CVZYoK2ZLLwG7bM"
    [itemsType:protected] => Google_Service_Calendar_Event
    [itemsDataType:protected] => array
    [kind] => calendar#events
    [nextPageToken] => CigKGmw5dGh1Mms4aWliMDNhanRvcWFzY3Y1ZGkwGAEggICA6-L3lrgUGg0IABIAGLig_Zfi278C
    [nextSyncToken] => 
    [summary] => example@mydomain.com
    [timeZone] => America/New_York
    [updated] => 2014-07-23T15:38:50.195Z
    [collection_key:protected] => items
    [modelData:protected] => Array
        (
            [defaultReminders] => Array
                (
                    [0] => Array
                        (
                            [method] => popup
                            [minutes] => 30
                        )

                )

            [items] => Array
                (
                )

        )

    [processed:protected] => Array
        (
        )

)

请注意$event['items']为空,nextPageToken不为空。如果我们然后执行这样的分页请求:

        while (true) {
            $pageToken = $events->getNextPageToken();
            if ($pageToken) {
                $optParams = array('pageToken' => $pageToken);
                $events = $this->service->events->listEvents($calendar, $optParams);
                if(count($events) > 0){
                    h2("Google Service returned total of ".count($events)." events.");
                }

            } else {
                break;
            }
        }

下一个结果集为我们提供了事件。换句话说,尽管我们确信结果小于$ x,但谷歌服务似乎正在对初始结果进行分页。

要明确的是,如果我们的日历上有5个活动,我们预计会有1个结果包含5个项目。相反,我们得到1个结果包含0个项目,但是第一个结果是' nextPageToken'逻辑给了我们想要的5个项目。

解决方案想法?:

一个。处理分页结果,和/或"增量同步'。这些是我们要实现的功能列表,但我们认为这些是更多优化'而不是必需品#39;换句话说,我理解处理/发送nextSyncToken和nextPageToken是可选的 - 因此我们遇到的问题不应该依赖于我们的客户端代码这样做。

B中。为此用户使用不同的非主日历。我们认为这个特定的主要日历可能会在谷歌方面腐败或以某种方式缓存:公平地说,我们在某个时刻意外地在这个日历上插入了一堆垃圾事件,以至于Google将我们置于只读模式如下所述:https://support.google.com/a/answer/2905486?hl=en但我们知道这是笨重测试的暂时结果......换句话说,我们知道我们已经严重搞砸了这个日历,但今天早上我们删除了所有事件,添加了一个测试事件,并获得与上述日历相同的结果。无法复制任何其他用户....包括一个全新的Gmail用户。

℃。删除' primary'日历,创建一个新的。不幸的是,我们知道无法删除主CALENDAR,只能删除CALENDAR EVENTS。

d。让老板开一个全新的谷歌账户

还有其他建议吗?我们正在进行A,但即使这是问题的创可贴,也没有回答为什么会发生这种情况?我们怎样才能在将来避免它呢? (请不要说" D")

提前感谢任何建议或意见!

1 个答案:

答案 0 :(得分:2)

有一个最大页面大小,如果你自己没有指定一个,那么就有一个隐含的页面大小(https://developers.google.com/google-apps/calendar/v3/pagination)。鉴于此,有必要实现分页以使您的应用程序正常工作。

正如您所注意到的,页面并不总是包含最大结果数,因此即使事件数量不超过页面大小,分页也很重要。只需继续关注页面标记,它最终将为您提供所有结果(将有一个没有nextPageToken的页面)

TL; DR A:)