2016-03-30 111 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'), 
); 

現在腳本返回我想要的日期。當返回多個結果時,他們現在按開始日期排序。謝謝你指出我朝着正確的方向。

相關問題