LoginSignup
4
4

More than 3 years have passed since last update.

googleカレンダー情報をLINEで取得&送信

Last updated at Posted at 2020-12-29

LINE公式でオンラインサロン作ってみたい

LINE公式でオンラインサロン作ってみたい
の続きになります。

LINEオンラインサロン全体像

image.png

・サブクス決済は自動でLINE上で行える
・フリーで質問・相談のチャットが可能
・チャットでは解決できない事をzoomなどでオンライン個別相談を行う
・対象ユーザーに向けてお知らせ一斉送信

上記の機能を考えました。
技術的な流れとしては
image.png
・LINE Payのサブクス決済をLINE上で実装
・Google Calendar API(webAPI)からカレンダー情報を取得
・LINE Messaging APIを利用して、空きスケジュールなどの情報を対象ユーザーに向けて一斉送信

それでは、google calendar APIからスケジュール情報を取得&LINEへ送信の構築部分を紹介します。

google calendar APIからスケジュール取得

普段からgoogle calendarをよく利用しています。
google calendarにプライベートと仕事のスケジュールを全て管理しておき、お客様はスケジュールの空いている所にピンポイントで予約を入れられるので、スケジュール調整が自動化出来てとても便利です。

そこで、node.jsでgoogle calendar情報を取得させるコードを見つけたので実装してみる事にしました。
node.jsでgoogle calendarを扱う前に、Google APIsで認証キーの発行が必要です。

Google APIsでAPIキー発行

公式ドキュメントのEnable the Google Calendar APIボタンをクリックしてキーを発行します。

image.png

Google API でプロジェクト新規作成

image.png

プロジェクト名入力

image.png

APIを有効化

image.png

image.png

image.png

有効にします
image.png

OAuth同意

外部を選択して作成します
image.png

認証情報作成

image.png

今回、node.jsを利用します。

image.png

任意のサービスアカウント名を入力します。
ロールはオーナーにしました。

image.png

秘密キーが自動ダウンロードされました。

【認証情報】の中にサービスアカウントが増えています。
クリックしてみると
image.png

アクティブになっているのでOKです。
image.png

google calendarでのアクセス権限

カレンダーへアクセスして、歯車アイコンをクリックして設定をしていきます。
image.png

左サイドバーの【特定のユーザーと共有】をクリックします。
image.png

ユーザーを追加
image.png

先ほどのサービスアカウント名を入力
image.png

node.jsを利用

パッケージを利用します。

npm install node-google-calendar

configファイル作成



// ----------------------
// ④ タイムゾーン(日本)
// ----------------------
const TIMEZONE = 'UTC+09:00';

module.exports.calendarUrl = CALENDAR_URL;
module.exports.serviceAcctId = SERVICE_ACCT_ID;
module.exports.calendarId = CALENDAR_ID;
module.exports.key = KEY;
module.exports.timezone = TIMEZONE;

カレンダーの統合に書いてあるURLを②と③にいれます
image.png

/*************************
  sample.js
 *************************/
// ----------------------
// パッケージのインスタンス生成
// ----------------------
var Calendar = require('node-google-calendar'),
    config = require('./credentials/calendar-config'),
    calId = config.calendarId.myCal;

var cal = new Calendar(config);

// ----------------------
// カレンダーイベントの取得
// ----------------------

// 取得する対象期間を指定
// timeMinからtimeMaxの間のカレンダーイベントが取得される
var params = {
    timeMin: '2020-12-01T06:00:00+09:00',
    timeMax: '2020-12-31T06:00:00+09:00',
}
cal.Events.list(calId, params)
    .then(calEvents => {
        console.log(calEvents);
    })
    .catch(err => {
        console.log(err.message);
    });

timeの箇所を取得したい期間にします。

実際に取得をしたデータ

image.png

他にも色々出来る

カレンダー情報を受け取ったのですが、削除したり追加したり色々出来るみたいです。

Enentsの構造についてのリファレンスを見つけました。
Google Calendar API Enents

また、今回はcal.Event.listとしたのですが、
listの部分をdeleteやgetなど、色々変える事でgoogleカレンダーを便利に使えそうです。
Google Calendar API Methods

せっかくなので、LINEにデータを送りたい

取得されるcalEventsはJSON形式なので、LINEに送りたいと思って実装したところ

let msg = calEvents;

カレンダーから取得した値をメッセージに代入できなくてはまりました。

image.png

調べると

console.log(JSON.stringify(value));

このような形式で書いてあげると解決できるみたいです。無事、出力されました。
参考サイト:console.logでJSON形式の値が[object Object]になる時

LINE botへメッセージを送る時も、【text: JSON.stringify(msg) 】と記述をしたところ、無事チャットボットに返答がありました!
【text: msg】だとbotに情報が何も送れず、この部分の解決にとても苦労しました。

cal.Events.list(calId, params)
        .then(calEvents => {
            console.log(calEvents);
            let msg = calEvents;
            console.log(JSON.stringify(msg));
            return client.replyMessage(event.replyToken, {
                type: 'text',
                text: JSON.stringify(msg) 
            });
        })
        .catch(err => {
            console.log(err.message);
        });

image.png

LINEへカレンダー情報が送れることが分かったので

特定LINEユーザーへ送信

LINE公式アカウントでオンラインサロンを運用する際に、空きスケジュールを自動取得、一斉送信という仕組みもあっても良いのかなと思ったので、LINE Messaging APIのmulticastという機能も使ってみる事にしました。

replayMessageをmulticastへ変更しています。

cal.Events.list(calId, params)
        .then(calEvents => {
            console.log(calEvents);
            let msg = calEvents;
            console.log(JSON.stringify(msg));
            // return client.replyMessage(event.replyToken, {
            return client.multicast(['USER-ID'], {
                type: 'text',
                text: JSON.stringify(msg) //← ここに入れた言葉が実際に返信されます
            });
        })
        .catch(err => {
            console.log(err.message);
        });

まとめ

JSONで受けとったデータがそのまま送られているので、必要な情報だけを送れるように引き続き考察を続けていきたいと思います。

今回、Google Calendar APIを利用する為に参考にしたサイトは以下です。
とても分かりやすく、エラーなく実装が行えました。
node.jsでGoogleカレンダーを操作する方法。nodeパッケージ「node-google-calendar」使用。

googleカレンダーから情報を取得する方法は
LINE公式でオンラインサロン作ってみたいこちらに書きました

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4