[GAS・google apps script]人事労務freee で従業員一覧を取得する

[GAS・google apps script]人事労務freee で従業員一覧を取得する

kazuya_saito/イデアルファーロ株式会社 CEO


結論

以下のコードで従業員一覧(退職者除く)を取得できます。

/******************************************************************
参照ライブラリ
title        |OAuth2
project_key  |1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
******************************************************************/
//連携アプリ情報(Googleスプレッドシートサンプルファイル)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var APP_ID = "";
var SECRET = "";
/******************************************************************
function name |alertAuth
summary       |認証のエンドポイントとなるダイアログ
******************************************************************/
function alertAuth() {
    var service = getService();
    var authorizationUrl = service.getAuthorizationUrl();
    var template = HtmlService.createTemplateFromFile("autho");
    template.authorizationUrl = authorizationUrl;
    var page = template.evaluate();
    SpreadsheetApp.getUi().showModalDialog(page, "認証をしてください");
}
/******************************************************************
function name |getService
summary       |freeeAPIのサービスを取得
******************************************************************/
function getService() {
    return OAuth2.createService("freee")
        .setAuthorizationBaseUrl("https://secure.freee.co.jp/oauth/authorize")
        .setTokenUrl("https://api.freee.co.jp/oauth/token")
        .setClientId(APP_ID)
        .setClientSecret(SECRET)
        .setCallbackFunction("authCallback")
        .setPropertyStore(PropertiesService.getUserProperties());
}
/******************************************************************
function name |authCallback
summary       |認証コールバック
******************************************************************/
function authCallback(request) {
    var service = getService();
    var isAuthorized = service.handleCallback(request);
    if (isAuthorized) {
        return HtmlService.createHtmlOutput("認証に成功しました。タブを閉じてください。");
    }
    else {
        return HtmlService.createHtmlOutput("認証に失敗しました。");
    }
}
function getRequest() {
    var freeeApp = getService();
    var accessToken = freeeApp.getAccessToken();
    var requestUrl = 'https://api.freee.co.jp/api/1/companies';   
    var headers = { Authorization: "Bearer " + accessToken };
    var targetSheetName = "事業所一覧";
    var options = {
        method: "get",
        headers: headers
    };
    var res = UrlFetchApp.fetch(requestUrl, options).getContentText();
    //レスポンスのデータを配列に格納
    var parsedResponse = JSON.parse(res);
    Logger.log(parsedResponse);
    var data = parsedResponse.companies;
    var param1 = [];
    var param2 = [];
    var param3 = [];
    var param4 = [];
    var param5 = [];
    for (var i = 0; i < data.length; i++) {
        param1.push([data[i].id]);
        param2.push([data[i].name]);
        param3.push([data[i].display_name]);
 
    }
    //取得したデータをシートに保存
    var sheet = ss.getSheetByName(targetSheetName);
    sheet.clear();
    sheet.getRange(2, 1, param1.length, 1).setValues(param1);
    sheet.getRange(2, 2, param2.length, 1).setValues(param2);
    sheet.getRange(2, 3, param3.length, 1).setValues(param3);

}

function getRequestEmployees() {
  var freeeApp = getService();
  var accessToken = freeeApp.getAccessToken();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
  sheet.clear();
  var param1 = [];
  var param2 = [];
  var param3 = [];
  var param4 = [];
  var param5 = [];
  var param6 = [];
  var param7 = [];
  for ( var i = 1 ; i < 3 ; i++ ) {
  var pages =String(i);
  var requestUrl ="https://api.freee.co.jp/hr/api/v1/companies//employees?per=100&page="+ pages;
  var headers = { "Authorization" : "Bearer " + accessToken };
  var options ={
     "method"  : "get",
     "headers" : headers
   };
  var res = UrlFetchApp.fetch( requestUrl , options ).getContentText();
  //レスポンスのデータを配列に格納
  var parsedResponse = JSON.parse( res );
  var data = parsedResponse;
  for ( var j = 0 ; j < data.length ; j++ ) {
    param1.push( [ data[ j ].num ] );
    param2.push( [ data[ j ].display_name ] );
    param3.push( [ data[ j ].user_id ] );
    param4.push( [ data[ j ].email ] );
    param5.push( [ data[ j ].entry_date ] );
    param6.push( [ data[ j ].retire_date ] );
    param7.push( [ data[ j ].id ] );
  };
  }
  //取得したデータをシートに保存
  sheet.getRange( 1 , 1 , param1.length , 1 ).setValues( param1 );
  sheet.getRange( 1 , 2 , param2.length , 1 ).setValues( param2 );
  sheet.getRange( 1 , 3 , param3.length , 1 ).setValues( param3 );
  sheet.getRange( 1 , 4 , param4.length , 1 ).setValues( param4 );
  sheet.getRange( 1 , 5 , param5.length , 1 ).setValues( param5 );
  sheet.getRange( 1 , 6 , param6.length , 1 ).setValues( param6 );
  sheet.getRange( 1 , 7 , param7.length , 1 ).setValues( param7 );
  
}
function deleteRetireEmployees() {
    //シートやスクリプトプロパティを読み込む
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
    var data = sheet.getDataRange().getValues();
    var emptyInfo = [];
    var param1 = [];
    var param2 = [];
    var param3 = [];
    var param4 = [];
    var param5 = [];
    var param6 = [];
    var param7 = [];
    for (var j = 0; j < data.length; j++) {
        var isCheckedEmpty = data[j][5];
        if (isCheckedEmpty == "") {
            param1.push([data[j][0]]);
            param2.push([data[j][1]]);
            param3.push([data[j][2]]);
            param4.push([data[j][3]]);
            param5.push([data[j][4]]);
            param6.push([data[j][5]]);
            param7.push([data[j][6]]);
        }else{
        }

    }    
    //取得したデータをシートに保存
    sheet.clear();
    sheet.getRange(1, 1, param1.length, 1).setValues(param1);
    sheet.getRange(1, 2, param2.length, 1).setValues(param2);
    sheet.getRange(1, 3, param3.length, 1).setValues(param3);
    sheet.getRange(1, 4, param4.length, 1).setValues(param4);
    sheet.getRange(1, 5, param5.length, 1).setValues(param5);
    sheet.getRange(1, 6, param6.length, 1).setValues(param6);
    sheet.getRange(1, 7, param7.length, 1).setValues(param7);
}



はじめに

人事労務freeeのマスタ人事データを出力できるようにすると従業員一覧として、活用でき便利です。スプレッドシートを用意作成しておき、scriptを作成することで自動化できます。

ざっくりとした手順

1.freeeのアプリケーションを登録します。 https://secure.freee.co.jp/oauth/applications
2. スプレッドシートを作成しておき(シートは事業所一覧と従業員一覧とする)、script(code.gs , 認証ダイアログ.html)を作成します
3.scriptを動かして、アクセストークンを手に入れます。
4.従業員一覧を出力します。(退職者の削除)

1.freeeのアプリケーションを登録します。


なぜ、アプリケーションの登録が必要かというとfreeeはauth2.0(オーオース)を使うからです。説明は下記がわかりやすいです。

認可サーバにアプリケーションの登録をしておくと、アクセストークンを取得することができるようになります。

もらったアクセストークンを使用して、従業員情報があるリソースサーバー(freeeの図解ではデータサーバ)にアクセスします。

開発者のアカウントで会計freeeにログインし、

 にアクセスし、「+新しいアプリケーションを登録」をクリックします。今回はGASを使うので、

 freeeにアプリ登録をする際のCALLBACK_URLには「https://script.google.com/macros/d/{スクリプト ID}/usercallback」を用いてください

 のとおりに、CALLBACK_URLを設定します。

var APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

をメモしておきます。

2. スプレッドシートを作成しておき、script(code.gs , 認証ダイアログ.html)を作成します

基本的にfreeeの公式に従って実行します。

/******************************************************************
参照ライブラリ
title        |OAuth2
project_key  |1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
******************************************************************/
//連携アプリ情報(Googleスプレッドシートサンプルファイル)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var APP_ID = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
/******************************************************************
function name |alertAuth
summary       |認証のエンドポイントとなるダイアログ
******************************************************************/
function alertAuth() {
 var service = getService();
 var authorizationUrl = service.getAuthorizationUrl();
 var template = HtmlService.createTemplateFromFile( "認証ダイアログ" );
 template.authorizationUrl = authorizationUrl;
 var page = template.evaluate();
 SpreadsheetApp.getUi().showModalDialog( page , "認証をしてください" );
}
/******************************************************************
function name |getService
summary       |freeeAPIのサービスを取得
******************************************************************/
function getService() {
 return OAuth2.createService( "freee" )
     .setAuthorizationBaseUrl( "https://secure.freee.co.jp/oauth/authorize" )
     .setTokenUrl( "https://api.freee.co.jp/oauth/token" )
     .setClientId( APP_ID )
     .setClientSecret( SECRET )
     .setCallbackFunction( "authCallback" )
     .setPropertyStore( PropertiesService.getUserProperties() );
}
/******************************************************************
function name |authCallback
summary       |認証コールバック
******************************************************************/
function authCallback( request ) {
 var service = getService();
 var isAuthorized = service.handleCallback( request );
 if ( isAuthorized ) {
   return HtmlService.createHtmlOutput( "認証に成功しました。タブを閉じてください。" );
 } else {
   return HtmlService.createHtmlOutput( "認証に失敗しました。" );
 };
}


次にscriptのファイルから新規作成→HTMLを作成し、ファイル名を認証ダイアログとします。そして中身は

<a href="<?= authorizationUrl ?>" target="_blank" rel="noopener">認証する</a>

とします。次に"リソース"→"ライブラリ"から

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

を入力しライブラリを追加します。

そして、スクリプトを実行すると、ダイアログがひらくので、認証します。
これでアクセストークンを手に入れることがでたので、リソースサーバーに接続できるようなります。

企業IDをまず取得する必要があります。curlで取得できますが、

今回はspreadsheetに記載します。

function getRequest() {
    var freeeApp = getService();
    var accessToken = freeeApp.getAccessToken();
    var requestUrl = 'https://api.freee.co.jp/api/1/companies';   
    var headers = { Authorization: "Bearer " + accessToken };
    var targetSheetName = "事業所一覧";
    var options = {
        method: "get",
        headers: headers
    };
    var res = UrlFetchApp.fetch(requestUrl, options).getContentText();
    //レスポンスのデータを配列に格納
    var parsedResponse = JSON.parse(res);
    Logger.log(parsedResponse);
    var data = parsedResponse.companies;
    var param1 = [];
    var param2 = [];
    var param3 = [];
    var param4 = [];
    var param5 = [];
    for (var i = 0; i < data.length; i++) {
        param1.push([data[i].id]);
        param2.push([data[i].name]);
        param3.push([data[i].display_name]);
 
    }
    //取得したデータをシートに保存
    var sheet = ss.getSheetByName(targetSheetName);
    sheet.clear();
    sheet.getRange(1, 1, param1.length, 1).setValues(param1);
    sheet.getRange(1, 2, param2.length, 1).setValues(param2);
    sheet.getRange(1, 3, param3.length, 1).setValues(param3);

}

実行するとA1セルに企業IDが表示されていると思います。企業IDは従業員を取得するときに必要となります。freeeのAPIは企業IDがなくても、取得できるものとできないものがあります。*大体企業IDは必要です。

企業IDを用いて、従業員一覧を取得します。

function getRequest() {
  var freeeApp = getService();
  var accessToken = freeeApp.getAccessToken();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
  sheet.clear();
  var param1 = [];
  var param2 = [];
  var param3 = [];
  var param4 = [];
  var param5 = [];
  var param6 = [];
  var param7 = [];
  for ( var i = 1 ; i < 3 ; i++ ) {
  var pages =String(i);
  var requestUrl ="https://api.freee.co.jp/hr/api/v1/companies/企業ID/employees?per=100&page="+ pages;
  var headers = { "Authorization" : "Bearer " + accessToken };
  var options ={
     "method"  : "get",
     "headers" : headers
   };
  var res = UrlFetchApp.fetch( requestUrl , options ).getContentText();
  //レスポンスのデータを配列に格納
  var parsedResponse = JSON.parse( res );
  var data = parsedResponse;
  for ( var j = 0 ; j < data.length ; j++ ) {
    param1.push( [ data[ j ].num ] );
    param2.push( [ data[ j ].display_name ] );
    param3.push( [ data[ j ].user_id ] );
    param4.push( [ data[ j ].email ] );
    param5.push( [ data[ j ].entry_date ] );
    param6.push( [ data[ j ].retire_date ] );
    param7.push( [ data[ j ].id ] );
  };
  }
  //取得したデータをシートに保存
  sheet.getRange( 1 , 1 , param1.length , 1 ).setValues( param1 );
  sheet.getRange( 1 , 2 , param2.length , 1 ).setValues( param2 );
  sheet.getRange( 1 , 3 , param3.length , 1 ).setValues( param3 );
  sheet.getRange( 1 , 4 , param4.length , 1 ).setValues( param4 );
  sheet.getRange( 1 , 5 , param5.length , 1 ).setValues( param5 );
  sheet.getRange( 1 , 6 , param6.length , 1 ).setValues( param6 );
  sheet.getRange( 1 , 7 , param7.length , 1 ).setValues( param7 );
  
}

今回はpagesにfor文をまわし、データを取得しています。ページネーションについては以下が詳しいです。ここらへんは従業員の規模によるかと思います。

4.従業員一覧を出力します。(退職者の削除)

今のままだと退職者も入っているので、削除します。退職日が記載されている配列は飛ばすようにします。

for (var j = 0; j < data.length; j++) {
       var isCheckedEmpty = data[j][5];
       if (isCheckedEmpty == "") {
           param1.push([data[j][0]]);
           param2.push([data[j][1]]);
           param3.push([data[j][2]]);
           param4.push([data[j][3]]);
           param5.push([data[j][4]]);
           param6.push([data[j][5]]);
           param7.push([data[j][6]]);
       }else{
       }
   }    

以上の配列をつくったら、sheet.clear( )を実行し、シートの中身を消してから、シートに貼り付けます。

function deleteRetireEmployees() {
   //シートやスクリプトプロパティを読み込む
   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
   var data = sheet.getDataRange().getValues();
   var emptyInfo = [];
   var param1 = [];
   var param2 = [];
   var param3 = [];
   var param4 = [];
   var param5 = [];
   var param6 = [];
   var param7 = [];
   for (var j = 0; j < data.length; j++) {
       var isCheckedEmpty = data[j][5];
       if (isCheckedEmpty == "") {
           param1.push([data[j][0]]);
           param2.push([data[j][1]]);
           param3.push([data[j][2]]);
           param4.push([data[j][3]]);
           param5.push([data[j][4]]);
           param6.push([data[j][5]]);
           param7.push([data[j][6]]);
       }else{
       }
   }    
   //取得したデータをシートに保存
   sheet.clear();
   sheet.getRange(1, 1, param1.length, 1).setValues(param1);
   sheet.getRange(1, 2, param2.length, 1).setValues(param2);
   sheet.getRange(1, 3, param3.length, 1).setValues(param3);
   sheet.getRange(1, 4, param4.length, 1).setValues(param4);
   sheet.getRange(1, 5, param5.length, 1).setValues(param5);
   sheet.getRange(1, 6, param6.length, 1).setValues(param6);
   sheet.getRange(1, 7, param7.length, 1).setValues(param7);
}

全体です。

/******************************************************************
参照ライブラリ
title        |OAuth2
project_key  |1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
******************************************************************/
//連携アプリ情報(Googleスプレッドシートサンプルファイル)
var ss = SpreadsheetApp.getActiveSpreadsheet();
var APP_ID = "";
var SECRET = "";
/******************************************************************
function name |alertAuth
summary       |認証のエンドポイントとなるダイアログ
******************************************************************/
function alertAuth() {
    var service = getService();
    var authorizationUrl = service.getAuthorizationUrl();
    var template = HtmlService.createTemplateFromFile("autho");
    template.authorizationUrl = authorizationUrl;
    var page = template.evaluate();
    SpreadsheetApp.getUi().showModalDialog(page, "認証をしてください");
}
/******************************************************************
function name |getService
summary       |freeeAPIのサービスを取得
******************************************************************/
function getService() {
    return OAuth2.createService("freee")
        .setAuthorizationBaseUrl("https://secure.freee.co.jp/oauth/authorize")
        .setTokenUrl("https://api.freee.co.jp/oauth/token")
        .setClientId(APP_ID)
        .setClientSecret(SECRET)
        .setCallbackFunction("authCallback")
        .setPropertyStore(PropertiesService.getUserProperties());
}
/******************************************************************
function name |authCallback
summary       |認証コールバック
******************************************************************/
function authCallback(request) {
    var service = getService();
    var isAuthorized = service.handleCallback(request);
    if (isAuthorized) {
        return HtmlService.createHtmlOutput("認証に成功しました。タブを閉じてください。");
    }
    else {
        return HtmlService.createHtmlOutput("認証に失敗しました。");
    }
}
function getRequest() {
    var freeeApp = getService();
    var accessToken = freeeApp.getAccessToken();
    var requestUrl = 'https://api.freee.co.jp/api/1/companies';   
    var headers = { Authorization: "Bearer " + accessToken };
    var targetSheetName = "事業所一覧";
    var options = {
        method: "get",
        headers: headers
    };
    var res = UrlFetchApp.fetch(requestUrl, options).getContentText();
    //レスポンスのデータを配列に格納
    var parsedResponse = JSON.parse(res);
    Logger.log(parsedResponse);
    var data = parsedResponse.companies;
    var param1 = [];
    var param2 = [];
    var param3 = [];
    var param4 = [];
    var param5 = [];
    for (var i = 0; i < data.length; i++) {
        param1.push([data[i].id]);
        param2.push([data[i].name]);
        param3.push([data[i].display_name]);
 
    }
    //取得したデータをシートに保存
    var sheet = ss.getSheetByName(targetSheetName);
    sheet.clear();
    sheet.getRange(2, 1, param1.length, 1).setValues(param1);
    sheet.getRange(2, 2, param2.length, 1).setValues(param2);
    sheet.getRange(2, 3, param3.length, 1).setValues(param3);

}

function getRequestEmployees() {
  var freeeApp = getService();
  var accessToken = freeeApp.getAccessToken();
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
  sheet.clear();
  var param1 = [];
  var param2 = [];
  var param3 = [];
  var param4 = [];
  var param5 = [];
  var param6 = [];
  var param7 = [];
  for ( var i = 1 ; i < 3 ; i++ ) {
  var pages =String(i);
  var requestUrl ="https://api.freee.co.jp/hr/api/v1/companies//employees?per=100&page="+ pages;
  var headers = { "Authorization" : "Bearer " + accessToken };
  var options ={
     "method"  : "get",
     "headers" : headers
   };
  var res = UrlFetchApp.fetch( requestUrl , options ).getContentText();
  //レスポンスのデータを配列に格納
  var parsedResponse = JSON.parse( res );
  var data = parsedResponse;
  for ( var j = 0 ; j < data.length ; j++ ) {
    param1.push( [ data[ j ].num ] );
    param2.push( [ data[ j ].display_name ] );
    param3.push( [ data[ j ].user_id ] );
    param4.push( [ data[ j ].email ] );
    param5.push( [ data[ j ].entry_date ] );
    param6.push( [ data[ j ].retire_date ] );
    param7.push( [ data[ j ].id ] );
  };
  }
  //取得したデータをシートに保存
  sheet.getRange( 1 , 1 , param1.length , 1 ).setValues( param1 );
  sheet.getRange( 1 , 2 , param2.length , 1 ).setValues( param2 );
  sheet.getRange( 1 , 3 , param3.length , 1 ).setValues( param3 );
  sheet.getRange( 1 , 4 , param4.length , 1 ).setValues( param4 );
  sheet.getRange( 1 , 5 , param5.length , 1 ).setValues( param5 );
  sheet.getRange( 1 , 6 , param6.length , 1 ).setValues( param6 );
  sheet.getRange( 1 , 7 , param7.length , 1 ).setValues( param7 );
  
}
function deleteRetireEmployees() {
    //シートやスクリプトプロパティを読み込む
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("従業員一覧");
    var data = sheet.getDataRange().getValues();
    var emptyInfo = [];
    var param1 = [];
    var param2 = [];
    var param3 = [];
    var param4 = [];
    var param5 = [];
    var param6 = [];
    var param7 = [];
    for (var j = 0; j < data.length; j++) {
        var isCheckedEmpty = data[j][5];
        if (isCheckedEmpty == "") {
            param1.push([data[j][0]]);
            param2.push([data[j][1]]);
            param3.push([data[j][2]]);
            param4.push([data[j][3]]);
            param5.push([data[j][4]]);
            param6.push([data[j][5]]);
            param7.push([data[j][6]]);
        }else{
        }

    }    
    //取得したデータをシートに保存
    sheet.clear();
    sheet.getRange(1, 1, param1.length, 1).setValues(param1);
    sheet.getRange(1, 2, param2.length, 1).setValues(param2);
    sheet.getRange(1, 3, param3.length, 1).setValues(param3);
    sheet.getRange(1, 4, param4.length, 1).setValues(param4);
    sheet.getRange(1, 5, param5.length, 1).setValues(param5);
    sheet.getRange(1, 6, param6.length, 1).setValues(param6);
    sheet.getRange(1, 7, param7.length, 1).setValues(param7);
}


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
kazuya_saito/イデアルファーロ株式会社 CEO
CEO(https://idealfaro.com/)。 自己紹介詳細(http://bit.ly/37VdEfB) 世界初のAIケアプラン作成支援ソフト「パッチリ」を日本IBMと開発。IBM Cloud & AI Conferenceにて変革を実現する企業として紹介。