LoginSignup
6
0

Googleカレンダーに登録した予定を通知してくれるLINE Botを作成してみる

Last updated at Posted at 2023-12-07

はじめに

定期的に同郷のメンバーと勉強会を開いているのですが、その際に予定をGoogleカレンダーで管理していました。勉強会を通知する機能をLINEでできないかとういう要望があったため、LINE Botを作成してみました。
Messaging APIとGoogle App Scriptを使用すると簡単にBotが作れるので、ぜひカスタマイズしていろいろ試してみてください。
今回作成するのはグループなどではなく、個人に対して決まった時間に予定を通知してくれるLINE Botを作成していきたいと思います。

使用したツール

  • Googleカレンダー
  • Google App Script(GAS)
  • LINE Bot

Googleカレンダーの作成

新しいカレンダーを作成し、カレンダーの設定からカレンダーIDを取得します。下記の2つで取得できます。
(GoogleカレンダーをGASで読み込む際に必要になってきます。)

スクリーンショット 2023-12-07 19.56.20.png

  • カレンダーの設定と共有 > カレンダー統合 > カレンダーID(***@group.calender.google.com)

スクリーンショット 2023-12-07 19.58.10.png

  • カレンダーの公開URL
    https://calendar.google.com/calendar/embed?src={カレンダーID}&ctz=Asia%2FTokyo
    スクリーンショット 2023-12-07 20.00.21.png

  • カレンダーを作成したら、予定を作成してみましょう!

GASでGoogleカレンダーを読み込む

マイドライブなどにGoogle スプレッドシートを作成

  • 上部タブより拡張機能 > Apps Scriptを開きます。

スクリーンショット 2023-12-06 15.13.43.png

Apps Scriptにコードを書き込む

  • コード.gsに下記コードを書き込みましょう。
  • 先ほど取得したカレンダーIDを記入する箇所があります。
const CALENDER_ID = 'カレンダーIDを記入';

function main() {
  // 予定表の取得
  const event = readCalendar();
  let eventData = [];
  
  for (let i=0; i<event.length; i++) {
    const title = event[i].getTitle();

    const startTimeHour = event[i].getStartTime().getHours().toString();
    const startTimeMinute = event[i].getStartTime().getMinutes().toString().padStart(2, '0');
    const endTimeHour = event[i].getEndTime().getHours().toString();
    const endTimeMinute = event[i].getEndTime().getMinutes().toString().padStart(2, '0');

    const startTimeString = `${startTimeHour}:${startTimeMinute}`;
    const endTimeString = `${endTimeHour}:${endTimeMinute}`;
    
    const data = {'title': title, 'startTime': startTimeString, 'endTime': endTimeString };

    eventData.push(data);
  }

  // メッセージを作成する
  const message = createSentence(eventData);
}

// Googleカレンダーを読み込む
function readCalendar() {
  // Googleカレンダーを取得する
  const calender = CalendarApp.getCalendarById(CALENDER_ID);

  // カレンダーの情報を取得する期間を設定する。(下記コードは今日から明日までの予定を取得しています。)
  const today = new Date();
  let tomorrow = new Date(today);
  tomorrow.setDate(today.getDate() + 1);

  return calender.getEvents(today,tomorrow);
}

// LINEに通知するメッセージの作成
function createSentence(data) {
  if (data.length == 0) {
    return '今日の予定はありません。\n自由な1日をお楽しみください!';
  }
  
  let message = '今日の予定\n\n';

  for (let i=0; i<data.length; i++) {
    message += `・${data[i]['startTime']}${data[i]['endTime']}${data[i]['title']}」\n`;
  }

  message += '\n今日も一日頑張っていきましょう!';
  return message;
}

実行の際の注意点

  • 初回実行時、信頼がないと表示されると思います。
  • こちらを参考に承認してください。

LINE Botの作成

LINE Developersにログインする

チャネルの設定

スクリーンショット 2023-12-07 17.11.11.png

  • Messaging API設定のアカウント機能を設定していきます。
  • グループトーク・複数人トークへの参加、応答・あいさつメッセージは今回は使用しないので、無効にしておきます。

スクリーンショット 2023-12-07 17.05.29.png

  • 応答メッセージにある応答設定を下記のように変更します。
  • Webhookを使用できるように設定を変更しましょう。(ユーザーIDを入手するために必要になってきます。)

スクリーンショット 2023-12-07 17.03.22.png

  • Messaging API設定の下部にあるチャンネルアクセストークンを発行します。
  • メッセージを送信する際に認証情報として必要になってくるので、保存しておきましょう。

スクリーンショット 2023-12-07 17.12.00.png

LINE Botを追加

  • Messaging API設定のQRコードより、LINE Botを追加してみましょう!

LINE BotにWebhookを使用して、GASのアプリを登録

コードを追加

  • ユーザーに対して、メッセージを送る際にユーザーを識別するために、ユーザーIDを取得します。
  • コード.gsにユーザーIDを取得するために下記コードを追加します。
// LINE Botのメッセージを受け取る
function doPost(e) {
  const event = JSON.parse(e.postData.contents).events[0];
  const message = event.message.text;
  const userId = event.source.userId;

  let sheet = SpreadsheetApp.getActive().getActiveSheet();
  sheet.appendRow([message, userId]);
}

ウェブアプリとしてデプロイ

  • 実行する関数をdoPostと指定します。

スクリーンショット 2023-12-07 17.49.30.png

  • 右上にあるデプロイ > 新しいデプロイを選択します。

スクリーンショット 2023-12-07 17.51.25.png

  • ウェブアプリとして、デプロイします。

スクリーンショット 2023-12-07 17.52.01.png

  • アクセスできるユーザーを全員に変更します。

スクリーンショット 2023-12-07 17.53.50.png

実行の際の注意点

* 初回実行時はアクセスを承認する必要があります。
* こちらを参考に承認してください。

  • デプロイをしたURLを取得します。(コピーしておきましょう)

スクリーンショット 2023-12-07 18.06.52.png

LINE BotにWebhookの登録

  • LINE BotのMessaging API設定 > Webhook設定をします。
  • 先ほど取得したURLを登録します。

スクリーンショット 2023-12-07 18.14.38.png

  • 作成したLINE Botからメッセージを送信してみましょう!

ユーザーIDを取得

  • 先ほど追加したコードにより、スプレッドシートに送ったメッセージとユーザーIDが記入されています。
  • ユーザーIDを保存しておきましょう。

スクリーンショット 2023-12-07 18.30.48.png

  • 先ほど追加した下記コードはもう使用しないので、削除しておきましょう。
- // LINE Botのメッセージを受け取る
- function doPost(e) {
-   省略
- }

LINE Botからメッセージを送信

  • LINE Botから予定表を送信できるように下記コードを追加します。
  • アクセストークン・ユーザーIDを記入する箇所があります。
const LINE_PUSH_URL = 'https://api.line.me/v2/bot/message/push';
const LINE_ACCESS_TOKEN = 'アクセストークン';
const USER_ID = 'ユーザーID';

// メッセージを送信する
function pushMessage(message) {
  const headers = {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${LINE_ACCESS_TOKEN}`
  };
  
  const payload = {
    'to': USER_ID,
    'messages': [
      {
        'type': 'text',
        'text': message
      }
    ]
  };

  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload)
  };

  UrlFetchApp.fetch(LINE_PUSH_URL, options);
}
  • mainにコードを追加します。
function main() {

  // 省略
  
  // メッセージを作成する
  const message = createSentence(eventData);

+ // メッセージを送信する
+ pushMessage(message);
}
  • 実行する関数をmainに変更して、コードを実行してみましょう!

スクリーンショット 2023-12-07 19.12.15.png

  • 作成したLINE Botから通知が来れば、成功です!

毎朝6時にトリガーを設定

GASでトリガーを設定

  • 左側のタブより、トリガーを選択します。

スクリーンショット 2023-12-07 19.16.49.png

  • 右下でトリガーを追加をします。
  • 下記のようにトリガーを設定します。

スクリーンショット 2023-12-07 19.21.06.png

  • トリガーを保存して、完了です。
  • 明日の朝、通知が来るか楽しみにしておきましょう!

最後に

今回、Googleカレンダーに登録した予定を通知するLINE Botを作成してみました。
プログラミング初心者の方でも作成しやすいように、手順を詳しく解説してみました。
GASを使って、ウェブアプリとして、簡単に公開できることに驚きました。
いろいろと活用できそうなので、試していきたいと思います。
私自身、LINEを開かない日がないので、LINE通知で予定を確認できるのはとても便利だと感じています。

参考資料

6
0
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
6
0