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