HRMOS勤怠by IEYASUにAPI連携するGAS作っていく #1

非エンジニアですが、バックオフィスの効率化を、生成AIの助けと先人の皆様のお知恵を借りながらやっていきます。僭越ですが、こちらに記録として残していくことにします。
# 実現したいこと
* HRMOS勤怠の月次レポートの一覧から対象月の全社員分の勤務データを取得し長時間労働のアラート対象者リストを作成する
* アラート対象者リストをもとに対象社員へアラートメールや産業医面談の勧奨／依頼メールを送信する
* アラート対象者リストをもとに対象社員の上席社員たちにレポートメールを送信する

「[HRMOS勤怠 by IEYASU](https://www.ieyasu.co/)」のAPI連携で、[月次レポート一覧](https://ieyasu.co/docs/api.html#/paths/~1work_output_months~1monthly~1{month}/get)を取得し、Goolgeスプレッドシートに転記、さらに特定の条件を超過した長時間労働者について別のGoogleスプレッドシートにアラート対象者リストとして記載していく。
また、このアラート対象者リストから一定の条件の社員に対してアラートメールや産業医面談の勧奨や面談設定を要請するメールを送信する。
さらに上司に対してもレポートメールを送信する。
# 方針
私はコードを書けませんので、実際の作業はネット上にある先人のみなさまの記事と生成AIを頼りにして実装していきます。
* 生成AIは有料契約しているChatGPT 4o を使用します（データ提供はoff）
* 作業手順についてもネット上の記事と生成AIを活用していきます
* 当社はGoogle Workspace を使用していますのでデータは基本的にGoogle Drive や Google スプレッドシートで管理します
* GASのソースコードはいったん直接記述することとし、いずれはGithubで管理することを検討します
# この記事のゴール：まずはAPI連携できるようにする
ではさっそくAPI連携ができるように準備していきましょう。
スプレッドシートを新規作成して、拡張機能のApps Scriptからエディタを開きます。ここに記述するコードをchatGPTに書いてもらいます。
最初のプロンプトはこんな感じにしてみます。
```:プロンプト
HRMOS勤怠からAPI連携をしてGoogleスプレッドシートに社員1人1レコードのデータとして転記します。
HRMOS勤怠のAPI仕様書は下記です
https://ieyasu.co/docs/api.html

APIのURLに使用するcompany_nameはGASのプロパティとして保存します。
プロパティ名はHRMOS_COMPANY_URL とします。
API KEYのシークレットKEYもGASのプロパティとして保存します。
プロパティ名はHRMOS_API_KEY とします。
まずはプロパティとして保存するコードを生成してください。

API連携ができるようになったら「月次レポートの一覧」で社員の勤怠データを取得し、スプレッドシートに転記していきます。まずはプロパティへ保存後にAPI連携のコード作成を指示します。
```
結果として、こんなコードを指示されました。
```javascript
function saveProperties() {
  // スクリプトプロパティを取得
  var scriptProperties = PropertiesService.getScriptProperties();

  // 保存するプロパティを設定
  var companyName = 'your_company_name'; // ここにあなたのcompany_nameを入力
  var apiKey = 'your_api_key'; // ここにあなたのAPI_KEYを入力

  // プロパティを保存
  scriptProperties.setProperty('HRMOS_COMPANY_URL ', companyName);
  scriptProperties.setProperty('HRMOS_API_KEY', apiKey);

  Logger.log('Properties saved successfully.');
}
```

プロパティ登録は最初にしか使用しないので、新たに regist.gs というスクリプトを作成して、このコードをペーストします。そしてcompany_nameとyour_api_keyを適切に置き換えてから実行してみます。
結果、実行ログに`Properties saved successfully.` と表示されましたので、うまくプロパティに登録できたようです。
Apps Scriptの左側メニューの歯車マークの「プロジェクトの設定」に「スクリプト プロパティ」があり、実際にプロパティとして保存されているか確認できます。
# Tokenの発行
次に[API仕様書のAuthentication](https://ieyasu.co/docs/api.html#section/Authentication)を実行して、API連携に必要なTokenを取得します。
Basic認証云々という記述があり、なんか手順がありそうです。よくわからんのでググってみますと、[GASとHARMOSとSlackではじめる勤怠Bot](https://mikan-tech.hatenablog.jp/entry/gas_kintai_bot)[^1]という記事をみつけました。こちらのコードを参考にさせていただき、まずはコード.gsのほうにgetToken関数を記述します。
```javascript
function getToken() {
  const ps = PropertiesService.getScriptProperties()
  const apiKey = ps.getProperty('HRMOS_API_KEY')
  const endPoint = 'https://ieyasu.co/api/' + ps.getProperty('HRMOS_COMPANY_URL') + '/v1/authentication/token'
  const headerInfo = token => ({
    'Content-Type': 'application/json',
    'Authorization': 'Basic ' + token
  })
  const options = {
    method: 'get',
    headers: headerInfo(apiKey),
    "muteHttpExceptions": true,
  }
  const response = UrlFetchApp.fetch(endPoint, options)
  const json = JSON.parse(response.getContentText())
  return json.token
}
```
変数tokenにトークンが入るか確認するために、最後のJSONをパースして返すところ（16行目のreturn のところ）にブレークポイントを設定しデバッグ実行させます。するとHRMOS勤怠へのログイン認証が要求されましたので（初回のみ）、認証します。
デバッガで変数tokenの内容を確認していくと、ばっちりトークンが入っていました。トークンは24時間しか期限がないため、このgetToken関数はそれぞれの処理の冒頭で実行し、取得したトークンを使ってAPI連携をさせていくことになります。

ということで初回はここまで。

### 参考文献
[^1]:[GASとHARMOSとSlackではじめる勤怠Bot](https://mikan-tech.hatenablog.jp/entry/gas_kintai_bot)　mikan Developers' Blog