🎃

GASを簡易サーバーにしてSlackBotでGoogleMeetのリンクを自動送信させる

2024/02/18に公開

SlackBotでGoogleMeetのリンクを自動送信

最近、コミュニティのslackチャンネルに、
@CreateMeetLink君をメンションするか、/meetと送ったら、
SlackBotがGoogleMeetのリンクを自動で作成して投稿してくれる、というものを作りました。

いちいちGoogleMeet開いて作成するのは面倒だし、ハードルを下げたかったのと、
個人的な興味で、GASを使って何かを作ったことなかったので、使ってみたかった。笑
ので、書いていきます!

構成

GASで簡易サーバー作成

長いので全コードをこのアコーディオンの中に格納します!
このコードコピペで、変数部分は変えれば、そのままコードは完成ですが、
少しだけコメントアウトで書きます!

全コード

// Tokenの変数
const VERIFICATION_TOKEN = 'xxxxxxxxxxxxxxxxxxxx';
const BOT_USER_OAUTH_TOKEN = 'xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx'
const SLACK_POST_URL = 'https://slack.com/api/chat.postMessage';


/* Google MeetのURLを作成 */
// Googleカレンダーに一時的なイベントを挿入し、そのイベントに関連付けられたGoogle MeetのURLを取得する関数。
function getMeetUrl() {
  const calendarId = 'primary'; 
  const dt = new Date();
  const date = dt.getFullYear() + '-' + (dt.getMonth() + 1) + '-' + dt.getDate();
  const requestId = Math.random().toString(32).substring(2); 
  // イベントをGoogleカレンダーに挿入し、conferenceDataVersionを指定
  const events = Calendar.Events.insert({
    summary: 'tmp_event',
    singleEvents: true,
    allDayEvent: true,
    start: { date },
    end: { date },
    conferenceData: {
      createRequest: {
        requestId,
        conferenceSolutionKey: {
          type: 'hangoutsMeet'
        },
      }
    }
  }, calendarId, { conferenceDataVersion: 1 })

  // カレンダーはいらないから削除
  Calendar.Events.remove(calendarId, events.id);

  // イベントの作成が成功した場合はGoogle MeetのURLを返す
  if (events.conferenceData.createRequest.status.statusCode === 'success') {
    const meetUrl = events.conferenceData.entryPoints[0].uri;
    return meetUrl;
  }
}

/* Slackに投稿 */
function postMessage(event, message) {
  const thread_ts = event.thread_ts ?? event.ts;
  const params = {
    method: 'post',
    payload: {
      token: BOT_USER_OAUTH_TOKEN,
      channel: event.channel,
      thread_ts: thread_ts,
      text: message,
    },
  };
  UrlFetchApp.fetch(SLACK_POST_URL, params);
}

/* Slackにメッセージを送信 */
function doPost(e) {
  const meetUrl = getMeetUrl(); // Google MeetのURLを取得
  let message = meetUrl !== undefined ? `Meetの部屋を作ったよ\n${meetUrl}` : 'URL生成できませんでした。';
  let response = {
    response_type: 'in_channel',
    text: message,
  };

  if (e.parameter.command) {
    if (e.parameter.token !== VERIFICATION_TOKEN) {
      return null;
    }

    return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);

  } else if (e.postData) {
    const contents = JSON.parse(e.postData.getDataAsString())

    if (contents.token !== VERIFICATION_TOKEN) {
      return null;
    }

    if (contents.type === 'url_verification') {
      return ContentService.createTextOutput(contents.challenge)

    } else if (contents.type === 'event_callback') {

      if (contents.event.subtype && contents.event.subtype === 'bot_message') {
        return null;
      }
  
      // Slackにメンションがあった場合、メッセージを投稿
      if (contents.event.type === 'app_mention') {
        postMessage(contents.event, message);
      }
    }
  }
}



コードの作成が完了したら、Google Calender APIを追加します。

GAS: Service追加

Serviceを押下して、Google Calender追加する。

これを追加しないと,ErrorでGoogle Meetの作成ができません!(そりゃそう)

GAS: デプロイする

上のデプロイを押して、ウェブアプリでデプロイします。


URLが出るので、コピーしておきましょう!
(後でevent設定で使うので、どっかにおいておいてね)

slackApiの作成

ここからじぶんのappを作成します。

https://api.slack.com/apps

上段の欄で名前をつけて、下段の欄でチャンネルの選択をします。

作成後、
Verification TokenBotUser OAuthToken をコピーして
先に作ったGASの定数部分に貼り付ける 必要がありますが、
OAuthTokenはアプリにスコープを設定しないとできないので、先にその設定をします。

slackのscope設定

左のサイドバーのOAuth&Permissionをクリックして、
Scopesの、BotTokenScopesAdd an OAuth Scopeをクリック。

追加するスコープは、以下3つです。
app_mention:read
chat:write
command

そうすると、以下画像のように、
OAuth Tokens for Your Workspace のボタンが活性化するので、
Install To WorkSpace をおそう。

許可します!!!

GASの定数部分に代入しよう

BotUser OAuthTokenが出来上がりました!!!!
コピーして、GASの変数に代入しよう!!!

Basic InformationからVerification Tokenもコピーして代入です。

Verification TokenBotUser OAuthTokenをコピーし
先に作ったGASの定数部分に貼り付け完了したら、今度は...

slash commandを有効に。

サイドバーのslash commandをクリックして、create!

Event Subscriptionsを有効に。

上記でコピーしたデプロイURLをRequest URLに貼り付けよう。

slackで使おう

これでできます!
見てくださりありがとうございましたっ!

githubにも載せてます👀
https://github.com/AiriNarita/Slack_GoogleMeetBot

Discussion