SlackのSlash CommandsとGASを使ってスプレッドシートの欲しい値を取ってくる

エンタメ系企業の社内もろもろを担当している、まだまだ引き続き絶賛[チックチックチック](https://ja.wikipedia.org/wiki/!!!)にはまり中のakibinです。

#やってみたこと

たとえばユーザアカウントの有無が記載されているGoogleスプレッドシートがあるとして、「誰がどのアカウントもってるんだ？」って時にSlackのコマンドで取ってこれたらいいなと思い、**SlackのSlash Commands**と**Google App Script(GAS)**を使ってそんな環境を作ってみました。

#流れを考える
こんな感じを想定。

１．Slackで /*** [useraccount] を実行
２．コマンド指示を受け、GASが実行される
３．GASがスプレッドシートの該当ユーザを検索して、現在持っているアプリのアカウントを取得
４．結果をSlackに返す

#作業スタート
##【テスト用スプレッドシート作成】
![スクリーンショット 2020-03-11 16.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/e57e15ef-3830-59fe-d840-4bfce7d584f3.png)
こんな感じで作成
★ = オーナー権限（最強）
◎ = 管理者権限
◯ = 一般ユーザ

##【Slack Appからアプリ作成】
######１．[Skack APP](https://api.slack.com/apps)にアクセスして［Create New App］をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/04bfc017-0dcc-bcbb-fa41-afce2244914c.png" width=50%>
ここでSlack APIの画面に行けない場合は権限が付与されていない可能性があります。ワークスペースの管理者に確認してみてください。
######２．［App Name］にアプリの名前を任意で入力、［Development Slack Workspace］に該当コマンドを使用するワークスペースを選択して［CreateApp］をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/a7a777a1-f95c-ed04-8620-72d526c714d7.png" width=40%>
######3．作成したアプリの［Basic Information］画面になるので、［App Credentials］の［Verification Token］の文字列を控えておく
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/30eca9a8-5ccf-9872-44fb-fc515b90f27b.png" width=43%>
後で使います。

##【スプレッドシートからGASを作成】
######4.スプレッドシートの［ツール］から［スクリプト エディタ］をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/6920cb46-d1a5-6ea4-0309-829faf6b9336.png" width=４０%>
######５.元々入っている関数［myFunction()］を削除して以下を入れ、*****部分に先程作成したアプリのVerification Tokenを入れる
```js
function doPost(e) {
  var verificationToken = e.parameter.token;
  if (verificationToken != '********************') { // AppのVerification Tokenを入れる
     throw new Error('Invalid token');
  }

```
Slackのコマンド実行時のパラメーターを受け取るのにこのdoPostを使用します。

######６.スプレッドシートから必要な情報を取るスクリプトを書く
こんな感じの流れです。
１．Slackコマンド実行時のパラメータ（該当ユーザのメールアカウント）取得
２．スプレッドシートの該当ユーザの行を取得
３．該当ユーザのアカウント情報のセルを取得
４．セルの内容をSlackに返す
５．該当ユーザがいない場合の内容をSlackに返す

```js

function doPost(e) {
  var verificationToken = e.parameter.token;
  if (verificationToken != '****************') { // AppのVerification Tokenを入れる
     throw new Error('Invalid token');
  }
  
  // Slackコマンドのパラメータ（該当ユーザのメールアカウント）取得
  var useraccount = e.parameter.text;
  
  // シート取得
  var sheet = SpreadsheetApp.getActiveSheet();  
  
  // 検索列指定（今回はC列）
  var col = 'C';
  
  // 該当ユーザの行を検索
  for(var i=1;i<='100';i++){
    if(sheet.getRange(col+i).getValue() === useraccount){
      
      // 該当ユーザがある行を取得
      var userrow = i;
    
      // 該当ユーザの各サービスのアカウント権限値を取得
      var valD = sheet.getRange('D'+userrow).getValue();
      var valE = sheet.getRange('E'+userrow).getValue();
      var valF = sheet.getRange('F'+userrow).getValue();
      var valG = sheet.getRange('G'+userrow).getValue();
  
      // 結果を取得
      var kekka1 = useraccount+'が持っているアカウントは↓ '+'(★：オーナー  ◎：admin  ◯：user）'+' \n'+'Slack'+' : '+valD+' \n'+'GSuite'+' : '+valE+' \n'+'Docbase'+' : '+valF+' \n'+'Jira'+' : '+valG;
  
      // 結果をSlackに返す
      var response = {text: kekka1};
      return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
     }
    }
  
  //該当ユーザがいなかった場合の内容をSlackに返す
  var kekka2 = useraccount+' なんてユーザおまへん'
  var response = {text: kekka2};
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
```
本当はですね、どの行まで検索するかは、値がどこまで入っているかで指定したかったですが、ちょっと時間がなくて、とりあえず１００行までにしてます…。これは近い内更新予定です。

######７.このスクリプトをプロジェクト名を入れて一旦保存。次に［公開］から［ウェブ アプリケーションとして導入…］をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/9f88434b-3013-91f3-8dd9-dd8de3fe948d.png" width=４０%>
######8.以下を選択して［Deploy］をクリック
- ［Project version］ : New （GASの更新時には常にNewを選択しないと最新のスクリプトが反映されない）
- ［Execute the app as］ : Me
- [Who has access to the app] : Anyone, even anonuymous

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/dc5238da-35bb-d671-5dde-af099f71402d.png" width=４０%>
######9.［Current web app URL:］のURLを控える
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/43ce7ac4-6f35-040f-ffd5-af99ae397317.png" width=４０%>
このスクリプトへのアクセスURLをコピーしておきます。

##【Slack Appに戻りShash Commandsを作成】
######10.［Slack App］に戻り[Slash Commands]から[Create New Command]をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/535a5d07-2b11-62df-b4a4-e1eddbc878e0.png" width=50%>
######11.［Command］にコマンド名、[Request URL]に先程GASでコピーしたCurrent web app URを貼り付け、[Short Description]に任意の内容を入れ、下部の[Save]をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/b0e6da32-59cc-4af0-19ab-d3e4133d0172.png" width=45%>
######12.［Basic Information］の[Install your app to your workspace]を開き、[Install App to Workspace]をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/1bf8314f-10a4-3763-6e56-c52bf05b2b4d.png" width=45%>
######13.以下画面が表示されたら内容確認して[許可する]をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/73e284d5-f5b0-67de-18da-192be8c7e27f.png" width=45%>

#これでSlackコマンド実行してみると…
Slackで`/animaluser lion`と実行してみると…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/ff60c0a8-4540-7981-b040-60c218486daa.png" width=45%>
結果が返ってきました！

存在しないユーザ`/animaluser inu`で実行してみると…
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504009/dfda539e-cc93-97c8-3afd-daee5b7e9335.png" width=１００%>
**おまへん！**

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
◆ Twitterアカウント
@AkibinMusic

◆ Youtubeチャンネル
https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg