GASからBacklogの課題をカウントしSlackに通知する

この記事は [マイナビ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mynavi) 19日目の記事となります。

#目的
Backlogの特定条件の課題数をBacklog APIでカウントし
Google Apps Script(GAS)とSlackのIncoming WebHooksを使い週次でSlackに通知されるようにすることです。

#きっかけ
当時、開発チーム内でプルリクのレビュー担当者の割り振りを[Microsoft Planner](https://www.microsoft.com/ja-jp/microsoft-365/business/task-management-software)で管理し、
開発案件の課題管理をBacklogで管理していました。

Plannerの期限確認をせず、プルリクのレビュー期限の間際でプルリク発行者から催促される状況が多発していたため、普段課題管理に利用しているBacklogに移行すれば忘れないだろうという思惑の元、Backlogに統合となりました。

移行のデメリットとしてはプルリク発行者がPlannerの[グラフ機能](https://support.microsoft.com/ja-jp/office/%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AE%E9%80%B2%E6%8D%97%E7%8A%B6%E6%B3%81%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B-7fee6495-d9c3-489a-8ae4-345804d2035c)を利用し、レビュー機会が少ない人に割り振っていたのですが、Backlogでは担当者毎に1回で見れない（検索で担当者毎に見れば可能だが時間がかかる）というデメリットがありました。
デメリットを解決するためにBacklog APIを利用し課題数の抽出→結果をSlackに通知する方法で行こうという話になりました。


#工程

- Backlog APIキーの発行
- Slack Incoming WebHookの用意
- GASの開発
- 本番導入（トリガーの設定）

がありますのでそれぞれ説明させていただきます。

##Backlog APIキーの発行
Backlog APIを利用するためにAPIキーの発行が必要になります。
APIキーの発行については下記のマニュアル通りに行えば出来ます。
https://support-ja.backlog.com/hc/ja/articles/360035641754-API%E3%81%AE%E8%A8%AD%E5%AE%9A

:::note info
アカウントに依存するAPIキーになるため、API処理用のアカウントを別個に用意した方がベターだと思います。
:::

##Slack Incoming WebHookの用意

下記を元に設定
https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8


##GASの開発
処理内容を説明させていただきます。GASの初期の作り方自体は割愛。
###処理内容

- getBackLogPRReviewCountList()
    - Backlog APIを使い対象の課題数を取得、誰がレビューを何回したかのリストを生成<br>[課題数の取得API](https://developer.nulab.com/ja/docs/backlog/api/2/count-issue/#)を利用<br>issueTypeId,assigneeIdのパラメータの値についてはBacklog管理画面の課題検索時のURLパラメータと同じものを設定します。<br>例)　種別：PRレビューをカウントしたい場合<br>下記の様に管理画面で検索した際に<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60091/02bf0a45-a882-8e0b-5329-906197bce49d.png)<br>URLに下記のように着いているので<br>http://(省略)&issueTypeId=579811<br>APIの&issueTypeId[]=579811 と指定。<br>※値についてはプロジェクト毎に違います。
    - メンバーの増減に合わせassignment_listの要素を調整するような運用になります。assignee_idは上記にあるBacklog課題検索時から取得したものです。

- notifyToSlack()
    - getBackLogPRReviewCountListの結果を元にメッセージの生成、送信


```コード.js
function notifyToSlack() {
  const pr_review_count_list = getBackLogPRReviewCountList();

  let message = '';
  for(pr_review_count of pr_review_count_list){
    message += pr_review_count['name'] + '：' +  pr_review_count['count']+"\n";
  }

  let jsonData =
  {
     "username" : "【Backlog】PR担当数のお知らせ",
     "icon_emoji": ":pururiku:",
     "text" : message
  };
  let payload = JSON.stringify(jsonData);

  let options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch("(Incoming WebHookのURL)", options);
}

function getBackLogPRReviewCountList(){
  const api_key = "(Backlogで発行したAPIキー)";
  const issue_type_id = "579811";　//種別：PRレビュー
  const assignment_list = [ //担当者名、担当者IDの配列
    {
      name:'マイ子',
      assignee_id:'250841'
    },
    {
      name:'ナビ男',
      assignee_id:'281788'
    },
    {
      name:'マイ美',
      assignee_id:'281789'
    },
    {
      name:'ナビ太郎',
      assignee_id:'329873'
    }
  ];
  let pr_review_count_list=[];

  for (assignment of assignment_list) {
    let assignee_id = assignment['assignee_id'];
    let requestUrl = 'https://（※利用しているBacklogのドメイン）/api/v2/issues/count?apiKey='+api_key+'&assigneeId[]='+assignee_id+'&issueTypeId[]='+issue_type_id;

    let response = UrlFetchApp.fetch(requestUrl);
    let response_code = response.getResponseCode()
    let response_content = JSON.parse(response.getContentText());

    pr_review_count_list.push(
        {
          assignee_id:assignee_id,
          name:assignment['name'],
          count:response_content['count']
        }
      );
  }

  return pr_review_count_list;
}

```

###結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60091/f7867984-5815-09fb-bc90-91dc79b28c2e.png)

##本番導入（トリガーの設定）
今回週次で設定するためGASの画面、サイドメニューの時計マークを押し、右下よりトリガーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60091/457babbc-4e05-e09f-3c9f-9d39c22ff0ef.png)


下記のように週次で通知されるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60091/326eaed8-712c-7213-8385-4a71ac2b4272.png)


#まとめ
BacklogにAPIがあること自体を知らなかったことと、APIの種類が充実していることに驚きました。
Backlogを使ってチームの生産性があがるような可能性を感じました。
ちなみにAPI数の制限については下記にある通りです。高頻度でアクセスするものを作る場合はお気をつけください。


- [レート制限](https://developer.nulab.com/ja/docs/backlog/rate-limit/)
- [APIへの高頻度なリクエスト送信を制限についての記事](https://backlog.com/ja/blog/backlog-api-rate-limit-announcement/)