暗黒エンジニアブログ

株式会社アイネットのエンジニア感があるんだかないんだかよくわからないブログ

GASでつくる #Backlog 警察

ご安全に!角田です。

このエントリは、Backlog Advent Calendar 2018の26日目(勝手にやっているだけ)です。

adventar.org

この記事でやること

先の記事 でGAS使って興が乗ったので、ついでに期限切れのタスクをSlackに通知するBacklog警察もGASで実装してしまおうと思います。
よろしくお願いします。

🔑BacklogのAPIキー発行

個人設定 - API から、Backlog警察用のAPIキーを発行します。管理用のユーザとかでやるのが無難でしょうか。

backlog.com

🖇SlackのIncoming Webhook設定

SlackのアプリにIncoming Webhookを追加します。

f:id:razon:20181225104434p:plain
f:id:razon:20181225104808p:plain
f:id:razon:20181225104810p:plain
f:id:razon:20181225104811p:plain
WebhookのURLができました。

💨GASを書く

function BacklogPolice() {
  var response = fetchBacklogIssues();
  postSlack(JSON.parse(response));
}

var backlogNamespace = 'your_backlog_namespace';
var backlogUrl = 'https://' + backlogNamespace + '.backlog.jp/';

function fetchBacklogIssues() {
  var baseUrl = backlogUrl + 'api/v2/issues';
  var apiKey = 'your_backlog_api_key'
  // 取得対象のプロジェクトIDのリストを指定
  var projectIds = [n];
  var statusIds = [0, 1, 2, 3];
  var sysdate = new Date();
  sysdate.setDate(sysdate.getDate() - 1);
  var params = {
    'apiKey': apiKey,
    'dueDateUntil': formatDate(sysdate)
  };
  for (var i = 0; i < projectIds.length; i++) {
    params['projectId[' + i + ']'] = projectIds[i];
  }
  for (var i = 0; i < statusIds.length; i++) {
    params['statusId[' + i + ']'] = statusIds[i];
  }  
  var paramString = '';
  for (var key in params) {
    if (0 < paramString.length) {
      paramString += '&';
    }
    paramString += key + '=' + params[key];
  }
  return UrlFetchApp.fetch(baseUrl + '?' + paramString);
}

function postSlack(issues) {
  if (issues.length <= 0) {
    return;
  }
  var baseUrl = 'your_slack_incoming_webhook_url';
  var headers = {
    'Content-Type': 'application/json'
  };
  // ここはお好みでいい感じにカスタマイズしてください!
  var params = {
    'channel': '#backlog_notify',
    'username': 'Backlog警察',
    'icon_emoji': ':backlog:',
    'text': createPostMessage(issues),
  }
  var options = {
    'method': 'POST',
    'headers' : headers,
    'payload': JSON.stringify(params)
  };
  UrlFetchApp.fetch(baseUrl, options);
}

function createPostMessage(issues) {
  var message = '<!channel> Backlogのタスクが期限切れになっています!速やかにタスクを処理するか、期限日を調整してください。\n';
  for (var i = 0; i < issues.length; i++) {
    var issue = issues[i];
    message += '[' + issue.issueKey + ']: ';
    message += '<' + backlogUrl + 'view/' + issue.issueKey + '|' + issue.summary + '>';
    message += '[' + issue.status.name + '], ';
    message += formatDate(new Date(issue.dueDate)) + ', ';
    message += issue.assignee.name + '\n';
    return message;
  }
}

function formatDate(date) {
  var format = 'YYYY-MM-DD';
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  return format;
}

🔫GASのトリガーを追加

f:id:razon:20181225110056p:plain
f:id:razon:20181225110058p:plain
f:id:razon:20181225110100p:plain

💪できあがったものがこちらになります

f:id:razon:20181226091752p:plain

よかったですね。
いやよくないですね。あまりBacklog警察にはお世話になりたくないものです!