SmartHRの電子申請をGASで最適化した話

# 課題と関連技術

SmartHRの電子申請にかかる添付ファイルのダウンロード・解凍・Google Driveへのアップロード、申請ステータスの変更を自動化する。

* Google Drive
* Google Spreadsheet
* Google Apps Script
* Parser
* imaya/zlib.js
* polygonplanet/encoding.js

# 課題の詳細

クラウド人事労務ソフトの[SmartHR](https://smarthr.jp/)では電子申請が行えます。
SmartHRからの電子申請には電子証明書を取得して電子申請を行えるようにする必要があります。

電子申請された手続は、SmartHR上で進捗管理ができ、完了した手続に関しては
SmartHRの画面上から公文書のリンク経由でファイルを直接ダウンロードすることができます。

この機能について申請一つ一つを見ればとても便利なのですが、1ヶ月の間に大量の申請を行うような入退社が多い大企業や、複数の企業を取り扱う社労士、経営管理コンサルタントにとっては不便な点もあります。

公文書の添付ファイルはe-Govで手続を行った時と同様に圧縮されたzipファイルで、SmartHR上から検索することはできません。
従って、そのファイルに後日アクセスすることを考えると、SmartHR外にファイルを保存しておく必要があります。

外部にファイルを保存する場合、手続きごとに画面を切り替えてファイルをダウンロードし、そのファイルを別途社内で用意したストレージに格納することが必要です。この処理を実際に手順単位で書き下ろすと以下の通りです。

【業務手順】
1. 顧客毎に用意されたSmartHRの専用URLからログイン
2. 申請の一覧を参照し、特定のステータスのデータを検索
3. 公文書やお知らせといった添付ファイル(zip)をダウンロード
4. ダウンロード・解凍したファイルをGoogle Drive上にアップロードして更にリネーム
5. 申請データをアーカイブ
6. スプレッドシートのステータスを変更

とある社労士事務所様では、この作業に**50時間/月もの時間を要している**と伺いました。
これを自動化してしまえば相当な作業効率化につながります。

従って、**上記業務手順をGASで自動化しよう**というのが今回の課題です。

# 成果物

今回の最適化についての成果物は以下の通りです。

## ソースコード

ソースコードの全容は以下のリポジトリをご参照ください。

[shikumiya/gas_smarthr_automation](https://github.com/shikumiya/gas_smarthr_automation.git)

Parserはライブラリとしてプロジェクトから参照してください。

* [Parser](https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html)
https://script.google.com/a/shikumiya.co.jp/d/1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw/edit?usp=drive_web

以下はライブラリ化して公開しましたので、こちらもプロジェクトから参照してください。

Script ID:
13KJxU8q0ZYmZXyQswU2HrkQX-yXlgnlJ3BVzsKrS69oaE4FcViPRFPZb
バージョン：42

* imaya/zlib.js
* polygonplanet/encoding.js

## スプレッドシート

スプレッドシートは以下の構成としています。

```
SmartHRダウンロードリスト(Spreadsheet)
　- URL(Sheet)
　- ID(Sheet)
```
### URLシートの構成

| A列 | B列 | C列 | D列 |
|:--|:--|:--|:--|
| 会社名 | SmartHR申請画面URL | アップロード先フォルダ | 処理ステータス |
| shikumiya | https://xxx.smarthr.jp/e_gov/requests | https://drive.google.com/drive/folders/xxxxxxxxxxxxx | 済 |

### IDシートの構成

本ソースコード上は1つのログイン情報を使い回す想定で組んでいますが、構成は適宜変えてください。

| A列 | B列 |
|:--|:--|
|   |   |
| ID | SmartHRのログインID |
| PASSWORD | SmartHRのパスワード |

# 発生した問題について(Tips)

この課題を解くため、日次でGASを実行し、自動で一連の処理を行うという設計で実装をはじめました。
SmartHRの認証は無事に通りました。申請の一覧も取得でき、zipファイルもダウンロードできました。

しかし、ここである問題に直面したのです。

GASにはzipファイルを解凍するのに、Utilities.unzip()というAPIが用意されています。
このunzip()を使ってzipファイルを解凍する際に、エラーが発生しました。

SmartHRで扱われる電子申請のファイルでは文字コードがCP437になるようで、
これにunzip()が対応できていない、というのが原因でした。

※この問題への解決策については、GASのTipsとして検索性を高めるため別記事にしました。

[[GAS]Utilities.unzip()で発生するエラーの原因と解決策](https://qiita.com/shikumiya_hata/items/8358cbb28312331cd9be)

# おわりに
手運用に時間や人手を取られ、本来時間を取るべき業務に時間を避けない、ということは非常に勿体ないことだと考えています。
また、GASで業務を自動化する際には、今回の問題のような壁にぶつかることも多々あります。

株式会社シクミヤでは、こうした課題の解決にこれからも取り組んで参ります。
最後までお付き合いいただき、ありがとうございました。

# 補足

## GASを選んだ理由

**「Pythonを使えば良いのでは」「FaaSだったら簡単だよ！」**

というご意見はもっともだと思いますし、大量の処理件数（数百件のクライアントで数千人の入退社があるなど）であれば、Python+IaaS、FaaSなどの組み合わせを検討した方が良いと考えています。

今回は、**できるだけひとつの技術要素で完結し、クライアントの運用ハードルを下げる手段はないか**、という観点で問題の解決方法を模索した結果、下記の理由も踏まえてGASを選定しました。

・もし同じように自動化した人たちが今後メンテする際でも「GASを組める技術水準さえあればメンテができる」
・定期実行の自動処理を組みたかった（トリガーで可能）
・ランニングコストを極力抑えたかった

後は、unzip()への解決策が調べてもヒットしなかったので、同じような問題に困っている人へのTipsとしてチャレンジしてみたかった、というのはあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/94fd031b-0c09-4f37-116f-c05271fdd7f9.png" width="200">
弊社は業務効率化・自動化など、仕組みで解決するお手伝いをさせていただいております。
お仕事のご依頼はコチラ↓までお願いいたします。

[株式会社シクミヤ](https://shikumiya.co.jp/)
note: [Visionary Base編集部](https://note.com/visionarybase)
Twitter: @shikumiya_hata