API Календаря Google не возвращает вновь созданные события

Я работаю над сценарием, чтобы извлечь событие из Календаря Google и разместить его на веб-сайте. Цель состоит в том, чтобы иметь возможность разместить часы работы моего работодателя (университетской библиотеки) на нашем веб-сайте. В основном мы создаем события в Календаре Google с часами работы в сводке. Моя цель состоит в том, чтобы программно извлечь соответствующую информацию из календаря и поместить ее в тег div на нашей домашней странице.

Было несложно изменить базовый пример PHP из Google для получения необходимой информации. К сожалению, код контроллера перестал получать вновь созданные события. Это не проблема с разрешениями, так как я владелец календаря. И до вчерашнего дня я мог создавать новые события и заставлять скрипт распечатывать их в моем браузере. Вот мой код:

<?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 Explorer возвращает те же результаты, что и при запуске сценария на веб-сервере. Он показывает только события в будущем, созданные некоторое время назад. События, которые я создал вчера и сегодня на конец этой недели, не возвращаются. Проблема, кажется, не очень распространена, но никто, кто сообщил, что не нашел решение. Любая помощь будет принята с благодарностью.

0

Решение

Я думаю, что это связано с пагинация проблема при настройке maxResult параметр.

Согласно документу. Вы можете контролировать максимальное количество ресурсов, которое сервер возвращает в ответ на запрос списка, установив maxResults поле. Кроме того, для некоторых коллекций (таких как События) существует жесткое ограничение на количество извлекаемых записей, которое сервер никогда не превысит. Если общее количество событий превышает этот максимум, сервер возвращает одну страницу результатов.

Неполные результаты могут быть обнаружены непустыми nextPageToken поле в результате. Чтобы получить следующую страницу, выполните тот же запрос, что и ранее, и добавьте pageToken поле со значением nextPageToken с предыдущей страницы. Новый nextPageToken предоставляется на следующих страницах, пока не будут получены все результаты.

Проверь это ТАК вопрос в том, как использовать pageToken.

0

Другие решения

Догадаться! Проблема была связана с нумерацией страниц, но не так, как ожидалось. Одно из изменений, которые я сделал в примере скрипта Google, заключалось в удалении orderBy из массива optParams, полагая, что будет возвращено только одно событие. Действительно сценарий сделал так. Тем не менее, страница результатов по-прежнему отображалась в определенном порядке, возможно, с датой создания, и печатался верхний результат. Таким образом, события, недавно добавленные в календарь, были похоронены внизу списка событий и не распечатаны на экране. Я добавил ключ обратно, чтобы массив выглядел следующим образом:

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

Теперь скрипт возвращает дату, к которой я хочу. При возврате нескольких результатов они теперь упорядочены по дате начала. Спасибо, что указали мне в правильном направлении.

0

По вопросам рекламы [email protected]