チームスピリットデベロッパーブログ

チームスピリット開発者のブログ

Slack×GAS 契約自動更新サービスの稟議忘れを防ぎたい!

こんにちは。開発チームで社内利用ツールの管理もしている松田(id:a-matsuda)です。
みなさん、開発に際して、いろんなクラウドサービスを利用しているのではないかと思います。

弊社でも

  • JIRA
  • Confluence
  • Cacoo
  • CirecleCI  などなど・・

様々なツールを利用して、開発プロジェクトやドキュメントの管理、開発工程の効率化などを行っています。 が、今回のテーマは、使っている開発ツールの便利な使い方、とかではありません!

こういったツールって、だいたいが契約自動更新ですよね?
再契約しなくて済むので、その点は非常に楽なのですが、反面、気づいたら社内の稟議期限が切れてしまいそうだった(しまっていた・・・汗!)なんてこと、ありませんか?

今回は、そんな危ない稟議漏れを防ぐ仕組みをSlack×GAS(Google Apps Script)で作ろうという内容です。

これまではどうしてた?

月初に1回、当月に更新切れになるものがないかをプロアクティブにチェックしていました。

困っていたこと

  • 管理するツールが20件を超えた時点で、自身の目が節穴になる。
  • 1ヶ月の無償期間を経て有償になるツールを利用したいというニーズが出てきた。
    この場合、2weeks検証したあとに、解約または契約(のあと、稟議)となるので、
    1ヶ月に1回じゃ間に合わない。

目的

自動更新されてしまう前に、漏れなく社内稟議、承認までを完了できるようにしたい。

実現したいこと

毎週月曜日10時に、契約しているクラウドサービスのうち、契約見直日(※)の14日前をきっているサービスがあったら、Slackに契約更新通知を行いたい。
(※解約通知が3ヶ月前というサービスもあります。弊社の場合は、解約通知日=契約見直日として、契約見直日の前に契約継続でいいかを判断したうえで、継続の場合は社内稟議をあげるルールとしています。)

使う技術要素

  • SlackのIncoming WebHooks
    Slackが発行するURLへPOSTするとSlackにメッセージが投稿される機能 api.slack.com
  • Google Apps Script
    Googleが提供するサーバーサイド・スクリプト環境

おおまかな流れ

1. スプレッドシートで契約一覧を作ろう
契約サービス名と契約見直日は、最低限管理をしておきましょう。 f:id:a-matsuda:20171212013126j:plain

2. SlackのIncoming WebHooksの登録しよう

  • https://(Slackドメイン名).slack.com/apps にアクセスします。
  • 上部に検索ボックスが表示されるので、そこで「Incoming WebHooks」という検索をすると、Incoming WebHooksの設定ページへと飛ぶことができます。
  • 「Add Configuration」をクリック後、投稿したいチャンネルを選択し、作成ボタンをクリックします。
  • 作成完了後、Webhook URLの項目に表示されるURLを次の章で使用します。

3. GASを作成しよう

function alertContract() {
    var mySheet = SpreadsheetApp.openById('シートID').getSheetByName('契約サービス一覧_sample'); //スプレッドシートを取得
    var lastRow = mySheet.getLastRow(); //スプレッドシートの最終行を取得
    var today = new Date(); //今日の日付を取得
  
    /* 契約見直日まで14日切っていたらSlack投稿 */
    for (var i = 2; i <= lastRow; i++) {
        var Di = mySheet.getRange(i, 4).getValue(); //サービス名(Di列)を取得
        var dateHi = new Date(mySheet.getRange(i, 8).getValue()); //契約見直日(Hi列)を取得
        var period = dateHi.getDate() - today.getDate(); //今日から契約見直日までの期間を取得
        if (period <= 14) { //2週間前に告知
          //通知文を作成
          var strText = "@matsuda.akiko " + Di + "の契約更新期限が迫っています。稟議を上げてください。期限:" + dateHi;
          //Slackへ投稿
          postSlack(strText);
        }
    }
}

function postSlack(strText) {
 
  //payload
  var payload  = { 
    'username'  : "Contract Notification",
    'text'      : strText,
    'link_names' : "1", //
  };
  var options = {
    'method'      : 'post'                 ,
    'contentType' : 'application/json'     ,
    'payload'     : JSON.stringify(payload),
  };
 
  // Webhook URL へPOSTする
  var url = 'https://hooks.slack.com/services/XXXX/XXXX/XXXX';  //「2.SlackのIncoming WebHooksの登録しよう」で払い出したURLを指定
  UrlFetchApp.fetch(url, options);
}

4. トリガーを登録しよう
「現在のプロジェクトのトリガー」アイコンをクリックし、トリガーの予定を登録して保存します。

f:id:a-matsuda:20171212014925p:plain

5. 無事Slackに投稿されました!
f:id:a-matsuda:20171212024256p:plain

つまづいたところ

  • チャネルに投稿するときに自分にメンションをしたかったのですが、最初はテキストにしか認識されませんでした。
    payloadの設定で、'link_names' : "1" に追加することで無事メンション認識されました!

こんなことにも応用してみた!

  • 私、採用も担当しております。googleカレンダーと連携し、翌日に面接に関連する予定が入っていたら、「ちゃんと面接の準備できてる?」とSlackで通知してくれる機能も作ってみました。 基本的な流れは一緒で、GASだけ下記ような感じで書いてみました。
function alertInterview() {
  //IDを指定してカレンダーを取得
  var calendar = CalendarApp.getCalendarById('カレンダーID');

  //翌日のイベントを取得
  var date = new Date();
 date.setDate(date.getDate() + 1);
  var events = calendar.getEventsForDay(date);

  //面談の予定があったらSlack投稿
  for (var i=0; i < events.length; i++) {
    var title = events[i].getTitle();
    var startTime = events[i].getStartTime()     
    var endTime = events[i].getEndTime()
    
    //面談の種類によりメッセージを振り分ける(実際はもう少し複雑・・)
    if(title.indexOf("面談") !== -1) {
      //通知文を作成
      strText = "@matsuda.akiko " + title + "面接の準備できてる?";
      //Slackへ投稿
      postSlack(strText);
    }  
  }
}

まとめ

大変簡単な技術ではありますが、Slack中心の生活を送っておられるエンジニアやチームマネージャー、私と同様に忘れっぽい方、忙しい方にも、Slackでのアラート通知は心強い味方になるでしょう。

おまけ

最後になりましたが、この投稿は チームスピリット Advent Calendar 2017 - Adventar 第12日目の投稿になります。 毎日面白い投稿が行われていますので、ぜひ継続してチェックしてください! adventar.org