Как читать события и удалять все события в Календаре Google с помощью API V3 PHP

После нескольких часов чтения документации Google API и поиска в Интернете мне удалось написать простую функцию PHP для вставки события в мой календарь Google (если кому-то нужен код, просто спросите).

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

$service->календари->очистить($cal_id);

Однако, поскольку документация Google API охватывает только фактическую команду и не показывает какой-либо код, который должен предшествовать этому, поэтому я использовал код авторизации, который работал в сценарии вставки события, но я просто не могу заставить его работать для очищаю данные, и я получаю сообщение об ошибке:

Примечание: Неопределенная переменная: служба в index.php в строке 68

Весь мой код следует:

<?php
//
// example code taken from:
// https://developers.google.com/google-apps/calendar/v3/reference/calendars/clear
//
//
calendclear('[email protected]');

//---------------------------------------------------//
// funtion to delete all events from Google calendar //
//---------------------------------------------------//
function calendclear ($cal_id) {
    session_start();
    require_once '../google-api-php-client-master/autoload.php';
    //Google credentials
    $client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
    $service_account_name = '[email protected]';
    $key_file_location = '../google-api-php-client-master/API Project-xxxxxxxxxxxx.p12';
    if (!strlen($service_account_name) || !strlen($key_file_location))
        echo missingServiceAccountDetailsWarning();
    $client = new Google_Client();
    $client->setApplicationName("Whatever the name of your app is");
    if (isset($_SESSION['service_token'])) {
        $client->setAccessToken($_SESSION['service_token']);
    }
    $key = file_get_contents($key_file_location);
    $cred = new Google_Auth_AssertionCredentials(
        $service_account_name,
        array('https://www.googleapis.com/auth/calendar'),
        $key
    );
    $client->setAssertionCredentials($cred);
    if($client->getAuth()->isAccessTokenExpired()) {
        try {
          $client->getAuth()->refreshTokenWithAssertion($cred);
        } catch (Exception $e) {
          var_dump($e->getMessage());
        }
    }
    $_SESSION['service_token'] = $client->getAccessToken();

    $calendarService = new Google_Service_Calendar($client);
    $calendarList = $calendarService->calendarList;
    //delete all calendar data
    try {
      $service->calendars->clear($cal_id);
    } catch (Exception $e) {
      var_dump($e->getMessage());
    }
    echo 'Calendar Successfully Cleared';
}
?>

person Andy Hawes    schedule 29.01.2015    source источник
comment
Вы отправляете идентификатор основного календаря для очистки ($cal_id)?? потому что метод calendar.clear очищает только основной календарь.   -  person SGC    schedule 29.01.2015
comment
Спасибо за это, это не устранило ошибку, но я не отправлял первичный код, я изменил код на: $service-›calendars-›clear('primary');   -  person Andy Hawes    schedule 29.01.2015
comment
Эй, @SGC, у тебя есть другое представление о том, что может быть причиной моей ошибки? Или любой пример кода, который я могу скопировать?   -  person Andy Hawes    schedule 30.01.2015


Ответы (1)


После долгих проб и ошибок я нашел способ очистить Календарь Google с помощью API v3.

Мне не удалось заставить работать команду очистки, поэтому вместо этого мне пришлось: 1. прочитать все события в календаре 2. удалить каждое из них

Во-первых, убедитесь, что ваш Календарь Google настроен правильно, чтобы все это работало - в ответе здесь подробно описаны 4 простых шага Вставка записей календаря Google с сервисным аккаунтом

Далее, вот код, который я использовал — обратите внимание, что последние 2 ссылки на [email protected] являются адресом электронной почты владельца календаря — удаление НЕ будет работать ни с «основным», ни с $service_account_name.

Если вы играете с этим материалом, я надеюсь, что это поможет, так как последние 2 дня моей жизни, которые я потратил, пытаясь решить это, не были полностью потрачены впустую :)

<?php
session_start();
require_once '../google-api-php-client-master/autoload.php';
//Google credentials
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
$service_account_name = '[email protected]';
$key_file_location = '../google-api-php-client-master/API Project-xxxxxxxxxxx.p12';
if (!strlen($service_account_name) || !strlen($key_file_location))
    echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("Whatever the name of your app is");
if (isset($_SESSION['service_token'])) {
    $client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/calendar'),
    $key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
    try {
      $client->getAuth()->refreshTokenWithAssertion($cred);
    } catch (Exception $e) {
      var_dump($e->getMessage());
    }
}
$_SESSION['service_token'] = $client->getAccessToken();

/* ------------------------- We are now properly authenticated ------------------- */

$cal = new Google_Service_Calendar($client);
$event_list = $cal->events->listEvents('[email protected]');

$events = $event_list->getItems();

// loop through all events read from calendar

foreach ($events as $event)
{
    $myEvent=$event->getId();
    $mySummary=$event->getSummary();
    $MyStart=$event->getStart()->getDateTime();
    $MyEnd=$event->getEnd()->getDateTime();
    echo 'about to delete event '.$mySummary.' ID: ('.$myEvent.')<br />';
    // now delete the event found
    try {
      $cal->events->delete('[email protected]', $myEvent);
      echo 'Success.<br />';
    } catch (Exception $e) {
      var_dump($e->getMessage());
      die('Event Delete Failed.');
    }
}
?>
person Andy Hawes    schedule 30.01.2015
comment
Если вы хотите удалить события, то приведенный выше код работает, но вы сказали, что хотите очистить содержимое календаря. Для этого вы должны использовать метод очистки. - person SGC; 30.01.2015
comment
Да, @SGC, я бы предпочел очистить, так как я ожидаю, что это было бы более эффективно, но я не мог заставить его работать, так что это был мой обходной путь. Если у вас есть образец кода для метода clear или вы знаете, где я могу найти что-либо актуальное и работающее в Интернете, я буду рад. Документация Google оставляет желать лучшего... - person Andy Hawes; 31.01.2015