DACエンジニアブログ:アドテクゑびす界

DACのエンジニアやマーケター、アナリストが執筆するアドテクの技術系ブログです。

Qiita Team API と Google Spread Sheet でチーム日報を生成する

チーム日報を活用する

MarketOne 開発チームでは複数拠点に分かれての開発を行っています。リモート開発が中心となると口頭でのコミュニケーションに限界があるため、テキストベースのコミュニケーションの比重が高い状態にあります。

チケットシステムやソースコード管理ツール上の議論はもちろんおこなっているのですが、日報や議事メモによるインフォーマルな情報共有についても日々の進捗や課題の可視化に役立つため、 Qiita Team にそれらの文章を公開してもらうようにしています。Qiita Team では Markdown 形式でリッチな HTML をプレビューしながら書くことができます。

これらの文章は個々に探していけば読めるのではあるのですが、前日に行われた MarketOne チーム全体の進捗を俯瞰で共有しながら朝会を行うために、「チーム日報」という形でまとめることを考えました。チーム日報をまとめるために毎回手動でコピペしてくるのも面倒ですし、非生産的です。Qiita Team にはAPIが公開されているため、こちらを利用して個々の日報を取得するようにしてみました。

Qiita Team API を利用する

Qiita Team APIの仕様はこちらに公開されています(※現在はv2まで公開)。

まずは「設定」 → 「アプリケーション」からアクセストークンを生成します。OAuth認証などの仕組みも用意されているため、作成するアプリケーションに応じて適切な認証が利用できます。

Google Spread Sheet でプログラミング

今回はGoogle Spread Sheet 上に Markdown 形式でチーム日報を生成するようにします。Google Spread Sheet には Google App Script と呼ばれるサーバーサイドの JavaScript が用意されており、APIから取得した結果を成形しながらスプレッドシートに反映することができます。

Google Spread Sheet 上の「ツール」→「スクリプトエディタ」から Google App Script を起動します。

Google Spread Sheet で Qiita API を使ってみる

まずは API を利用するための関数を作成しましょう。

var api_endpoint = 'https://{チーム名}.qiita.com/api/v2'
var api_token = 'xxx'

function get_api_response(request_url, query_map) {
  var url_query = []
  var request_uri = api_endpoint + request_url;

  if(query_map !== undefined) { 
    for (key in query_map) {
      url_query.push(encodeURIComponent(key) + '=' + encodeURIComponent(query_map[key]))
    }
    request_uri += '?' + url_query.join('&');
  }
   
  var params = {}
  params.headers = {
    'Authorization' : 'Bearer ' + api_token
  };  
  
  var res = UrlFetchApp.fetch(request_uri, params);
  return res.getContentText("UTF-8")
}

http ヘッダに Authorization  Bearer {api_token}をセットすることで認証を行い、指定したリソースにクエリを発行してレスポンスを取得します。

チームの日報を取得する関数を作成

いよいよ Qiita Team からMarketOneに関係する日報を取得します。Qiitaチームでエントリを取得するには以下のリクエストを行います。

{api_endpoind}/items?query={検索条件}&sort={ソート項目}

今回ほしい条件は、 MarketOneチームのメンバー AND タグに「日報」を設定 AND 1日前のエントリ です。これをクエリストリングで表現すると以下の通りとなります。

user:{ユーザー名1} tag:日報 created:>-1d OR user:{ユーザー名2} tag:日報 created:>-1d

()による優先順位制御が行えれば、 tag:日報 と created:>-1d は一回でよいのですが、Qiita Team API では優先順位制御が行えないため、すべてのユーザーに対してこれらのAND条件を付与しています。またグループメンバーを取得するAPIもないため、get_group_members は単純な該当するユーザー名配列をそのまま返すようにしています。

function get_daily_report() {
  var querys = [];
  var members = get_group_members('mone');
  for(var idx in members) {
    querys.push('user:' + members[idx] + ' tag:日報 created:>-1d');
  }
  var query_string = querys.join(' OR ') ;  
  var json = JSON.parse(get_api_response('/items', {'query':query_string,'sort':'created'}));
  
  var res = [];
  for(var idx in json) {
    if(json[idx].title.match(/[0-9]{4}\/[0-9]{2}\/[0-9]{2}日報.+/)) {
      res.push(json[idx]);
    }
  }
  return res;
}

検索条件では前日の日報を絞り込みこめなかったため、タイトルの正規表現でさらにフィルタしたJSONを生成します。

JSON を Google Spread Sheet に反映

つづいて指定したカラム名の配列で Markedown 形式でテーブルを表現する文字列を生成する関数を実装します。

function create_markdown(column_names) {
  var ret = [];
  var markdown_column_names = [];
  for(var idx in column_names) {
    markdown_column_names.push('|' + column_names[idx]);
  }
  markdown_column_names.push('|')
  ret.push(markdown_column_names);
  
  var column_padding = []
  for (var idx in markdown_column_names) {
    if(idx < markdown_column_names.length - 1){
      column_padding.push('|---');
    } else {
      column_padding.push('|');
    }
  }
  ret.push(column_padding);
  return ret;
}

そして、生成した JSON から以下のように任意の情報を取得して成形することで前日分の日報をサマリしたチーム日報を生成することができます。

function get_daily_report_markdown() {
  var res = get_daily_report();
  var markdown = create_markdown(['名前','状況','日報']);
  for(var idx in res) {
    var rec = res[idx];
    
    var row = [];
    row.push('|' + ':@' + rec.user.id + ':' + ' @'+ rec.user.id);
    row.push('|' + '出勤');
    row.push('|' + '[' + rec.title + ']('+ rec.url + ')'); 
    row.push('|');
    markdown.push(row);
  }
  return markdown;
}

 

さらに本文からMarkedownの「本日の作業内容」段落を取得します

    row.push('|' + rec.body.replace(/#[\s]?本日の作業内容\n([\s\S]+?)\n#[\s\S]+/,'$1').replace(/\n+/g,'<br/>'));

黒魔術的な正規表現になってしまいましたが、やっているのは日報テンプレートの #本日の作業内容 と次の # 始まりの見出しまでの「改行を含む任意文字」を取得し、テーブル要素内で改行するために改行コードを <br/> タグに変換することです。

まとめ

以上の手順でメンバーの日報をまとめてチーム日報を生成するスクリプトが作成できました。あとは要件に応じて取得クエリや取得内容を調整できます。今回は Qiita Team APIを活用して手作業を減らす方法についてご紹介しましたが、MarketOneをはじめとするその他のサービスについてもAPIが公開されるようになってきています。APIを通じて必要な情報を自動でまとめる仕組みを作ることで、手間なく全体の状況をつかめるダッシュボードが作成できるようになるため試してみてはいかがでしょうか。