我正在编写一个脚本,从谷歌日历中提取一个事件并将其放到网站上。目的是能够将我的雇主(一所大学图书馆)的营业时间放在我们的网站上。基本上,我们在谷歌日历中创建活动,并在摘要中显示操作时间。我的目标是以编程方式从日历中提取相关信息,并将其放入主页上的div标记中。
修改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 = 'project-name@clean-mason-95113.iam.gserviceaccount.com';
$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 = 'dsulibraryinfo@gmail.com';
$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服务器上运行脚本时相同。它只显示一段时间前创建的未来事件。我昨天和今天为本周晚些时候创建的活动不会返回。这个问题似乎并不常见,但没有一个报告过这个问题的人找到解决方案。如有任何帮助,我们将不胜感激。
我认为这与设置maxResult
参数时的分页问题有关。
根据文件。您可以通过设置maxResults
字段来控制服务器在响应列表请求时返回的最大资源数。此外,对于某些集合(如事件),对检索到的条目数量有一个硬性限制,服务器永远不会超过这个限制。如果事件总数超过此最大值,服务器将返回一页结果。
结果中的非空nextPageToken
字段可以检测到不完整的结果。为了检索下一页,请执行与以前完全相同的请求,并从上一页附加一个值为nextPageToken
的pageToken
字段。在以下页面上提供新的nextPageToken
,直到检索到所有结果。
在如何使用pageToken.
中检查此SO问题
想明白了!这个问题与分页有关,但与预期的方式不同。我对谷歌的示例脚本所做的一个更改是从optParams数组中删除"orderBy",认为只会返回一个事件。事实上,脚本做到了。然而,结果页面仍然按照特定的顺序给出,可能是创建日期,并打印出最上面的结果。因此,最近添加到日历中的事件被隐藏在事件列表的底部,而没有打印到屏幕上。我添加了密钥,使数组看起来如下:
$optParams = array(
'maxResults' => 5,
'orderBy' => 'startTime',
'singleEvents' => TRUE,
'timeMin' => date('c'),
);
现在脚本返回我想要的日期。当返回多个结果时,它们现在按开始日期排序。谢谢你为我指明了正确的方向。