💬

NotionとGoogle Apps ScriptでLINEBotの自動メッセージを配信する方法

2024/09/09に公開

はじめに

最近、Notionを使っている人が増えていますが、Notionのボタンを押すだけで、LINE Botから自動的にメッセージを送信する機能があったら便利だと思いませんか?(むしろそんな機会あったら嬉しい。大体Slackで完結しそう。笑)
この記事では、Notionのボタンを使ってGoogle Apps Script(GAS)をトリガーし、LINE Botでメッセージを送信する方法を紹介します。
この記事を読めば、カンタンに自分のNotionページからLINEボットを動かせるようになります!
誰でも!!

Notionのボタンとは?

https://www.notion.so/ja/help/guides/automatically-generate-blocks-pages-with-buttons

ボタンをクリックするだけで、ブロックやページなどを自動的に生成
ボタン機能を使うと、コンテンツの作成やページの追加、データベース項目の編集などを簡単に行うことができます。繰り返しタスクのスピードアップや業務の効率化、また一度に複数のことを実行する際などに活用しましょう。

<利用シーン>
「これいつも同じ作業やってるよね」→「ボタンで効率化しちゃおう」

こんな感じです。

意味的に“テンプレ”に近いかもしれません。
ある程度複雑な内容でも、「自動化」「効率化」。
これを実現してくれるのが従来のボタンでした。

何がパワーアップした?

URLの実装が可能になりました!

これによって、外部のWEBページを開いたり、APIを叩いたりすることができそうです!
今回はこれを利用して、GASのウェブアプリURLを実行(叩く)、これによってLINEBotのBroadcastが走る。
こんな感じの実装になっています。

「Slack通知を送信」でいいんじゃね。とは思いますが…

手順概要

  1. LINE Botの作成と設定
  2. Google Apps Script (GAS) の作成
  3. Notionボタンとの連携
  4. 動作確認とトラブルシューティング

1. LINE Botの作成と設定

最初に、LINE Developersにアクセスして、LINE Botを作成します。

  • LINE Developersのコンソールで新しい「Messaging API」チャネルを作成し、Botのアクセストークンを取得します。
  • チャネル設定で、Messaging APIを有効にします。

2. Google Apps Script (GAS) の作成

次に、GASを使ってLINEボットからメッセージを送信するスクリプトを作成します。

GASスクリプトの設定

以下のスクリプトを作成し、ACCESS_TOKEN をLINE Botのアクセストークンに置き換えます。

GAS
const ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty('ACCESS_TOKEN');
const LINE_URL = 'https://api.line.me/v2/bot/message/broadcast'; // 全体送信の場合

function doGet(e) {
  // 最後のメッセージ送信時刻を取得
  const lastSentTime = PropertiesService.getScriptProperties().getProperty('LAST_SENT_TIME');
  const now = new Date().getTime();

  // 最後の送信から5秒以上経過しているかをチェック
  if (!lastSentTime || now - parseInt(lastSentTime) > 5000) {
    sendMessage(); // メッセージを送信する関数を呼び出し
    // 現在の時刻を保存
    PropertiesService.getScriptProperties().setProperty('LAST_SENT_TIME', now.toString());
    return ContentService.createTextOutput("Message sent successfully!"); // 応答メッセージを設定
  } else {
    return ContentService.createTextOutput("Message already sent recently!"); // 短期間での複数送信を防止
  }
}

function sendMessage() {
  const message = {
    "messages": [
      {
        "type": "text",
        "text": "こんにちは!これはNotionボタンからの自動メッセージです!"
      }
    ]
  };

  const options = {
    'method': 'post',
    'headers': {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    },
    'payload': JSON.stringify(message),
  };

  UrlFetchApp.fetch(LINE_URL, options);
}

スクリプトのデプロイ

  1. スクリプトエディタの「デプロイ」ボタンをクリックし、「ウェブアプリケーションとして導入」を選択します。
  2. 「新しいデプロイ」を選び、アクセスを「全員(匿名ユーザー)」に設定して「デプロイ」します。
  3. 公開されたウェブアプリURLをコピーします。

3. Notionボタンとの連携

  • Notionのページに移動し、ボタンを追加します。
  • ボタンの設定で、「リンクを開く」アクションを選び、先ほどコピーしたGASのウェブアプリURLを指定します。

これで、Notionのボタンを押すだけで、GASが実行されてLINEボットからメッセージが送信されるようになります。

↓こんな感じでNotionボタンを設定

↓LINEのトーク画面

4. 動作確認とトラブルシューティング

問題: メッセージが2回送信されてしまう

最初、ボタンを押すと同じメッセージが2回送信される問題が発生しました。
原因として、GASの doGet 関数が複数回トリガーされていることが考えられました。

そこで、タイムスタンプを用いて送信の制御を行い、短期間での複数のリクエストが処理されないように修正しました。これにより、問題が解決しました。

あまりGASに慣れていないため、こんな感じの応急処置をしましたが、他に解決策があればコメント等でお知らせください。

解決策のコード

上記のコードで、doGet 関数内にタイムスタンプをチェックするロジックを追加し、メッセージ送信が短期間で複数回行われるのを防ぎました。

まとめ

このプロジェクトを通じて、NotionとGAS、そしてLINEボットを連携させて自動メッセージ配信の機能を実装する方法を学びました。
GASのデプロイとNotionボタンの設定がうまくできれば、簡単にLINEボットを動かせるようになります。
皆さんもぜひ試してみてください!

Notionキャンパスリーダー

https://x.com/Haruki_dev/status/1829433874759426085
学生を中心に、もっとNotionについて知ってもらえる、使ってもらえるようにイベントなどを開催する予定です!
今回のようなアイデアを出し合う技術カンファレンスや、ハッカソンなども開催できたらいいなと思います。
また、もっと初心者な方・団体向けにも導入から運用までのアシストもできたらと考えております。
これから色々な場面で活躍していこうと思っていますので、是非よろしくお願いいたします!

Discussion