PHPからGoogleカレンダーに予定を登録する（Google Calendar API）

Webサーバなどから、GoogleカレンダーにPHPで直接予定とかを書き込む方法です。

# Google Cloud プラットフォームでの作業
https://console.cloud.google.com/apis/dashboard

1. プロジェクトを作成して「APIとサービス」にアクセス
2. 概要から、**Google Calendar API** を選択して有効にする
3. 認証情報から、サービスアカウントの管理に移動
4. 新しいサービスアカウントの作成
5. サービスアカウント名を入力（任意のもの）
6. 「役割」の項目は「サービス管理」→「Cloud Functions サービス エージェント」を選択
7. 「新しい秘密鍵の提供」にチェックして、キーのタイプは「p12」を選択
8. 「G Suite ドメイン全体の委任を有効にする」はチェックなしでいいみたい。
9. 秘密鍵ファイルがダウンロードされるので保存する【※1】
10. サービスアカウントの管理を開いて、先ほど作成したサービスアカウントのところにある「サービスアカウントID」をメモする【※2】

# Googleカレンダーでの作業
1. 更新したいGoogleカレンダーをいて「カレンダーの設定」を開く
2. カレンダーのアドレスという欄に「カレンダーID」というのがあるのでメモする【※3】
3. 次にカレンダーの共有を開いて、共有するユーザーの欄に先ほどの（※2）のサービスアカウントIDを入力して共有権限をあたえる。（変更およぼ共有の権限）
4. 上記設定を保存するのを忘れずに。

# 必要なファイルの準備

1. 必要なファイルをダウンロード　　
2. [google/google-api-php-client](https://github.com/google/google-api-php-client/releases)【※４】
3. 上記からLatest release（私は1.1.7でした）をダウンロードして展開（私はサーバの事情で手動ダウンロードしましたが、composerでのインストールがベストのようです。）
4. 上記の（※1）の秘密鍵ファイルもサーバにアップロード

# PHPコードを作成
PHPからGoogleカレンダーに予定を追加するためのサンプルコードを掲載します。

```php:sample.php
<?php
//上記の（※4）でダウンロードしたファイルから src/Google/autoload.php を読み込み
require_once realpath(dirname(__FILE__).'/〜/src/Google/autoload.php');

$calendarId='***@gmail.com'; //上記の（※3）でメモしたカレンダーID

$client_email = '****@****'; //上記の（※2）でメモしたサービスアカウントID（長いけどそのまま全部）
$private_key = file_get_contents('/path/******.p12'); //上記の（※1）でダウンロードした秘密鍵ファイルを指定します
$scopes = array('https://www.googleapis.com/auth/calendar');//カレンダー書き込み時に必要なscope（下記で説明します）
$credentials = new Google_Auth_AssertionCredentials(
    $client_email,
    $scopes,
    $private_key
);

$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion();
}

$service = new Google_Service_Calendar($client);

//以下がカレンダーに登録する内容です。（下記で説明します）
$event = new Google_Service_Calendar_Event(array(
  'summary' => 'テストの予定を登録するよ', //予定のタイトル
  'start' => array(
    'dateTime' => '2016-05-28T09:00:00+09:00',// 開始日時
    'timeZone' => 'Asia/Tokyo',
  ),
  'end' => array(
    'dateTime' => '2016-05-28T18:00:00+09:00', // 終了日時
    'timeZone' => 'Asia/Tokyo',
  ),
));

$event = $service->events->insert($calendarId, $event);
printf('Event created: %s\n', $event->htmlLink);

```

# 補足説明
基本的にGoogle Calendar API のサイト（<https://developers.google.com/google-apps/calendar/>） に書いてありますが、わかりにくそうなところを説明します。
**scopeについて**
上記APIのサイトの[リファレンス](https://developers.google.com/google-apps/calendar/v3/reference/)から、やりたい処理を選択します。
今回は予定の登録をしたかったので、Events->insert のページを見ました。
そこに「Scope」という欄がありますので、それを上記コードに記述します。複数ある場合は配列でよいのではと思います。
**登録する内容について**
こちらも、リファレンスにあります。同じくEvents->insert のページを見ました。
各ページの下部に「Try It!」という項目があり、ここである程度サンプルコードが作れるみたいですので参考になります。

基本的には上記コードの「　//以下が〜　」より下を、リファレンスに合わせて書換えていけば、いろいろ出来そうな気がします。


# 参考になったサイトや必要なサイト
GoogleカレンダーAPIの公式
https://developers.google.com/google-apps/calendar/
Google Developers Console（ここでAPI登録します）
https://console.developers.google.com
google/google-api-php-client（必要なライブラリのダウンロード）
https://github.com/google/google-api-php-client/releases
Magento Study Blog様
http://latics.hateblo.jp/entry/google-api
※こちらの情報がかなり参考になりましたが、なぜか私の環境ではうまくいかなかったので、いろいろ試した結果今回の記事になりました。