3

我正在尝试使用 Google_CalendarService 检索所有事件。到目前为止,我正在使用重复事件检索所有内容,但是有些事件没有出现。

示例:我在 22-okt、23-okt 和 24-okt 有活动。它们都是正常事件,但我得到的唯一事件是 22 和 23。24 没有出现,但它确实存在于我的日历中!

[更新] 发现另一个问题!每次我通过我的应用程序编辑现有事件时,该事件都会消失,但确实存在于日历中!

这是我获取数据的代码:

API 设置:

function calSettings(){

    $client = new Google_Client();

    $cal = new Google_CalendarService($client);

    $client->setAccessType('offline');

    if (isset($_GET['code'])) {

        $client->authenticate($_GET['code']);

        $_SESSION['token'] = $client->getAccessToken();

        header('Location: http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);

    }


    if (isset($_SESSION['token'])) {


        $client->setAccessToken($_SESSION['token']);


        $sessionToken = json_decode($_SESSION['token']);


        $this->Cookie->write('token', $sessionToken->refresh_token, false, '1 month');
    }


    $cookie = $this->Cookie->read('token');

    if(!empty($cookie)){
        $client->refreshToken($this->Cookie->read('token'));
    }


    $serviceArr = array('client' => $client, 'service' => $cal);

    return $serviceArr;
}

获取事件:

public function initCalendar($ownerCalendarId = null, $eventID = null){

    $serviceArr = $this->calSettings();
    $client = $serviceArr['client'];
    $cal = $serviceArr['service'];
    $wandaCalendarId = 'gmail@gmail.com';

    if ($client->getAccessToken()) {
        /************* Code entry *************/
        if($eventID != null){
            $events = $cal->events->get($ownerCalendarId, $eventID);
        }else{
            $ownerEvents = $cal->events->listEvents($ownerCalendarId);

            if($ownerCalendarId != $wandaCalendarId){
                $wandaEvents = $cal->events->listEvents($wandaCalendarId);
                $events = array('owner' => $ownerEvents, 'wanda' => $wandaEvents);
            }else{
                $events = array('owner' => $ownerEvents, 'wanda' => '');
            }
        }

        return $events;

    }else{
        /************* Not connected to google calendar code *************/
        $authUrl = $client->createAuthUrl();

        $returnArr = array('status' => 'false', 'message' => "<a class='login' href='$authUrl'>Connect Me!</a>");

        return $returnArr;
    }
}

所以有了这段代码,我得到了大部分事件,为什么其他事件没有出现?以前有人遇到过这个问题吗?

4

4 回答 4

10

好的,终于知道如何获得所有事件了!

有趣的是,您确实获得了所有事件,但分批获得了 250 个事件。如果您有超过 250 个事件,您将在 JSON 响应中获得一个页面令牌。使用页面令牌获取下一批事件!

关于编辑部分?我注意到,当您编辑事件时,该事件将被抛出到事件列表的底部。因此,您获得的事件按上次编辑排序。

为了避免不需要的数据或保持简单,您可以使用 timeMin 和 timeMax 过滤事件。根据您所做的,您可以动态设置它以更改请求查询。

这是我使用页面令牌获取所需事件的版本:

$minCheck = date(DATE_ATOM, mktime(0, 0, 0, 1, 1, date("Y") -1));
$maxCheck = date(DATE_ATOM, mktime(0, 0, 0, 12, 31, date("Y") +1));

do{
if(isset($result['nextPageToken'])){
   $result= $cal->events->listEvents($calendarId, array('singleEvents' => 'true', 'pageToken' => $result['nextPageToken'], 'timeMin' => $minCheck, 'timeMax' => $maxCheck));
}else{
   $result= $cal->events->listEvents($calendarId, array('singleEvents' => 'true', 'timeMin' => $minCheck, 'timeMax' => $maxCheck));
}
array_push($totalResult, $result['items']);
}while(isset($result['nextPageToken']) && !empty($result['nextPageToken']));
于 2012-10-31T16:17:57.117 回答
2

250 个结果是默认值。通过使用可选的查询参数“maxResults”,最多可以增加 2500 个结果(请参阅事件:列表

于 2015-05-28T09:50:08.553 回答
0

您可以使用while循环:

while(true) {
  foreach ($events->getItems() as $event) {
    echo $event->getSummary();
  }
  $pageToken = $events->getNextPageToken();
  if ($pageToken) {
    $optParams = array('pageToken' => $pageToken);
    $events = $service->events->listEvents('primary', $optParams);
  } else {
    break;
  }
}

如果您愿意,您还可以添加 amaxResults并将其设置为最大值,即2500.

$optParams = array('pageToken' => $pageToken, 'maxResults' => 2500);
于 2018-10-06T21:43:39.927 回答
0

@TheYuwana 感谢您的评论。

需要注意的一件小事,我不小心错过了:如果你有,useBatch=>true 那么$cal->events->listEvents($ownerCalendarId)将返回一个准备好执行的请求$ownerEvents

batch->add($ownerEvents)所以你需要这样做batch->execute()

于 2020-02-25T20:54:47.140 回答