人材紹介・人材派遣向け業務管理クラウドシステム”porters”をAPIで自動操作しよう

# portersとは
人材業務（特にエージェント業務）に必要な機能を備えたクラウドシステムです
https://hrbc.porters.jp/
![人材紹介・人材派遣向け管理システム _ PORTERS（HRBC、HRビジネスクラウド）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/65c54858-3e5c-dd3a-c1dd-f69ae48c12ef.png)

# Portersのデータ入出力、編集を自動化したい！
今回は、このツールをGoogleのスプレッドシート＆GASで自動操作していきたいと思います

## 初期設定
コードを書く前に必要なのは
1. アプリを発行してもらう
1. システムのデータベースとアプリの連携を行う
お2つの操作です

### 1. アプリを発行してもらう
portersを運営しているポーターズ株式会社 の担当者に依頼を行うます
数日するとこんな感じで
![Fwd_ PORTERS Connect API 接続情報のご連絡：App Id - wagatsuma.itsuki@lmi.ne.jp - Lmi.ne.jp メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/7e23bf37-448f-a547-23b3-2ed2a2b22b86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/97c9d1fc-b259-2d24-e01a-547864a39e52.png)

必要な情報が届きます

:::note info
この時`App Id`、`Secret`、`Redirect URL`をメモっておきましょう
:::

### 2. システムのデータベースとアプリの連携を行う
上でもらったアプリに対して、「ウチのporters環境を操作していいよ～」という権限を与えます
#### 2-1. まずURLを作成する
上記`App Id`、`Secret`、`Redirect URL`を使ってURLを作成します
例として↓みたいな感じに
```
https://api-hrbc-jp.porterscloud.com/v1/oauth?app_id=123345678&redirect_url=https://www.hogehoge.co.jp&response_type=code&scope=partition_r,user_r,field_r,option_r,client_r,client_w,recruiter_r,recruiter_w,job_r,job_w,candidate_r,candidate_w,resume_r,resume_w,process_r,process_w,activity_r,activity_w,contract_r,contract_w,sales_r,sales_w,phase_r,phase_w,attachment_r,attachment_w,opportunity_r,opportunity_w,recruiter_r,recruiter_w
```
:::note
`app_id=123345678`yと`redirect_url=https://www.hogehoge.co.jp`の部分は
自身の`App Id`、`Redirect URL`に書き換えてください

`scope=`以下の部分はいったんすべての権限をスコープとして付与した例を書きました
「セキュリティーの問題から、APIにはJOB情報の読み込みだけを許可したい」であれば「job_w」だけを書くなど、調整してみてください
:::
どのスコープを付与すると、どの権限が与えられるのか、は[こちら](https://hrbcapi.porters.jp/hc/ja/articles/115008017487-OAuth)の**Scope List**を参考にしてください

#### 2-2. URLをブラウザに打ち込んで認証を完了させる
上で作ったURLをブラウザに打ち込んでみてください
IDとPassなどが求められるので入力いただければ、連携が完了します



## コーディング
### <font color="tomato">1. 大前提の注意</font>
portersとGASの相性がいまいちでして、
実行ボタンからAPIを叩くをうまくいかず、トリガーを設定して実行しAPIを叩くとうまくいきます
（これは、実行ボタンから実行されたスクリプトとトリガーから実行されたスクリプトで
使われているサーバが異なっていて、portersでは前者のサーバからのアクセスに応じないようになっているかららしい）

### 2. いよいよAPIを叩いてみよう
#### 2-1. Partition IDを確認する
Partitionとは、操作対象のpoters環境を契約している組織のことです
これをまずは取得しましょう。
以下のコードをエディタに入力してください
<details><summary>サンプルコード</summary>

```code.js
//各種変数の設定を行うスクリプト
const requestHost = "api-hrbc-jp.porterscloud.com" 
const redirectUrl = "https://★★"
const appId = "★★★★★" 
const secret = "★★★★"
const appName = "★★★★"

//上記変数を用いてTokenを取得するスクリプト
function getToken(){
  console.log("Codeを取得します=====")
  let oath_url = 
    "https://"+requestHost
    +"/v1/oauth?app_id="+appId
    +"&redirect_url="+ redirectUrl
    +"&response_type=code_direct"
  var response_oath = UrlFetchApp.fetch(oath_url,{'method' : "get"})
  let response_oath_xml = response_oath.getContentText();
  console.log("Oath認証をクリアしました\nレスポンスは\n"+response_oath_xml)

  let code_infomation = response_oath_xml.match(/<Code>(.*)<\/Code>/);
  let code = code_infomation[1];
  console.log("Codeを抽出しました\n　Codeは["+code+"]です")

  console.log("Tokenを取得します=====")
  const grant_type = "oauth_code"
  const getToken_url = 
    "https://"+requestHost+"/v1/token?"
    +"grant_type="+grant_type
    +"&app_id="+appId
    +"&secret="+secret
    +"&code="+code

  const response_getToken = UrlFetchApp.fetch(getToken_url, {'method' : "post"});
  let response_getToken_xml = response_getToken.getContentText()
  let token_infomation = response_getToken_xml.match(/<AccessToken>(.+)<\/AccessToken>/);
  let token = token_infomation[1]
  console.log("Tokenの取得に成功しました\nTokenは["+token+"]です");
  return token  
}

//メインの関数はこれ。
function getPartitionId() {
  var token = getToken()
  var url = root_url + "partition?request_type=1"
  
  var header = {
    'X-porters-hrbc-oauth-token': token
    }

  var option = {
    method: 'get',
    headers: header
  }

  var res = UrlFetchApp.fetch(url,option)
 
  var response_xml = res.getContentText()
  console.log(response_xml)
}

```
</details>

![無題のプロジェクト - プロジェクトのトリガー - Apps Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/adaf8905-0bc1-4c19-4d50-4fea5a34f653.png)
こんな感じでトリガーを設定しましょう
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/05d6a9c8-1bb9-0581-0fbe-32a03872ebed.png)
トリガーが実行されると、実行結果にこのようなログが書き込まれます
ここの`<Partition.P_Id>`と`</Partition.P_Id>`で囲まれた数字がPartition IDになります

:::note
お見事！無事APIを叩くことに成功しました！
次の記事では、実際にporters内のデータを書き出したり、入力したりしてみます
:::