2016-03-30 144 views
0

我正在研究一个脚本,以便从Google日历中提取活动并将其放到网站上。目的是为了能够将我的雇主(大学图书馆)的营业时间放在我们的网站上。基本上,我们在Google日历中创建活动,并在摘要中显示活动时间。我的目标是以编程方式从日历中提取相关信息,并将其放入我们主页的div标签中。Google Calendar API不会返回新创建的活动

从Google修改基本的PHP示例以检索必要的信息并不困难。不幸的是,控制器代码停止检索新创建的事件。由于我是日历的所有者,因此这不是权限问题。直到昨天下午,我才能够创建新事件,并将脚本打印到我的浏览器中。这里是我的代码:

<?php 
require __DIR__ . '/vendor/autoload.php'; 

define('APPLICATION_NAME', 'Library Hours Script'); 
define('CREDENTIALS_PATH', '~/path-to-credentials'); 
define('CLIENT_SECRET_PATH', __DIR__ . '/private key file'); 
// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/calendar-php-quickstart.json 
define('SCOPES', implode(' ', array(
    Google_Service_Calendar::CALENDAR_READONLY) 
)); 

/** 
* Returns an authorized API client. 
* @return Google_Client the authorized client object 
*/ 
$client_email = '[email protected]'; 
$private_key = file_get_contents('/path-to-private-key'); 
$credentials = new Google_Auth_AssertionCredentials(
    $client_email, 
    SCOPES, 
    $private_key 
); 

// Get the API client and construct the service object. 
$client = new Google_Client(); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 
$service = new Google_Service_Calendar($client); 

// Get the calendar ID. The script currently uses the "Regular Hours" calendar. 
$calendarId = '[email protected]'; 
$optParams = array(
    'maxResults' => 1, 
    'singleEvents' => TRUE, 
    'timeMin' => date('c'), 
); 
$results = $service->events->listEvents($calendarId, $optParams); 

if (count($results->getItems()) == 0) { 
    print "<a href='http://www.deltastate.edu/academics/libraries/libraries-hours-of-operation/' target='_blank'>Click here for Library hours</a>.\n"; 
} else { 
    foreach ($results->getItems() as $event) { 
     $opHours = $event->getSummary(); 
     $start = $event->start->dateTime; 

     if (empty($start)) { 
     $start = $event->start->date; 
     } 

    print($opHours . " " . $start . " " . date('c')); 
    } 
} 

本质上面的代码,使得该日历API的请求,将结果显1的最大数量,由当前的日期过滤事件的列表。然后它将开始日期和摘要打印到屏幕上。

API浏览器返回的结果与我在Web服务器上运行脚本时的结果相同。它只显示前一段时间创建的未来事件。我昨天和今天为本周晚些时候创建的事件不会被返回。这个问题似乎并不常见,但没有人报道过它找到了解决方案。任何帮助将不胜感激。

回答

0

在设置maxResult参数时,我认为它与pagination问题有关。

根据该文件。您可以通过设置maxResults字段来控制服务器在响应列表请求时返回的资源的最大数量。此外,对于某些集合(例如事件),服务器永远不会超过的检索条目数量存在严格限制。如果事件总数超过此最大值,则服务器返回一页结果。

结果中的非空0123'字段可检测到不完整的结果。为了检索下一页,请执行与之前完全相同的请求,并在上一页中追加一个pageToken字段,其​​值为nextPageToken。在接下来的页面上提供了一个新的nextPageToken,直到检索到所有结果。

入住这SO question在如何使用pageToken.

0

想通了!这个问题与分页有关,但不符合预期。我对Google的示例脚本所做的更改之一是从optParams数组中删除'orderBy',认为只返回一个单一事件。这个剧本确实如此。然而,结果页面仍然以特定的顺序给出,可能会创建日期,并打印出最高结果。因此,最近添加到日历中的事件被埋在事件列表的底部,而不是打印到屏幕上。我添加了密钥,所以阵列看起来如下:

$optParams = array(
    'maxResults' => 5, 
    'orderBy' => 'startTime', 
    'singleEvents' => TRUE, 
    'timeMin' => date('c'), 
); 

现在脚本返回我想要的日期。当返回多个结果时,他们现在按开始日期排序。谢谢你指出我朝着正确的方向。

相关问题