見出し画像

【意外と簡単!】SlackとChatGPTを連携してGoogleカレンダーを操作する方法


はじめに


この記事では、SlackとChatGPTを連携させてSlackの会話の中からGoogleカレンダーに予定を作成する方法をステップバイステップで解説します。
実際には、Slack上で「今日の20時からMTGを追加して」とボットに命令すると実際にGoogleカレンダーに予定を作成してくれます。

このSlackボットでは以下のことができます。

  • Slack上で作成されたBotをメンションし自然言語の命令によってGoogleカレンダーへのイベント自動作成

  • メンションされたユーザーを自動的にイベントの招待者として追加(メアドを直接入力したユーザも招待されます)

  • ダイレクトメッセージ、チャンネル両方に対応

  • Googleカレンダーのイベント作成に関係ない場合は、普段のChatGPTとしてメッセージに回答

この記事の対象者:

  • Slackを日常業務に活用しているチームや組織

  • ChatGPTやその他のAI技術を利用して業務効率化を図りたい開発者や技術者

  • 自動化されたチャットボットに興味があるすべての人

  • GASなどを使い業務効率化したい方

必要な準備:

  • Googleアカウント:GASスクリプトを作成・実行するために必要です。

  • Slackアカウント:ボットを追加するチームまたはワークスペースが必要です。

  • OpenAIのAPIキー:ChatGPTとの連携に必要となります。APIキーはOpenAIの公式ウェブサイトから取得可能です。

手順① OpenAI APIの設定


ChatGPTとの連携には、OpenAIのAPIキーが必要になります。以下のステップに従って、OpenAI APIの設定を行います。

1. OpenAIアカウントの作成

まだOpenAIのアカウントを持っていない場合は、OpenAIの公式ウェブサイトにアクセスしてアカウントを作成します。アカウント作成は無料ですが、APIの使用には料金がかかります。

2. APIキーの取得

アカウントを作成したら、OpenAIのダッシュボードにログインし、「API」セクションに移動します。ここで「New API Key」ボタンをクリックして新しいAPIキーを生成します。生成されたAPIキーは、後ほどGoogle Apps Script(手順③)で使用するため、保存しておきます。

次に、Slack APIの設定をします。

手順② Slack APIの設定


利用ブラウザでSlackアカウントにログイン後、Slack Appsページにアクセスします。アクセス後、画面右側にある「Create New App」ボタンを選択します。。

From Scratch」を選択し、任意のApp Nameを入力し、Slackのワークスペースを選択したら「Create App」ボタンを押下します。
Basic Information」ページに遷移後、「Permissions」ボタンを押下し「OAuth & Permissions」ページに移動する。

Scopes」の「Bot Token Scopes」に以下を追加する。

  • app_mentions:read

  • channels:history

  • chat:write

  • groups:history

  • im:history

  • mpim:history

  • users:read

  • users:read.email

上記のようにScopeの設定が完了したら、同画面内の「Install to Workspace」ボタンを押下し、遷移後の画面で「許可する」ボタンを押下してください。

その後、再び「OAuth & Permissions」ページに戻り「OAuth Tokens for Your Workspace」下のBot User OAuth Tokenの値を保存しておきます。(手順③で使用します)

チャットボットとのダイレクトメッセージを許可する

Slack Appの「App home」ページでAllow users to send Slash commands and messages from the messages tabにチェックを入れてください。botへのDMができるようになります。

作成したSlackボットを特定のチャンネルに追加します。


追加が終わり次第、作成したBotのプロフィール画面に移動し、メンバーIDチャンネルIDをコピーし、保存します。(手順③で使用します)

こちらで、一旦Slack Appの設定は完了し、GASの設定をします。

手順③ エディタの設定


エディタの準備する

以下のリンクからGoogle Apps Script(GAS)をコピーします。

プロジェクト設定のスクリプトプロパティに各値を設定する

コピーされたスプレットシートのメニュータブから、拡張機能>App Scriptを押下しGASのエディタを開きます。
サイドバーから「プロジェクトの設定」を開き「スクリプト プロパティ」に以下の値を追加します

  • BOT_AUTH_TOKEN : 手順②で取得したもの(xoから始まるもの)

  • BOT_CHANNEL_ID : 手順②で取得したもの

  • BOT_MEMBER_ID : 手順②で取得したもの

  • OPENAI_SECRET_KEY : 手順①で取得したもの(skから始まるもの)

作成したGASをWebアプリとしてデプロイする

デプロイの仕方はこちらの記事の手順②を参考にします。

デプロイが完了したら、ウェブアプリURLをコピーします。(手順④で使用します)

手順④ Slack APIの設定を完了させる


Event Subscriptions」ページに移動してトグルをOnに変更し、Request URLに手順③でコピーしたウェブアプリURLを貼り付けます。

また、「Subscribe to bot events」に以下の値を登録してください。

  • message.channels

  • message.groups

  • message.im

  • message.mpim

最後に下にある、「Save Changes」を押下し、保存します。
こちらで全ての設定が完了です。

試してみる


実際に、#generalチャンネルでChatGPT botをメンションして以下の命令を送信します。

@ChatGPT bot
今日の20時からMTGを設定して。

@市川淳 を招待して。
examle@gmail.com も招待して。

そうするとイベントを作成したとのリプライを受信し、実際に自分のGoogleカレンダーにイベントが作成されます。

また、イベント作成に関係のないメッセージには、イベントを作成せずにChatGPTが回答を生成します。

コードの解説


GASのコードをざっくりと解説します。

fetchMsgsInThread関数

  • Slack APIを使用して、指定されたチャンネルのスレッド内のメッセージを取得します。

  • 成功時にはメッセージの配列を返し、失敗時にはエラーを投げます。

fetchSlackMsgsAskedToBot関数

  • トリガーメッセージがBotに対する直接の問い合わせか、またはBotが関与するスレッド内のメッセージかを判定します。

  • Botに対する問い合わせが含まれるメッセージのみをフィルタリングして返します。

trimMentionText関数

  • Slackメッセージからメンションの部分を除去し、テキストの内容のみを抽出します。

  • メッセージの前処理に役立ち、ChatGPTへのクエリ作成を容易にします。

parseSlackMsgsToChatGPTQuesryMsgs関数

  • SlackメッセージをChatGPTへの問い合わせに適した形式に変換します。

  • メッセージ送信者がBotかユーザーかに応じて、それぞれ「assistant」または「user」という役割を割り当てます。

fetchAIAnswerText関数

  • Slackからのトリガーメッセージに基づいてChatGPTからの応答を取得し、適切なアクションを実行します。

  • ChatGPTへの問い合わせには、システムメッセージとして日付とロケール情報を含め、会話のコンテキストを提供します。

handleAIResponse関数

  • ChatGPTからの応答を処理し、必要に応じてGoogleカレンダーにイベントを追加したり、Slackに応答メッセージを投稿します。

  • 応答に含まれる関数呼び出し、対応するアクションを実行します。

addEventToGoogleCalendar関数

  • Googleカレンダーに新しいイベントを追加します。

  • イベントのタイトル、開始時間、終了時間、招待者のメールアドレスを受け取り、カレンダーにイベントを作成します。

slackPostMessage関数

  • Slackの指定されたチャンネルにメッセージを投稿します。

doPost関数

  • SlackからのイベントWebhookを処理するためのエントリポイントです。

  • 受け取ったイベントがメッセージタイプの場合、処理を行い、それ以外の場合は「OK」を返して処理を終了します。

fetchUserEmail関数

  • 特定のユーザーIDに関連付けられたSlackユーザーのメールアドレスを取得します。

  • Slack APIを利用してユーザー情報を取得し、その中からメールアドレスを抽出します。

processMentionsAndGetEmails関数

  • メッセージテキスト内のメンションからユーザーIDを抽出し、それに関連するメールアドレスを取得します。

  • メンションされた各ユーザーのメールアドレスを配列として返します。

全体のフロー

  1. Slackイベントの受信: Slackからのイベント(ユーザーからのメッセージ)がGoogle Apps ScriptにWebhookを通じて送信されます。

  2. メッセージの抽出: 受信したイベントからBotへの問い合わせが含まれているメッセージを特定し、抽出します。

  3. ChatGPTへ連携: 抽出したメッセージをChatGPTが理解できる形式に変換し、ChatGPTに送られます。

  4. ChatGPTからの応答の処理: ChatGPTからの応答を受け取り、応答に含まれる指示に基づいて適切なアクション(例えば、Googleカレンダーにイベントを追加)を実行します。

  5. Slackへの応答の投稿: 行ったアクションの結果をSlackの適切なチャンネルやスレッドに投稿します。

終わりに


この記事を参考にご自身でOpenAIのAPIを使用したSlack Botの開発する際の一助になれば、幸いです。

最後までご精読いただき、ありがとうございました。

お仕事の相談・案件などはX(ツイッター)のDMからお願いします。
X:https://twitter.com/junichikawaAI

参照:
https://github.com/toono-f/chatgpt-bot/blob/main/chat-bot.js

Image Credit: Open AI Inc., Google LLC, and Slack Technologies, LLC


この記事が気に入ったらサポートをしてみませんか?