コマンドラインで簡単にGoogle Calendarのイベントを管理する

作ったツールをこの記事で紹介しようと思います。
GitHub: [gcal-cli](https://github.com/toniov/gcal-cli)

このツールでコマンドライン経由で簡単にGoogle Calendarのイベントを管理できる。

>
- イベントリスト
- イベントインサート
- Bulkイベントインサート
- 自然言語処理を利用可能
- Customizable 設定
- OAuth2認証

# 使い方

```
gcal [-C <file>] [cmd] [--debug]

    OPTIONS
       -C, --config <file>
       --debug
```

## イベントリスト

デフォルトで今日のイベントが表示される。

```
$ gcal list
```


下記のようなレスポンスが返ってくる。

```
   Upcoming events (2017-09-07T00:00:00+09:00 ~ 2017-09-07T23:59:59+09:00)
    2017-09-07 20:00 - 好きな番組
    2017-09-07 22:30 - 明日のMTGの準備
```

自然言語も利用可能。

```
$ gcal list yesterday
```

```
$ gcal list 'from tomorrow to the day after tomorrow'
```

ISO日付でも利用可能。

```
$ gcal list -f 2017-03-23 -t 2017-03-27
```

## イベントインサート

インサートの際に文言を入れると自然言語処理される。

```
$ gcal insert 'Party tomorrow from 3pm to 5pm'
```

下記のようなレスポンスが返ってくる。

```
Party: 2017-09-14T15:00:00+09:00 ~ 2017-09-14T17:00:00+09:00
https://www.google.com/calendar/event?eid=N2EycWI0ZWJjaWlpcWp2Y3NnY2U5czVvdjggdG9rYWdlcm9oQG0
```

オプション経由ならこんな感じで利用可能。

```
$ gcal insert -s 'パーティ' -d 2017-03-23 -t 15:00 -D 2h
```

`-D <duration>`指定しないと、デフォルトで１時間のイベントがインサートされる。

```
$ gcal insert -s '予定' -d 2017-03-24 -t 11:00
```

`-t <time>`も任意。指定しないと終日イベントになる。

```
$ gcal insert -s '旅行' -d 2017-03-25
```

## Bulkイベントインサート

`.js`、もしくは `.json`ファイルでBulkでインサート可能。

`events.json`

```json
[{
  "calendarId": "primary",
  "resource": {
    "summary": "億泰と遊ぶ",
    "location": "杜王町",
    "description": "その辺でもウロウロしようぜ",
    "start": {
      "dateTime": "2017-09-08T09:00:00"
    },
    "end": {
      "dateTime": "2017-09-08T10:00:00"
    }
  }
}, {
  "calendarId": "primary",
  "resource": {
    "summary": "DIOを倒す",
    "location": "カイロ、エジプト",
    "description": "DIOめ。やれやれだぜ。",
    "start": {
      "date": "1987-06-01"
    },
    "end": {
      "date": "1987-06-12"
    }
  }
}]
```

```
$ gcal bulk -e ./events.json
```

`.js`ファイルを使うと、relative time等を指定できる。

`events.js`

```js
const today = new Date();
today.setHours('17', '00', '00');
const tomorrow = new Date(today.getTime()+1000*60*60*24);
module.exports = [{
  "calendarId": "primary",
  "resource": {
    "summary": `Release`,
    "start": {
      "dateTime": today.toISOString()
    },
    "end": {
      "dateTime": today.toISOString()
    }
  }
}, {
  "calendarId": "primary",
  "resource": {
    "summary": "Release",
    "start": {
      "dateTime": tomorrow.toISOString()
    },
    "end": {
      "dateTime": tomorrow.toISOString()
    }
  }
}];
```
```
$ gcal bulk -e ./events.js
```

使えるプロパティは[こちら](https://developers.google.com/google-apps/calendar/v3/reference/events/insert)。

## ヘルプ

ヘルプコマンドでAPIが表示される。

```
$ gcal help
```

# 認証について

認証はOAuth2経由で行う。２分ぐらいで済む！英語の説明は[こちら](https://github.com/toniov/gcal-cli#authentication)。

#### 1) プロジェクトクレデンシャルを取得

`client ID`, `client secret` and `redirect URI`が必要になる。[Developer Console](https://console.developer.google.com)から取得できる

- プロジェクトを選択する
- `認証情報`へ移動する
- `認証情報を作成` → `OAuth クライアント ID`
- JSONファイルをダウンロードする

#### 2) 同意画面URLを作成

デフォルトでアプリはホームディレクトリに`client_secret.json`というクレデンシャルファイルを探す。

```
$ gcal generateUrl
```

#### 3) トークンを取得

同意画面に出てきたコードでトークンを作成できる。

```
$ gcal storeToken <code>
```

トークンはデフォルトでホームディレクトリに `calendar_api_token.json`という名で保存される。

これで完了！これから `client_secret.json` と `calendar_api_token.json`が必要なので、消さないでね✩

# デフォルト設定を上書きする

オプション `-C <file>`を使って、デフォルト設定を上書きできる。

ファイルは `.js`もしくは `.json`を利用可能。
設定は [./conf.js](https://github.com/toniov/gcal-cli/blob/master/conf.js)にあります。

他にカスタマイズしたいものがあれば、是非イシューでも切ってください✩

例：
クレデンシャルとトークンのデフォルトパスを変更する。

`/somepath/config.json`

```json
{
  "CRED_PATH": "/my/secret/path/credentials.json",
  "TOKEN_PATH": "/my/secret/path/token.json"
}
```

```
$ gcal -C /somepath/config.json generateUrl
```

# ユースケース

過去のプロジェクトでリリースする度に手動でカレンダーにイベントを入れてましたので、こういうツールあれば便利だなーと思って、作りました。

様々な使い方：

- ターミナルから出たくない場合
- オートメーション・スクリプティング
- 継続的インテグレーションでの利用（CI、Jenkins、等）
- AlexaのSkills

# 最後に

どんなフィードバックでも大歓迎です！

また、便利だと思ったら、スターいただけたら嬉しいです ☆