如何使用API V3 PHP读取事件并删除Google日历中的所有事件

如何使用API V3 PHP读取事件并删除Google日历中的所有事件,php,google-api,calendar,google-calendar-api,google-api-php-client,Php,Google Api,Calendar,Google Calendar Api,Google Api Php Client,在阅读了几个小时的GoogleAPI文档和搜索web之后,我设法编写了一个简单的PHP函数,将一个事件插入到我的Google日历中(如果有人想要代码,请询问) 然而,我想做的下一件事是删除我的谷歌日历的全部内容。起初,我认为我应该读取所有事件,然后删除每个事件,但根据谷歌的说法,我可以通过一个命令来完成: $service->calendars->clear($calu id) 然而,由于Google API文档仅涵盖实际的命令,并且没有显示任何需要在这之前的代码,因此我使用了在事件插入脚本中工

在阅读了几个小时的GoogleAPI文档和搜索web之后,我设法编写了一个简单的PHP函数,将一个事件插入到我的Google日历中(如果有人想要代码,请询问)

然而,我想做的下一件事是删除我的谷歌日历的全部内容。起初,我认为我应该读取所有事件,然后删除每个事件,但根据谷歌的说法,我可以通过一个命令来完成:

$service->calendars->clear($calu id)

然而,由于Google API文档仅涵盖实际的命令,并且没有显示任何需要在这之前的代码,因此我使用了在事件插入脚本中工作的授权代码,但我无法让它用于清除数据,我得到了错误:

注意:第68行index.php中的未定义变量:service

我的全部代码如下:

<?php
//
// example code taken from:
// https://developers.google.com/google-apps/calendar/v3/reference/calendars/clear
//
//
calendclear('xxxxxxxxxxx@googlemail.com');

//---------------------------------------------------//
// 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 = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com';
    $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';
}
?>

经过多次尝试和错误,我找到了一种使用API v3清除Google日历的方法

我无法使clear命令正常工作,因此我不得不: 1.读取日历中的所有事件 2.删除每一项

首先,确保您的谷歌日历设置正确,以允许任何这些东西的工作-有4个简单的步骤在这里的答案详述

接下来,这里是我使用的代码——请注意最后两个引用xxxxxxxxxxxx@googlemail.com是日历所有者的电子邮件地址-删除不能与“主”或$service\u帐户\u名称一起使用

如果你在玩这些东西,我希望这会有所帮助,因为我生命中最后两天试图解决这个问题并没有完全浪费:)



您是否正在发送要清除的主日历ID($cal\u ID)??因为calendar.clear方法只清除主日历。谢谢,它没有修复错误,但我没有发送主日历,我已经将代码更改为:$service->calendars->clear('primary');嘿@SGC,你对我的错误原因还有什么看法吗?或者任何我可以复制的示例代码?如果你想删除事件,那么上面的代码可以工作,但是你说你想清除日历的内容。为此,您必须使用clear方法..是的@SGC我更愿意使用clear,因为我希望它会更有效,但就我的一生而言,我无法让它工作,所以这是我的变通方法。如果您有clear方法的示例代码,或者知道我在哪里可以找到任何最新的在线工作的代码,我将非常欢迎。谷歌文档还有很多需要改进的地方。。。
<?php
session_start();
require_once '../google-api-php-client-master/autoload.php';
//Google credentials
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
$service_account_name = 'xxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com';
$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('xxxxxxxxxxxx@googlemail.com');

$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('xxxxxxxxxxxx@googlemail.com', $myEvent);
      echo 'Success.<br />';
    } catch (Exception $e) {
      var_dump($e->getMessage());
      die('Event Delete Failed.');
    }
}
?>