見出し画像

毎週変わる、とある業務の担当者を交代する日にslack通知したいっ!

こんにちは。のせです。
何を書こうか悩んでいたら、数か月経っていました。
時のながれが速すぎてこわいです。

今日は、最近うれしかった「Google Apps Script(GAS)で毎週変わるとある業務の担当者をslack通知することに成功した話」を書きます。

なぜ、Google Apps Script(GAS)でslack通知しようと思い至ったのか

3名で1週間ごとに交代して対応を行っている業務があります。
毎週月曜日に交代の日ですよ~!と、slackのリマインダー機能で通知していました。

誰だ誰だ~~~??・・ぇ、ほんとに誰?!?!?!?

3名全員にメンションしていることと、お休みだから今週は私が!と柔軟に担当を交代したりしていたことで、「(今週は)私かな?」「たしか・・」「順番戻ったんだっけ?」「わからん・・」という具合に本来の順番での担当者がいったい誰なのか、見失ってしまうことが多々ありました。

そこで「ちゃんと順番にその週の担当者だけを通知できないだろうか・・」という話になり、GASならいけるのでは?!となった次第です。

調べてみると、参考になるサイトがいくつかあったので作ってみることにしました。神頼みしないこともあるのです

実現したい通知の条件は3つ!

どんな通知にしたいのかをまとめると、いたってシンプルです。
3つの条件を満たせれば、問題なしです!

  • 毎週月曜日の朝、slackで担当者交代の通知をする

  • 通知時は、その週の担当者だけにメンション

  • 担当者は、1週間ごとにローテーション

作ってみよう!

GASでSpreadSheetのデータを毎週Slackに通知する(Google Apps Script)を参考に作ってみました。

スプレッドシート

GASで操作するスプレッドシートを作ります。

3人だけだから、さみしいね

メンションする場合は、”<@userid>”という形式にする必要があるので、
要注意です!!

コード

参考にした記事にあるコードを今回実現したい通知の条件を満たすように、変更してみました。

  • slackに通知する関数

function notifyMondayMorningInfo() {

  // メッセージ
  messageBody = fetchMembers() ;

  // Slackのチャンネルを指定する
  setForSlack(messageBody, '#通知するチャネル');
}

祝日の場合は実行しないという記述が参考したコードにはあったのですが、「週に一度、今週の担当者をお知らせすること」を優先するため、今回は該当する記述を削除しました。

  • 担当者の取得、通知メッセージを成型する関数

function fetchMembers() {

  // メンバーのデータをスプレッドシートから取得
  // 「getSheetByName('担当者')」:担当者の一覧があるタブの名称
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('担当者');

  // 今週の担当者を取得
  // 「getRange('A1')」:担当者として通知する人の名前があるセル
  var member = sheet.getRange('A1').getValues();

 // slackで通知するメッセージ
  var message =
        '今週の〇〇〇〇担当者は、' + member + '\\n'
         + '困ったときは、👇を見てね!!!' + '\\n'
         + '<https://~~~~~' + '\\n'
         + '今週も、よろしくお願いしまーーーす🌞' + '\\n'
         ;

  // 担当者をローテーションさせる
  rotateMembers(sheet);

  return message;
}
  • 担当者をローテーションする関数

function rotateMembers(sheet) {

  // 担当者のレンジオブジェクトを取得
  // 「getRange('A1:A')」:担当者の一覧がある範囲
  var memberRange = sheet.getRange('A1:A');

  var members = memberRange.getValues();

  // 配列の先頭にある要素を一番最後に移動させる
  members.push(members.shift());

  // シートにローテーション結果を記入する
  memberRange.setValues(members);
}

この関数が実行されて、スプレッドシートにある担当者の一覧がくるっとなるのが、「まわったああああああ!!」とテンション上がります。

  • SlackのWebhook URLにHTTPリクエストを送る

function setForSlack(body, channel) {
  // 取得したSlackのWebhookURLをコピペ
  var url = 'https://hooks.slack.com/service/ハッシュ値';

  // Slackに通知する際の名前、色、画像を決定する
  var data = {
    'channel' : channel,
    'username' : '今週の〇〇〇〇担当者をお知らせ📢',
    'attachments': [{
      'color': '#008000',
      'text' : body,
    }],
  };

  var payload = JSON.stringify(data);
  var options = {
    'method' : 'POST',
    'contentType' : 'application/json',
    'payload' : payload
  };

  UrlFetchApp.fetch(url, options);
}

SlackのWebhook URLの取得は、 Slack での Incoming Webhook の利用 を参照しました。

以上4つの関数をApps Scriptのコード.gsにコピペします。

  1. 準備したスプレッドシートの上部メニューにある「拡張機能」>「Apps Script」をクリックする

  2. 表示されるコード.gsの編集画面にある「function myFunction() { }」を削除する

  3. 前述の4つの関数をコピペする

  4. 上部にある💾をクリックして、保存する

トリガー

「毎週月曜日」に「担当者を通知」を実行するよう、トリガーを設定します

トリガーの設定は、この時計のところ

設定した内容は、以下の通りです。

時刻の指定がふんわりなので、初めての通知を待ってる間とてもそわそわしました

成果物

希望通り、通知されるようになりました!👏🏻👏🏻👏🏻👏🏻

\やったー!✌🏻/

※通知のアイコンなどは、SlackAPI の「Basic Information」>「Display Information」で設定しました。

まとめ

無事に希望通りのslack通知が出来上がり、「(今週は)私かな?」「そうかな?」「順番戻ったんだっけ?」「わからん・・」という会話はなくなりました!
ちょっとしたことではありますが、こうやってより良い状態に持っていけると、とてもうれしい!!!!!!!!!!!

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