LoginSignup
0
1

More than 1 year has passed since last update.

SmartHRのデータをGASで引っ張ってくるサンプル

Last updated at Posted at 2022-02-23

前提

公式ドキュメントを見るのが一番いいですが、初心者向けに。

サンプルコード

従業員全員の情報を引っ張ってくるサンプル

const TENANT_ID = 'YOUR_COMPANIYS_TENANT_ID';
const ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';
const STAY_SECOND = 1;

function is_last_page(headers){
    try{
        links = headers['link']; //nextのURL表記が最終ページで無くなる
        if('next' in links){
            return false;
        }else{
            return true;
        }
    }catch(e){
        if(e instanceof TypeError){  // 1ページで完結する場合はそもそもlink要素が無い
          return true;
        }else{
          throw e;
        }
    }
}

function object_to_param(obj){
  return Object.keys(obj).map(function(key){ return key+"="+ obj[key] }).join("&")
}

function extract(){
    let HEADERS = {
        'Authorization': 'Bearer '+ ACCESS_TOKEN
    };
    result = []
    // 安全のため上限を100回に設定
    for(let i = 1; i < 100; i++){
        let url = 'https://' + TENANT_ID + '.smarthr.jp/api/v1/crews?';
        let payload = {
            'page': i,
            'per_page': 100,
            'emp_status': 'employed', //ここらへんはご自身のやりたいことに合せて追加・削除してください。
        }
        let options = {
            'method'  : 'GET',
            'headers' : HEADERS,
        }
        let response = UrlFetchApp.fetch(url + object_to_param(payload), options);
        let result = result.concat(JSON.parse(response));
        if(is_last_page(response.getHeaders())){
            break;
        }else{
            Utilities.sleep(STAY_SECOND * 1000);
        }
    }
    return result;
}

function main(){
    Logger.log(extract());
}

解説

  • APIを叩いているextract()では、ページ遷移が発生するためループ構造になっている。
  • is_last_page()でページ遷移における最終ページかの判定をしている。もっとエレガントな方法もあるかも。
  • object_to_param()は、オブジェクトをGETメソッドのパラメタ文字列に変換している。GASのGETではoptionsにpayloadとして追加することはできないっぽい。

次回はその後の加工について記載する。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1