LoginSignup
1
2

More than 3 years have passed since last update.

タスク漏れ防止にGoogle Apps Script(GAS)でSlackに通知

Last updated at Posted at 2019-12-16

はじめに

k.s.ロジャースの藤本です。

僕、タスク漏れが多いです。

弊社はGitLabを多く使用しているので
GitLabのissueでアサインされているものをSlackに通知してみようと思います。

前提として、
そもそもGitLabでissue一覧を見ることができるので
そちらを毎日見るよう癖づければ全く必要のない作業です。
僕は怠ってしまいがちなので一番目を通すSlackに通知することで対策しようと考えました。

準備

  • GitLabのAPI
  • SlackのWebhook
  • スプレッドシート

上記3つを使用します。

GitLab

APIでissue一覧を取得します。
まずinsomniaを使ってテストしました。

上記を参考にRequestを作成します。

image.png

一部マスキングしていますが、問題なくアサインされているissueが取得できていることが確認できました。

Slack

image.png

通知したいチャンネルを設定します。
(当然#generalには通知しません、僕は個人のDMを選択しました)

webhookのURLが発行されるので、この後で使用します。

スプレッドシート

image.png

上記のスクリプトエディタを使用します。
書き方はほとんどJavaScriptです。ES6の書き方ではエラーが出ました。
期日が設定されていないものもあったので、9999/01/01としています。

タスクをSlack送るだけだと少し寂しいのと、curlコマンドをcronで設定すればGASを使う必要性がなくなるので
Gitlabスプレッドシートに記載 + スプレッドシートに記載されているタスクを一緒に通知しました。

function callSlack() {
    // GitLabのAPIからissueを取得
    var url = 'https://gitlab.com/api/v4/issues?assignee_username=[ユーザーID]&scope=all&state=opened&private_token=[PricateToken]'

    // Gitlab用メッセージを作成
    var message = 'Gitlab' + '\n';
    var fetchIssueList = JSON.parse(UrlFetchApp.fetch(url).getContentText());
    var issueArray = fetchIssueList.map(function (issue) {
        message += addMessage(issue.title, issue.due_date ? issue.due_date : '9999-01-01', issue.web_url);
        return [issue.title, issue.due_date, issue.web_url]
    })
    var headerRow = ['タイトル', '期日', 'URL']
    issueArray.unshift(headerRow);

    // 書き込むSheetを用意
    var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadSheet.getSheetByName('gitlab')
    sheet.clear()
    var range = sheet.getRange(1, 1, issueArray.length, headerRow.length)
    range.setValues(issueArray)

    // その他用メッセージを作成
    message += 'その他' + '\n';
    sheet = spreadSheet.getSheetByName('other');

    var otherRange = ("" + sheet.getRange(2, 1, 10).getValues()).split(',');
    var otherRowLength = otherRange.filter(Boolean).length;
    var titleList = sheet.getRange(2, 1, otherRowLength).getValues();
    var dueDateList = sheet.getRange(2, 2, otherRowLength).getValues();
    var urlList = sheet.getRange(2, 3, otherRowLength).getValues();
    for (var i = 0; i < otherRowLength; i++) {
        message += addMessage(titleList[i], dueDateList[i], urlList[i] != '' ? urlList[i] : 'https://ks-rogers.co.jp/');
    }

    postSlack(message);
}

function postSlack(message) {
    var webhook = "[WebhookURL]";
    var options =
    {
        "method": "post",
        "contentType": "application/json",
        "payload": JSON.stringify({ "text": message })
    };

    UrlFetchApp.fetch(webhook, options);
}

function addMessage(title, dueDate, url) {
    var date = new Date(dueDate);
    return '[' + date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate() + '] <' + url + '|' + title + '>' + '\n';
}

image.png

シート gitlab にはこんな感じリストが表示されました。

image.png

シート 'other' はこのように用意

image.png

指定したチャンネルにメッセージが送信されていることが確認できたので
毎日定期実行されるように設定します。

image.png

僕は起きるのが遅いのでお昼ごろに設定しました。
仕事時間がいつでも良いのがKSRの魅力ですね。

image.png

最後に

内容が短くなってしまいましたが、こちらで終わりです。

最初は期限近いもの、期限が切れているものだけを判定して通知させようと考えましたが
やはり全体が見れたほうがいいかなと思いすべて通知させることにしました。

アサインされているタスクの量があまりにも膨大になったときと感じたときには
朝に全体、昼に期限を判定とした何かを通知させる・・・など考えてみたいと思います。

「こんなことをしてタスク漏れを防止しているよ!」などがあればぜひ教えて頂きたいですm(_ _)m

Wantedlyでもブログ投稿してます

Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers

1
2
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
1
2