ランサーズ(Lancers)エンジニアブログ > JavaScript > ランサーズ開発合宿2019 GASとSmartHR APIで業務効率化

ランサーズ開発合宿2019 GASとSmartHR APIで業務効率化

blog_admin|2019年10月10日
JavaScript

みなさんこんにちは。
ランサーズでインターンをしている神谷(GunjiKamiya)です。

自身初投稿となる今回の記事では、自分が参加したLancers開発合宿2019でのことについて書いていこうと思います。

Lancersの開発部では、1年に一度大都会東京を離れ、自然豊かな場所で開発をする機会を設けています。

過去に4回ほど開催されており、どの開発合宿も日頃の疲れを取るとともに、メンバーをリフレッシュさせてくれる素晴らしい合宿になっているようです!

過去の開発合宿の記事はこちら

2015年

ランサーズ初のハッカソン開発合宿

2016年

横須賀ハッカソン合宿

2017年

ランサーズ開発合宿2017@湯河原温泉おんやど恵

2018年

ランサーズ開発合宿2018@熱海 新規事業開発チーム
ハイパフォーマンスな開発合宿をする3つの秘訣
ランサーズ開発合宿2018 バージョンアップチーム
ランサーズ開発合宿2018@熱海 仕事案件のクローラー開発チーム

そして今年も無事開催されることとなり、場所は静岡県の城ヶ崎海岸というところになりました。

↑このような素晴らしい場所で開発しました!(凄すぎて集中できない笑)

 

バックグラウンドを簡単に

2019年の3月からランサーズでエンジニアとしてインターンをしている、神谷暉士(かみやぐんじ)と申します。

2000年生まれの19歳です。

高校卒業後、都内のベンチャー企業をいくつかインターンをしながら生活をしていました。

1000人規模の大きな会社や数人しかいないスタートアップなどで1年と少しの期間を働いて、4社目にランサーズにジョインしたということになりますね。

ランサーズのエンジニアブログは前々から、社内の雰囲気を知るために見ていたのですが、今そのブログを書いているのだと思うと、少し不思議な感じがしますね(笑)

頑張って書きます!

 

開発合宿開始!

今回のランサーズ開発合宿の目標は、未来へ繋がるような開発合宿にすることです!

自分は初参加ということもあり、開発合宿という短期間でどのようなアウトプットを出せるのかを考えてみました。

自分が今回のテーマ決めのために考慮したのは、以下の2つです。

  • 開発合宿だけではなく、今後の開発に使用できる技術
  • 社内の小さな問題を解決

今回の合宿は未来につながる合宿にするということで、様々なものに応用できるような技術を使ってみたいと思いました。また、開発合宿は2日間(実際の作業時間はもっと少ない泣)という短期間できちんとしたアウトプットを出すために、大きいテーマではなく、あえて小さな問題を解決することにしました。そんな感じで、開発合宿初参加の自分の開発テーマは次のように決まりました!

「SmartHRのAPIを使って労務の社員管理を向上する」

ランサーズではSmartHRというクラウド人事労務ソフトを使っています。

SmartHR上に社員情報などを保存し管理しているのですが、実はそれとは別でスプレッドシートにもベタ書きしたデータを持っているようなのです。

その状態では、SmartHR上に変更があるたびに、スプレッドシートも変更しなければならないという2重管理状態になってしまいます。

毎日あるような作業ではないものの、作業のたびSmartHRに直接アクセスして手動で更新しなければならないため、労務の方が大変です。

色々考えていくうちに、SmartHRで変更したタイミングで自動的にスプレッドシートが更新されたら、すごく便利なのではないかと思い始めていきました。

そして、テーマ決めの参考材料である、「開発合宿だけでなく、今後の開発に使用できる技術」「社内の小さな問題を解決」の2つもクリアしていることがわかり、早速取り組んでみることにしました。

 

開発環境

SmartHRからはAPIを使ってデータを取得することになります。

しかし、直接本番データをいじるのはちょっと気が引けますよね。

自分自身、外部のサービスへAPIを使った開発には慣れていないということもあり、どうすればいいのやら。。

そんな時のために、SmartHRではsandboxというとても便利な環境が用意されているのです!

ありがとう!SmartHRさん!有効活用させていただきます!

以下がSmartHR APIのサンドボックス環境実行サンプルになります。

■サンドボックス
[ログインURL]
https://app.daruma.space/

 

[Basic認証]
ID: *****
Password: *****

 

[API実行サンプル]
curl -H 'Authorization: Bearer *******************' https://******.daruma.spce/api/v1/crews/

ちなみにこちらのサンドボックス環境は、SmartHRのAPIリファレンスページから申請できるので、よろしければ下記のURLから申請してみてください!

SmartHR API Sandbox ご利用お申込みフォーム

実行サンプルを叩いてみると、JSON形式でデータが返ってくるようになっています。

実行サンプルから返ってくるデータは全て架空の人物の情報なので、テストデータとして使うことができます。
また、ページネートを変えてAPIを叩けば、違う人物のデータが返ってきます。(以下で実証)

[API実行サンプル]
for i in $(seq 1 10) ;do curl -H 'Authorization: Bearer *******************' https://******.daruma.spce/api/v1/crews?page=$i ;done

上ではページネートを10まで変えてAPIを叩いてるのですが、実際に帰ってきたデータは30件ほどでした。

 

SmartHR APIを使ってデータを取得!

通常SmartHRのAPIからは、1度に10件のデータしか取得することができないのですが、先ほど紹介したやり方で全てのデータを取得することができるようになったと思います。

ここからは実際に、APIを叩いて配列に格納するところまでやってみましょう。

まずは、取得したデータを格納する配列を作っておきます。

// SmartHRのAPIから取得したデータ保存する配列
var user_data = [];

SmartHRにAPIを叩くために必要な情報を書いていきます。

// APIのアクセス先を定義
var url = 'https://******.daruma.spce/api/v1/crews?page=' + i;
var options =
  {
    'method' : 'get',
    'contentType': 'application/json',
    'headers': {'Authorization' : 'Bearer *******************'},
  };

これらの情報を使ってAPIを叩きます!
返ってきたデータはJSON形式なので、パースしてから配列に格納していきましょう。

for (var i=1; i<10; i++) {
  var response = UrlFetchApp.fetch(url, options);
  json = JSON.parse(response);

  // 1ページあたり10のユーザー情報が取得できるので、それらを配列に追加していく
  for (var e=0, l=json.length; e<l; e++) {
    user_data[user_data.length] = json[e];
  }
}
return user_data;

これでSmartHRから取得した全てのデータが格納された配列( user_data)を作ることができました。

 

GoogleAppsScriptを使っていざ出力!

今回は労務で使用するスプレッドシートへ自動で出力できるようにするために、GoogleAppsScript(通称:GAS)を使っていきます。

GASとは、Googleが開発したスクリプトプラットフォームで、G Suiteプラットフォームに対して色々自由に実装ができるのです!

これを使えば、SmartHRに対してAPIを叩き、スプレッドシートに出力するところまで、一括で実装できるようになります。

シートを生成

まずはスプレッドシートを作成していきます。

スプレッドシートの生成は、 insertSheet(シート名)で行うことができます。

var sheetName = '社員一覧';
var spreadSheet = SpreadsheetApp.getActive();
spreadSheet.insertSheet(sheetName);

 

社員一覧のひな形を生成

社員データを一覧に出力するために、まずはひな形を生成する必要があります。

直接書いていっても良いのですが、せっかくなので実装していきます。

// 出力するシートを定義
var sheet = spreadSheet.getSheetByName('社員一覧');

// ひな形で生成する項目を定義
var display_items = ['社員\n番号', '氏名', '雇用形態', '役職', '在籍状況'];

// 項目を出力するセルを定義
var scoop = ['A1', 'B1', 'C1', 'D1', 'E1'];

for (var i=0, l=display_items.length; i<l; i++) {
  //出力先を定義
  var push_point = sheet.getRange(scoop[i]);

  // 項目を出力
  push_point.setValue(display_items[i]);
  // 背景色を変更
  push_point.setBackground('#01366a');
  // 文字色を変更
  push_point.setFontColor('#ffffff');
  // 文字をセルの中央に配置
  push_point.setHorizontalAlignment('center');
  push_point.setVerticalAlignment('middle');
}

↑このように綺麗にひな形を生成することができました!

ユーザーデータをシートに出力

それでは、ここから実際に取得したユーザー情報を生成したひな形に出力していきましょう。

出力は配列に格納されている全てのユーザー情報を、出力するだけになります。
少し処理が重いように感じるかもしれませんが、それは実装の問題ではなく、GAS自体の問題になるので、少し遅くても気にしなくても大丈夫だと思います。

for (var a=0, l=user_data.length; a<l; a++) {
  // 出力する行
  var pushNumber = i + 2;
    
  // 社員番号出力
  sheet.getRange("A" + pushNumber).setValue(user_data[a]['emp_code']);
    
  // 氏名出力
  var name = user_data[a]['last_name'] + user_data[a]['first_name'];
  sheet.getRange("B" + pushNumber).setValue(name);
    
  // 雇用形態出力
  sheet.getRange("C" + pushNumber).setValue(user_data[a]['employment_type']['name']);
    
  // 役職出力
  sheet.getRange("E" + pushNumber).setValue(user_data[a]['position']);
    
  // 在籍状況出力
  sheet.getRange("F" + pushNumber).setValue(user_data[a]['emp_status']);
}

このように出力されました!
在籍状況のように、入れられている値が日本語ではない場合もあるので、それぞれ変換させて出力させてもいいですね。

↑こんな感じで在籍状況を日本語に変換!

テストデータは全部で30人ほど登録されていたので、30人の情報が全て下にズラーっと出力されました。

今回は5つの項目しか出力しませんでしたが、SmartHR APIには、これ以外にも多くの項目が用意されていて、SmartHR上に登録されている情報は、おおよそ取得できるようです。

詳しくは公式リファレンスを参考にしてみてくださいね。

SmartHR API Specifications

GoogleAppsScriptの公式リファレンスもぜひ参考にしてみてください。

Spreadsheet Service | Apps Script | Google Developers

 

各チームの発表タイム!

ついに開発合宿も最終日となりました。

各チーム、それぞれ開発したものや検証したものを発表する時間になりました。

少し見えづらいですが、きちんと目指していたものを形にすることができました。

その他のチームでも。。。

技術の検証をしたり、、

 

ツールの検証をしてみたり、、

あれ?どこかで見たことのあるシルエットですね(笑)

どのチームも、ランサーズの未来につながるような発表で本当に勉強になりました!

 

最後に。。

ランサーズでは、今回で5回目の開発合宿を無事終えることができました。

普段とは違った環境、違った空気感での開発は本当に最高でした。

(最高すぎて集中できなかったことがあったのは内緒ですが笑)

時にはこうした場所で、心と体を休めながら、自分やチームのメンバーに向き合うことも大切なのでしょうね。

普段からあまり詰め込みすぎないようにしたいところですが、それはそれでしょうがないです。

最後に、毎年恒例の写真を載せておきます。