【问题标题】:Google Calendar API Does Not Return Newly Created EventsGoogle Calendar API 不返回新创建的事件
【发布时间】:2016-07-18 23:21:26
【问题描述】:

我正在编写一个脚本,以便从 Google 日历中提取一个事件并将其放到一个网站上。目的是能够将我的雇主(大学图书馆)的营业时间放在我们的网站上。基本上,我们在 Google 日历中创建活动,并在摘要中显示营业时间。我的目标是以编程方式从日历中提取相关信息,并将其放入我们主页上的 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 服务器上运行脚本时的结果相同。它只显示一段时间前创建的未来事件。我昨天和今天为本周晚些时候创建的事件不会返回。这个问题似乎不是很常见,但没有报告过它的人找到解决方案。任何帮助将不胜感激。

【问题讨论】:

    标签: php google-calendar-api gdata-api


    【解决方案1】:

    我认为这与设置maxResult 参数时的pagination 问题有关。

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

    结果中的非空nextPageToken 字段可以检测到不完整的结果。为了检索下一页,请执行与之前完全相同的请求,并在上一页中附加一个带有 nextPageToken 值的 pageToken 字段。在检索到所有结果之前,后续页面会提供一个新的nextPageToken

    查看SO question如何使用pageToken.

    【讨论】:

      【解决方案2】:

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

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

      现在脚本返回我想要的日期。返回多个结果时,它们现在按开始日期排序。感谢您为我指明了正确的方向。

      【讨论】:

      • 太棒了,我一直在寻找相同的答案。谢谢真的帮助我理解了API中的分页:)
      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多