Google Calendar API を用いてLaravelアプリから予定を追加する手順

今回はGoogleCalendarAPIを用いて、LaravelアプリからGoogleCalendarに予定を追加していきます。
手順は、
1.GoogleCloudPlatformにてアカウントキーの作成
2.GoogleCalendarの設定
3.Laravelアプリの作成
4.Laravelアプリの設定
となる。

##前提条件
・今回はローカルのみでの開発
・Lravelのversionは7.3.0

##そもそもAPIとは
A アプリケーション
P プログラミング
I インターフェイス
インターフェイスとは何かと何かをつなぐ手順や規約をまとめたものという意味合いがあります。
私はAPIとは、ある機能を別のプログラムから利用できるようにする規約、仲介する規約と理解しています。
その中でもGoogleCalendarAPIはWebを用いたAPIであるWebAPIにあたります。

##1.GoogleCloudPlatformにてアカウントキーの作成
GoogleCloudPlatformにてアカウントキーを作成していきます。
下記URLにアクセスしましょう。
https://console.cloud.google.com/

まずは新しいプロジェクトを作成します。<img width="1431" alt="スクリーンショット 2020-08-11 8.40.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/29f73cd1-a38d-d77c-6342-25a30ad848d1.png">
<img width="1431" alt="スクリーンショット 2020-08-11 8.41.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/5082a0e0-d8ab-9647-85b6-12c1e0df14c9.png">
<img width="1431" alt="スクリーンショット 2020-08-11 8.43.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/a4dda26a-ac12-f7cd-e3bc-c66f2b75a6db.png">
続いてGoogleCalendarAPIを有効にします。
ダッシュボードからAPIとサービス→ライブラリを選択してください。
GoogleCalendarAPIを検索して、有効にするボタンをクリックします。
![スクリーンショット 2020-08-22 15.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0c8e45aa-2e29-f142-9fbd-ff7c33115be5.png)
次にサービスアカウント（APIを制御するためのアカウント）を作成します。
アカウント名以外はとりあえず未入力でも構いません。
![スクリーンショット 2020-08-22 18.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/d5873dec-4021-3448-38c0-66cfcf3f66a8.png)
最後にアカウントキーを作成します。
ここで作成されたJSONファイルと、アカウントIDを用いてサービスを利用します。
慎重に扱いましょう。
![スクリーンショット 2020-08-22 18.52.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/0468ae78-bcad-d4f1-ca2d-8d69d877d35d.png)
![スクリーンショット 2020-08-22 18.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/d2785eee-fe04-b1ca-9f25-cebef109c41c.png)
![スクリーンショット 2020-08-22 18.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/a5dccb26-0773-c98a-e678-b61e6a0547da.png)

##2.GoogleCalendarの設定
GoogleCalendarにサービスアカウントの権限を設定します。
まずは新しいカレンダーを作成しましょう。
![スクリーンショット 2020-08-22 19.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/3a235099-2f15-0829-43ce-30603d926eca.png)
![スクリーンショット 2020-08-22 19.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/02fbe8ec-7427-14b9-0f48-a18aeee76c8c.png)
ユーザーを追加し、ユーザーのメールアドレスは先ほど作成したサービスアカウントのメールアドレスを入力します。
ダウンロードされたJSONファイルの"client_email"の値をコピペしましょう。
与える権限は予定の追加のみにしましょう。
![スクリーンショット 2020-08-22 19.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/a53a3498-49c8-d35a-06b5-c97d2450f124.png)
最後にカレンダーIDを取得します。
Laravelアプリ側からAPIを用いる際に必要です。
カレンダーの結合をクリックもしくはスクロールして確認してください。
![スクリーンショット 2020-08-23 9.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/f9f67b5b-9040-ba6c-e6c2-f751172f5037.png)

##3.Laravelアプリの作成
Laravelアプリを作成します。
PHP拡張機能、Composerなどはインストールされているものとします。
こちらを参考にします。
https://readouble.com/laravel/7.x/ja/installation.html

```
% composer create-project --prefer-dist laravel/laravel test-api "7.3.0"
```

##4.Laravelアプリの設定
設定、コーディングをしていきます。
まずはライブラリをインストールします。

```
% composer require google/apiclient:^2.0
```
storage/app配下にapi-keyディレクトリを作成して、次に先ほどダウンロードしたJSONファイルを配置します。

```
% mkdir storage/app/api-key

#JSONファイルの配置されているディレクトリにて
% mv JSONファイル storage/app/api-key
```

GoogleCalendarに予定を追加する処理を記述するために、コントローラーを作成します。

```
% php artisan make:controller ApiTestController
```

ルーティングを記述します。

```web.php
Route::get('/api','ApiTestController@test');
```

.envファイルにカレンダーIDを設定します。

```.env
GOOGLE_CALENDAR_ID=カレンダーID（カレンダーの結合で取得したもの）
```
コントローラーに処理を記述します。

```TestApiContoroller.php
<?php

namespace App\Http\Controllers;

use Google_Client;
use Google_Service_Calendar;
use Google_Service_Calendar_Event;

class ApiTestController extends Controller
{
    public function test()
    {
        $client = $this->getClient();
        $service = new Google_Service_Calendar($client);

        $calendarId = env('GOOGLE_CALENDAR_ID');

        $event = new Google_Service_Calendar_Event(array(
            //タイトル
            'summary' => 'テスト',
            'start' => array(
                // 開始日時
                'dateTime' => '2020-08-23T11:00:00+09:00',
                'timeZone' => 'Asia/Tokyo',
            ),
            'end' => array(
                // 終了日時
                'dateTime' => '2020-08-23T12:00:00+09:00',
                'timeZone' => 'Asia/Tokyo',
            ),
        ));

        $event = $service->events->insert($calendarId, $event);
        echo "イベントを追加しました";
    }

    private function getClient()
    {
        $client = new Google_Client();

        //アプリケーション名
        $client->setApplicationName('GoogleCalendarAPIのテスト');
        //権限の指定
        $client->setScopes(Google_Service_Calendar::CALENDAR_EVENTS);
        //JSONファイルの指定
        $client->setAuthConfig(storage_path('app/api-key/xxxxxxxxxx.json'));

        return $client;
    }
}

```

/apiにアクセスしてみます。
![スクリーンショット 2020-08-23 11.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/3bd8b7ae-c464-fa55-a24d-2637b96e82a0.png)
カレンダーを確認します。
![スクリーンショット 2020-08-23 11.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637012/9853fa07-c3eb-6a50-c402-8cf27cc7a935.png)

成功です！

もちろん予定を取得して表示なんかもできますので以下を参考にしてください。
https://developers.google.com/calendar/v3/reference