4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

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

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

Slackの準備

まずSlackの任意のチャンネルで右上の歯車(設定ボタン)をクリックします。
スクリーンショット 2020-03-16 15.08.43.png

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

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

スクリーンショット 2020-03-16 15.12.29.png

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

スクリーンショット 2020-03-16 15.13.56.png

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

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

GASを開く

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

スクリーンショット 2020-03-16 15.18.42.png

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

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

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

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

スクリーンショット 2020-03-16 15.22.51.png

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

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

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

GASでスクリプトを書く

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

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。
スクリーンショット 2020-03-16 15.41.55.png
時計のアイコンをクリックして、スケジューラーを追加。

スクリーンショット 2020-03-16 15.42.16.png

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

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

Slack + GASを使ってみて

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

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

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?