Google日历API PHP listEvents未检索所有事件

Google日历API PHP listEvents未检索所有事件,php,api,google-api,google-calendar-api,Php,Api,Google Api,Google Calendar Api,我正在尝试使用谷歌日历服务检索所有事件。到目前为止,我正在通过重复事件检索所有内容,但有些事件没有显示 我在22日、23日和24日有活动。这些都是正常事件,但我得到的只有22和23。24没有出现,但它确实存在于我的日历中 [更新]发现另一个问题!每次我通过我的应用程序编辑现有事件时,该事件都会消失,但确实存在于日历中 以下是我获取数据的代码: API设置: function calSettings(){ $client = new Google_Client(); $cal

我正在尝试使用谷歌日历服务检索所有事件。到目前为止,我正在通过重复事件检索所有内容,但有些事件没有显示

我在22日、23日和24日有活动。这些都是正常事件,但我得到的只有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;
    }
}
公共函数initCalendar($ownerCalendarId=null,$eventID=null){
$serviceArr=$this->calSettings();
$client=$serviceArr['client'];
$cal=$serviceArr['service'];
$WANDACALENDgmail@gmail.com';
如果($client->getAccessToken()){
/*************代码输入*************/
如果($eventID!=null){
$events=$cal->events->get($ownerCalendarId,$eventID);
}否则{
$ownerEvents=$cal->events->listEvents($ownerCalendarId);
如果($ownerCalendarId!=$wandaCalendarId){
$wandaEvents=$cal->events->listEvents($WandaCalendary);
$events=array('owner'=>$ownerEvents,'wanda'=>$wandaEvents);
}否则{
$events=array('owner'=>$ownerEvents,'wanda'=>'');
}
}
返回$events;
}否则{
/*************未连接到谷歌日历代码*************/
$authUrl=$client->createAuthUrl();
$returnArr=array('status'=>'false','message'=>“”);
return$returnArr;
}
}

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

好的,终于找到了获取所有事件的方法

有趣的是,你确实得到了所有的事件,但是是以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']));

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

您可以使用
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;
  }
}
如果需要,还可以添加一个
maxResults
,并将其设置为最大值,即
2500

$optParams = array('pageToken' => $pageToken, 'maxResults' => 2500);

@TheYuwana感谢您的评论

需要注意的一点是,我无意中遗漏了:如果您有
useBatch=>true
然后,
$cal->events->listents($ownerCalendarId)
将返回一个请求,准备在
$ownerEvents

因此,您需要执行
batch->add($owneEvents)
然后执行
batch->execute()