Slack×GASで作った勤怠Botの話#3

UG Advent Calendar 2020 の3日目の記事です。

どうもbarusuです。知らない方は初めまして。
昨日の続きです。
フィクションと思って読んでいただければ幸いです。

Slack×GASで作った勤怠Botの話 #3

2020年5月。
良くも悪くもコロナ禍による新しい生活様式が定着しはじめた頃のお話。

―――――――ちょっとさ、勤怠システム作れない?

すべては法務部長の一言から始まった…

全10話分の3話目となります。
 2020/12/01:導入,初期の要望
 2020/12/02:設計
 2020/12/03:構築その1 :SlackBotを作る ← 今日はココ
 2020/12/04:構築その2 :GASを書く(基本メソッド編)
 2020/12/05:構築その3 :GASを書く(ユーティリティ編)
 2020/12/06:構築その4 :GASを書く(機能実装編:打刻処理)
 2020/12/07:構築その5 :GASを書く(機能実装編:ユーザー管理機能,リマインド機能) 
 2020/12/08:構築その6 :色々書く(機能実装編:,勤怠修正機能)
 2020/12/09:単体,ユーザーテスト
 2020/12/10:そして伝説へ...

Barusu
「さてさてやっていきますか」

Barusu
「今日はSlackBotの作成とGASをAPI公開して、BotへのDMをきっかけにGAS発火するとこまでやろっかな。Botがコメントを返すやつは後でやろっと」

SlackBotを作る

Barusu
「まずはSlackで作業。
 [設定と管理] → [アプリを管理する]の順にクリックして」

画像1

Barusu
「[ビルド]をクリックする」

画像2

Barusu
「[Create New App]を選択」

画像3

Barusu
「AppNameとDevelopmentを決めてCreate Appするー。
 名前は…どうせ後で変えるから適当でいいや」

画像4

Barusu
「これでBotができた。
 だけど、このままだとBotになんの権限もないから権限を追加していく」

Permissionの設定をする

Barusu
「今回必要なのは以下の3つの権限。
 ・ユーザーとのDMの内容を読み取る:im:history
 ・ユーザーにDMを送る:im:write
 ・ユーザー情報を取得する:users:read

 設定するには[OAuth & Permissions]を選択して」

画像5

Barusu
「[Add an OAuth Scope]を選択して」

画像6

Barusu
「[users:read],[im:write],[im:history]を追加する」

画像7

Barusu
「権限はこれでかんりょ。だけどまだSlackにBot Userとして追加されてないんで、設定する必要があるのよね」

Bot Userを追加する

Barusu
「[App Home]をクリックして[App Display Name]の[Edit]をクリックする」

画像8

Barusu
「もう名前は勤怠くんで良いやーめんどくせぇ」

画像9

Barusu
「[Install App]から[Install to Workspace]をクリックして追加する」

画像10

Barusu
「与えた権限について確認する画面が出るんよねー。
[許可する]をクリックする」

画像11

Barusu
「無事に追加されればOK。このTokenは後で使うからどっかに控えとく。
 まぁいつでも確認できるけど」

画像12

Barusu
「おkおk。これでとりあえずはBotUserが追加できた。
 お次はSlack→GASを発火するために、GASをAPI公開してSlackから呼び出せるように設定していくかー」

GASを作成してAPI公開する (その前に)

Barusu
「普通のgmail.comアカウントで作成するGASだと、特に意識しなくてもできるんだけど。
企業のGoogleWorkspaceだと、ドメイン外に共有できない設定にしてるのが普通なので注意が必要なのよね。
ドメイン外共有できない、またはホワイトリストで共有する設定になっていると、GASをAPIとして公開することができない。これよくハマる。


Barusu
「なので、回避方法も合わせて記載しとく。
この会社の場合はGoogleWorkspace導入したときに初期設定しといたから、実際は不要なんだけどね。一応記載しとこうかなと思ってね。
馬なんでね」

GASをAPI公開するための組織設定

Barusu
「GoogleWorkspace管理コンソールにて作業するぞー」

Barusu
「一枚で表現するとこんな感じ。
まず、トップ組織にネストされた子組織を2つ作成しておく。
次に管理コンソール→アプリ→GoogleWorkspace→ドライブとドキュメント→共有設定と進み、トップ組織には外部共有OKの設定を付与する。
作成しておいた子組織の片方は外部共有NGの設定でオーバーライドし、一般ユーザーを追加しておく。これで誰も彼もが外部共有できる状態は回避できる。
もう一つの子組織にはGAS実行用とかの管理者アカウントを追加しておく」

画像13

Barusu
「外部共有OKの子組織に所属している管理者アカウントで共有ドライブを作成し、GASとスプレッドシートはそちらに配置する」

画像14

Barusu
「とまあこんな感じで、GASをAPI公開できる共有ドライブが出来上がった。
では次に、GASを実際に書いて、API公開して、SlackBotから呼べるように設定していく」

GASを作ってEventAPIを登録する

Barusu
「一旦、SlackBotの設定画面に戻って、[Event Subscriptions]から[Enable Events]をOnにする」

画像15

Barusu
「すると、Request URLの欄とか色々出てくる。
このRequest URLにAPIとして公開したGASのURLを追加すれば良いのだが、
初回設定するときに「きちんとレスポンスを返してくれるよね?」
とSlackから確認されるので、それを満たすように記載しなきゃいけない」

画像16

Barusu
「ので、それを満たすように記載したGASがこちら」

function doPost(e) {
   // Event API Verification 時のコード

   try {
       var json = JSON.parse(e.postData.getDataAsString());
       if (json.type == "url_verification") {
           return ContentService.createTextOutput(json.challenge);
       }
   } catch (ex) {
   }

}

Barusu
「ではこれをGASに書いてみよう。
GAS公開できる共有ドライブ上で、適当にスプレッドシートを作成」

画像17

Barusu
「[ツール]→[スクリプトエディタ]の順にクリック」

画像18

Barusu
「親の顔より見た画面。ここに、↑にも書いたコードを転記」
※拡張機能により、ダークモードになっております

画像19

Barusu
「[公開]→[Webアプリケーションとして導入]をクリック」

画像20

Barusu
「[Who Has access to the app]は[Anyone,~]を選択する」

画像21

Barusu
「Deployすると、API実行URLが表示されるのでコピーしとく」

画像22

Barusu
「で、先程のSlackBotの設定画面に戻って、[Event Subscriptions]の[Request URL]にAPIURLを入力する」

画像23

Barusu
「Verified になればOK。ならない場合はGASの記載がおかしいか、WebAPIとして公開できてないか、保存したあとに再度WebAPIを公開していないかとかそこらへんに原因がある。
このままではこのAPIを実行する「きっかけ」が設定されてないので、追加する。
次に[Subscribe to bot events]をクリックする」

画像25

Barusu
「[Add Bot User Event]をクリック→[message:im]を選択」

画像26

Barusu
「Save Changesをクリックして保存する」

画像27

Barusu「っと、まぁここまでで下準備はだいたいできた。これからGAS書いていくか…データモデルも決めてないけどまぁどうにかなるっしょ」

次回予告

画像付きで3000文字も書いちゃったけどなんとか下準備まではできたBarusu!
次回は今回以上にちゃんと技術的な内容になっていきます!
むしろ次回だけで収まるのか不安になってきたぞ!

次回、「Re:ゼロから始めるSlackBot構築 その2」。デュエルスタンバイ!


画像24

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