Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

作ったツールをこの記事で紹介しようと思います。
GitHub: 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>指定しないと、デフォルトで1時間のイベントがインサートされる。

$ 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

[{
  "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

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

使えるプロパティはこちら

ヘルプ

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

$ gcal help

認証について

認証はOAuth2経由で行う。2分ぐらいで済む!英語の説明はこちら

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

client ID, client secret and redirect URIが必要になる。Developer Consoleから取得できる

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

2) 同意画面URLを作成

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

$ gcal generateUrl

3) トークンを取得

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

$ gcal storeToken <code>

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

これで完了!これから client_secret.jsoncalendar_api_token.jsonが必要なので、消さないでね✩

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

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

ファイルは .jsもしくは .jsonを利用可能。
設定は ./conf.jsにあります。

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

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

/somepath/config.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

最後に

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

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

toniov
スペインからきたエンジニアです。 現在鯖サイドエンジニアやっています。 炙り鯖が好きです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away