Slack + GAS + Googleスプレッドシートで楽しい自動化

# はじめに
この記事はSlackとGAS / Googleスプレッドシートを使って、
簡易なタスク振り分けを自動化しようという試みです。

そして振り分けしたタスク担当者に「今日はあなたが担当者ですよ」と通知してあげる仕組みになります。

小さいアプリケーション作りたいけどDBとか立てるのもな…という怠惰な方は
スプレッドシートを擬似DBにしちゃいましょう！

## Slackの準備
まずSlackの任意のチャンネルで右上の歯車（設定ボタン）をクリックします。
<img width="263" alt="スクリーンショット 2020-03-16 15.08.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/31e7435f-8682-fed9-4523-ba3a943fb21f.png">

アプリを追加をクリックすると、以下の画面で検索フォームが現れるので、
そこで`incomming`と打ち込んで出てくる**Incoming Webhook**を追加してください。

するとブラウザが開き以下の画面が表示されます。

<img width="680" alt="スクリーンショット 2020-03-16 15.12.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/8d7312d3-86ac-236a-ff1e-90b86d46af44.png">

そうしたら**Slackに追加**をクリックします。
すると以下の画面が出てくるので、

<img width="995" alt="スクリーンショット 2020-03-16 15.13.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/e489457d-450c-1648-43e6-b723d0a18438.png">

インテグレーションの設定の**チャンネルへの投稿**に投稿したい任意のチャンネル名を入力したら、
Webhook URLをコピーしておいてください。

とりあえず、Slackの設定はこれで終わりです。

## GASを開く

GASの使い方は単純で、今回はGoogle Driveから作っちゃいましょう。
まずは自分のアカウントでGoogle Driveを開き、

<img width="677" alt="スクリーンショット 2020-03-16 15.18.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/2a819c9e-89b3-8d48-0918-89fae0035a63.png">

**New+**ボタンからメニューを開き、**More**、そして**Google Apps Script**を選択します。

すると別タブでエディターが開くので、適当に名前だけ変えていったんおいておきます。

## Googleスプレッドシートを作る

GASと同じ手順でGoogleスプレッドシートを開いたら、以下のように書きます。

<img width="852" alt="スクリーンショット 2020-03-16 15.22.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/ec5ed795-a785-23c8-83d1-8eecfbb2b9f7.png">

二行目の担当者のところは、そのユーザーのSlack User IDを記載します。
`<@user_id>`で指定してあげることで、メンションを飛ばすことができるからです。

SlackUserIdはSlackのユーザーのプロフィールからコピーすることができます。

そしてここのURLもコピーしておきましょう。すぐに使います。

## GASでスクリプトを書く

さて、今回は日回しの前提で担当者の順番でタスクが割り振られることにします。
また、ちょっと複雑にして二人のペアを1日の担当者ということにしましょう。コードは以下の通りです。

```javascript
var postUrl = 'SlackのWebhook url';
var username = '定例業務（日時）';  // 通知時に表示されるユーザー名
var icon = ':droplet:';  // 通知時に表示されるアイコン
var message = '';  // 投稿メッセージ
var sheetUrl = 'スプレッドシートがあるURL'; //スプレッドシートのURL
var nameRow = 2; // UserIDがある行
var achievementRow = 3; // 実積がある行
var assign = []; // 担当者の配列
var sheet = SpreadsheetApp.openByUrl(sheetUrl).getSheets()[0]; // シート
var check = false; // ループ処理のため
var columnCount = 2; // ヘッダーをのぞく

function myFunction() {
  while(assign.length != 2) { // 担当者は2人まで
    var checkValue = sheet.getRange(achievementRow, columnCount).getValue();
    if (checkValue=="") { // taskをやっていない人がいたら
      var who = sheet.getRange(nameRow, columnCount).getValue();
      if (who != "") { //そこに名前があったら
        assign.push(who);
        check = true;
        sheet.getRange(achievementRow, columnCount).setValue('DONE'); // タスク担当したことを記入する
      } else { // タスクが一周したら
        columnCount = 1;
        sheet.getRange(achievementRow, 2, 1, sheet.getLastColumn()).clearContent(); //　実積の列をリセットする
      }
    }
    columnCount++;
  }
  
  message = assign[0] + 'と' + assign[1] + 'が本日の担当者です。';
  
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options); // API送信
  }
}
```

試しに実行してみましょう。（認証を求められるから許可しておく）
うまくできていれば、Slackのチャンネルに通知がいくはずです。

## スケジューラーの設定

あとはスケジューラーに設定してあげるだけでOK。
<img width="852" alt="スクリーンショット 2020-03-16 15.41.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/6eb750c9-6bed-d96c-35d0-53d2c51c8433.png">
時計のアイコンをクリックして、スケジューラーを追加。

<img width="726" alt="スクリーンショット 2020-03-16 15.42.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305471/be6bfb37-d326-9596-2c84-26db7752ee7c.png">

こんな感じで時刻を設定してあげれば、自動で通知がいくようになります。

アレンジとして、土日祝日を除きたい、という場合であれば
https://qiita.com/Panda_Program/items/31f331fd4c2f3cfab333
こういったものを追加してあげれば良いでしょう。

## Slack + GASを使ってみて
すごい単純な自動化をさせたい、サーバーを立てたりDBを作るほどでもない、という場合とても重宝します。
JSを書いている人ならGASはとても馴染みがある言語なので、それほど困ることもないでしょう。

もう少し複雑なこともできそうなので、時間があったら勉強してみたいと思いました。