我正在尝试使用Google_CalendarService检索所有事件。到目前为止,我正在使用recuring事件检索所有内容,但有些事件没有显示出来。
示例:我有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;
}
}
所以使用这段代码,我得到了大部分事件,为什么不出现其他事件?有没有人之前有这个问题?
答案 0 :(得分: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']));
答案 1 :(得分:2)
250结果是默认值。使用可选的查询参数“maxResults”(参见Events: list)
,最多可以增加2500个结果答案 2 :(得分: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;
}
}
如果需要,还可以添加一个maxResults
并将其设置为最大值2500
。
$optParams = array('pageToken' => $pageToken, 'maxResults' => 2500);
答案 3 :(得分:0)
@TheYuwana感谢您的评论。
我要注意的一件小事:如果您有private Single<...> httpRequest()
那么useBatch=>true
将返回准备在$cal->events->listEvents($ownerCalendarId)
中执行的请求
因此,您需要先执行$ownerEvents
,然后再进行batch->add($ownerEvents)
。