Power Automate Desktopで自動化★デジタルの力で大転職時代を乗り切ろう②

　こんばんは！小売業で採用担当をしているミハタです
改めて、採用担当の仕事を説明します。
一般的には次の3つのフェーズに分けられます。

　1\. 採用ターゲットに対し「うちで働きませんか？」とアプローチするフェーズ
　2\. 面接や合否通知を実施するフェーズ
　3\. 内定出し後に自社へ入社したい意欲を高めるフェーズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/66b457bd-5cd6-6ff4-198d-493f98d5229c.png)
 
　前回はフェーズ1について、採用ターゲットの一人一人に合わせてアプローチすることをテーマに、「GASを使ってスカウトメールを送る」という記事を書きました。
今回の記事は、前回の続きからスタートです。
フェーズ2の「面接や合否通知を実施するフェーズ」をよりスムーズに進めるために**Power Automate Desktop**を活用していきます！
まだ前回の記事を読んだことがない方は、ぜひご参照ください↓

https://qiita.com/mihatachisa/items/b959eae35e157999c4a9

# 概要
　今回は、採用管理システムから**Power Automate Desktop**を使って、応募者の適性検査の結果や履歴書を**自動でダウンロード**する方法を紹介します。
**Power Automate Desktop**というのはワークフローを自動化してくれるツールのことです。
この記事を読んでいただければ、採用管理システムに限らずさまざまなサイトから自動ダウンロードする方法がわかります！

:::note info
採用管理システムとは、応募者が現在どの段階の採用プロセスにいるか把握し、履歴書などの書類を管理するツールの総称です。Applicant Tracking Systemのことで、ATSと略されます。
例えば「リクナビHRTech」「タレントパレット」「SonarATS」などがあり、今回わたしはSonarATSを使用しています
:::

 フローを作成して実行してみた動画がこちら↓

 
https://x.com/ccchisssa/status/1835012188337324123

 
:::note info
個人情報が含まれるため網掛け部分を多くしています。ご容赦ください
詳細は各フロー構築の手順をご確認ください
全体のフローのソースコードは最下部をご確認ください
:::

### ざっくりとした手順 
　大きく分けると、次の3つの構成でフローを考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/10439f31-2af7-03bf-6451-9bb679445646.png)




### フロー構築
　合計 20アクションです。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/b15545ea-0958-3fc2-265e-fe2af841eb9d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/9cbdfeec-a97a-5a7e-0d44-a6f58d71697d.png)


### Power Automate Desktopのインストール
　フローを作成するためにはPower Automate Desktopをインストールする必要があります。
公式サイトから無料でダウンロードできますのでインストールが済んでいない方は、[こちら](https://www.microsoft.com/ja-jp/power-platform/products/power-automate/)からインストールしてください。

# 1.採用試験システムへのログイン
　まず、Power Automate Desktopでブラウザを自動操作し、「SonarATS」のログインページにアクセスします。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/54cd5b73-66b2-751c-9f43-34010dc70a80.png)

 
以下のようにフローを構築します。
### ステップ 1-1: ウェブページを開く
ここで、「Webページへ移動」アクションを使い、ログインURLを指定します。

<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# Microsoft Edgeを起動し、Sonarのログインページを開く
WebAutomation.LaunchEdge.LaunchEdge 
    Url: 'https://example.com'        # URLを指定
    WindowState: Normal               # ウィンドウ状態の設定
    ClearCache: False                 # キャッシュをクリアしない
    ClearCookies: False               # クッキーをクリアしない
    WaitForPageToLoadTimeout: 60      # ページの読み込み待ち時間
    Timeout: 60                       # タイムアウト時間
    BrowserInstance => Browser         # ブラウザのインスタンスを指定
</code></pre>
</details>

### ステップ 1-2: ユーザーIDとパスワードの入力
「テキストを入力」アクションを使って、UserIDとパスワードを自動入力します。
　この時アクションは「Webページ上の要素の詳細を取得」を選択するとIDとパスワードが入力されずエラーとなってしまいます。
「Webページ内のテキストフィールドに入力する」を選択しましょう。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/3aec4aff-e098-7a9b-4781-96face0341a2.png)

<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# ユーザーIDを入力
WebAutomation.PopulateTextField.PopulateTextFieldUsePhysicalKeyboard
    BrowserInstance: Browser                                  # 使用するブラウザのインスタンス
    Control: appmask['Web Page \'https://\'']['Input text \'tbx_UserId\'']  # ユーザーIDを入力するフィールドを指定
    Text: 'IDのメールアドレス'                               # 入力するユーザーID（メールアドレス）
    Mode: WebAutomation.PopulateTextMode.Replace              # 入力モードを置換に設定
    UnfocusAfterPopulate: True                                # 入力後、フォーカスを外す
    WaitForPageToLoadTimeout: 60                              # ページ読み込み待ち時間（秒）
# パスワードを入力
WebAutomation.PopulateTextField.PopulateTextFieldUsePhysicalKeyboard
    BrowserInstance: Browser                                  # 使用するブラウザのインスタンス
    Control: appmask['Web Page \'https://\'']['Input password \'tbx_Password\'']  # パスワードを入力するフィールドを指定
    Text: P'******'                                           # パスワードは暗号化されているため、手動で入力
    Mode: WebAutomation.PopulateTextMode.Replace              # 入力モードを置換に設定
    UnfocusAfterPopulate: True                                # 入力後、フォーカスを外す
    WaitForPageToLoadTimeout: 60                              # ページ読み込み待ち時間（秒）
</code></pre>
</details>

### ステップ 1-3: ログインボタンをクリック
「UI要素をクリック」アクションで、ログインボタンをクリックします。

:::note warn
同じアクションを選択しているにもかかわらずエラーとなる場合はUI要素を誤って選択している場合があります。
「input …」という赤枠がでるように、再度UI要素を選択するようにしましょう。
:::

<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# ログインボタンを押す
WebAutomation.PressButton.PressButton
    BrowserInstance: Browser                                  # 使用するブラウザのインスタンス
    Control: appmask['Web Page \'https://\'']['Input image \'btn_Login\' 2']  # ログインボタンを指定
    WaitForPageToLoadTimeout: 60                              # ページ読み込み待ち時間（秒）
</code></pre>
</details>

# 2.応募者情報の取得
次に、応募者情報を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/2690a1e5-8883-201d-8afc-55b54caff14e.png)


### ステップ 2-1: 待機
ログイン後、ページ移動がうまくいかず「クリックに失敗しました」というエラーが表示されてしまいました。
記事とChat GPTから「待機」アクションを入れるといいと聞き早速入れてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/7faff321-f7c1-f3a8-872d-683f78df8cce.png)


<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# ページ移動のために待機
WAIT 3  # 3秒間待機
</code></pre>
</details>


### ステップ 2-2: 応募者一覧ページを開く
「UI要素をクリック」アクションを使用して、新規応募者の一覧ページを開きます。

<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# 新規応募者の一覧ページを開く
UIAutomation.Click.Click
    Element: appmask['Window \'sonar ATS - 職場 - Microsoft​ Edge\'']['MenuItem:']  # 一覧ページを開くためのメニューアイテムを指定
    ClickType: UIAutomation.ClickType.LeftClick               # 左クリックを指定
    MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter  # 要素の中央をクリック
    OffsetX: 0                                                 # X方向のオフセット
    OffsetY: 0                                                 # Y方向のオフセット
# 一覧ページの「評価入力」ボタンをクリック
UIAutomation.Click.Click
    Element: appmask['Window \'sonar ATS - 職場 - Microsoft​ Edge\'']['MenuItem: 評価入力 2']  # 評価入力ボタンを指定
    ClickType: UIAutomation.ClickType.LeftClick               # 左クリックを指定
    MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleCenter  # 要素の中央をクリック
    OffsetX: 0                                                 # X方向のオフセット
    OffsetY: 0
</code></pre>
</details>

### ステップ 2-3: ページ移動待機
またまた「待機」アクションを使い、ページが完全にロードされるまで少し待ちます。

<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# ページ移動のために待機
WAIT 3  # 3秒間待機
</code></pre>
</details>

# 3.適性検査結果と履歴書をダウンロード
### ステップ 3-1: 個々の応募者ページを開く   
 「UI要素をクリック」アクションを使い、一覧ページ最上位の新規応募者の個人ページを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/bb41a847-b18d-f45d-98d6-24d96d6ccb7e.png)


<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# 応募者のページを画像認識でクリック
MouseAndKeyboard.MoveMouseToImage.MoveMouseToImage
    Images: [imgrepo['Image']]                                # 画像認識でクリックするための画像を指定
    SearchForImageOn: MouseAndKeyboard.SearchTarget.EntireScreen  # 画面全体で画像を検索
    MousePositionOnImage: MouseAndKeyboard.PositionOnImage.MiddleCenter  # 画像の中央を指定
    OffsetX: 0                                                 # X方向のオフセット
    OffsetY: 0                                                 # Y方向のオフセット
    Tolerance: 10                                              # 画像認識の許容誤差
    MovementStyle: MouseAndKeyboard.MovementStyle.Instant       # 即時にマウス移動
    Occurence: 1                                               # 検出する画像の回数
    Timeout: 5                                                 # タイムアウト時間（秒）
    SearchAlgorithm: MouseAndKeyboard.ImageFinderAlgorithm.Legacy  # 画像検索アルゴリズム
    X=> X                                                       # X座標を指定
    Y=> Y                                                       # Y座標を指定
</details>

### ステップ 3-2: 適性検査結果と履歴書をダウンロードと保存
　個人ページ内にある適性検査結果と履歴書のリンクを見つけ、ダウンロードボタンをクリックしてPC内に保存します。
「Webからダウンロード」アクションを選んでしまい、うまくできずあきらめかけたところ「**レコーダー**」機能の使い方の記事を発見し、「レコーダー」を使って13～20のアクションを自動作成することができました！
レコーダー、**恐ろしいほど便利…！！**
　レコーダーの詳細な使い方はこちら↓

https://qiita.com/45shingo/items/9e795432caf207ac738a

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/b04ca05e-7f61-efb1-57e4-f58ee997e1a2.png)


<details><summary>ソースコードが気になる方はこちら</summary>
<pre><code>
# PDFファイルを右クリックしてリンクを保存する
WebAutomation.Click.Click
    BrowserInstance: Browser                                          # 使用するブラウザのインスタンス
    Control: appmask['Web Page \'h ... valuation#\'']['Span \…　.pdf\'']  # PDFファイルを指定
    ClickType: WebAutomation.ClickType.RightClick                     # 右クリックを指定
    MouseClick: True                                                  # マウスクリックを有効にする

# メニューから「名前を付けてリンクを保存」を選択
UIAutomation.SelectMenuOption
    Control: appmask['Window \'評価結果の集計 - 職場 - Microsoft​ Edge\'']['MenuItem: 名前を付けてリンクを保存(K)']  # メニューアイテムを指定

# 「ドキュメント (ピン留め)」を選択
UIAutomation.Click.Click
    Element: appmask['Window \'評価結果の集計 - 職場 - Microsoft​ Edge\'']['Tree Item \'ドキュメント (ピン留め)\'']  # 「ドキュメント (ピン留め)」アイテムを指定
    ClickType: UIAutomation.ClickType.LeftClick                       # 左クリックを指定

# ファイル名を指定するために「名前」フィールドをクリック
UIAutomation.Click.Click
    Element: appmask['Window \'評価結果の集計 - 職場 - Microsoft​ Edge\'']['Edit \'名前\'']  # 「名前」フィールドを指定
    ClickType: UIAutomation.ClickType.LeftClick                       # 左クリックを指定
    OffsetX: 40                                                        # X方向のオフセット
    OffsetY: 0                                                         # Y方向のオフセット
    MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleLeft  # 要素の左側中央をクリック

# 「名前」フィールド内のテキストを選択するためにダブルクリック
UIAutomation.Click.Click
    Element: appmask['Window \'評価結果の集計 - 職場 - Microsoft​ Edge\'']['Edit \'名前\'']  # 「名前」フィールドを指定
    ClickType: UIAutomation.ClickType.DoubleClick                      # ダブルクリックを指定
    OffsetX: -71                                                       # X方向のオフセット
    OffsetY: -4                                                        # Y方向のオフセット
    MousePositionRelativeToElement: UIAutomation.RectangleEdgePoint.MiddleRight  # 要素の右側中央をクリック

# 「保存(S)」ボタンをクリックしてファイルを保存
UIAutomation.PressButton
    Button: appmask['Window \'評価結果の集計 - 職場 - Microsoft​ Edge\'']['Button \'保存(S)\'']  # 「保存(S)」ボタンを指定

# 保存処理が完了するまで待機
WAIT 10  # 10秒間待機

# ブラウザを閉じる
WebAutomation.CloseWebBrowser
    BrowserInstance: Browser                                          # 使用するブラウザのインスタンス
</details>




# 職場の方々からのフィードバック
　採用担当の先輩に説明して、使用した感想をいただきました。
先輩は50代の女性の方で、デジタルツールには詳しくありません。
メールを打つ手がとても速く、また行動も早く、いつも仕事でわからないことを教えていただいたりプライベートな悩みも相談させていただいたり、とても頼れる存在です。

<!-- open属性なし -->
 <details><summary>実際の会話内容のため、読み飛ばしても影響はありません</summary>
  私：
  　**Power Automate　Desktop**を使ってSonarにログインして書類を自動でダウンロードした後、面接官にダウンロードした履歴書を自動送信する仕組みを考えたんです！
  
  先輩：
  　 **Power Automate　Desktop**ってどんなもの？どうやって自動で操作するの？
   各自のパソコンにインストールしないと使えないの？履歴書はどうやって面接官に閲覧するの？
　私：説明させてほしいので、このフローを見て下さい（上記説明をする）
</details>

　説明後、「ポジティブな意見」を言った後に「ネガティブな意見」を言ってくれますか？と聞いてみました。

#### ポジティブな意見
* 「ログインしてダウンロードする」という工程を自動化するのはいいアイデアと思う
* うまく活用できれば時短になって、みんなの作業効率が上がるので取り入れたいと思う
* セキュリティ面で、どのサイトまでPADで自動化しても問題ないか都度確認しながら進めること
  
#### ネガティブな意見
* 動作に時間がかかるなら、実際に自分でログインしてダウンロードする方が早そう
* PADの実行ボタンを押さないと自動ダウンロードされないのが使えないのはもったない

#### フィードバックを受けて学んだこと、浮かんだ改善策
*　　PADなど知らないツールについて説明することは難しく、反対に自分がどれくらい理解度かがよくわかる。
*　　動作に時間がかかることもあるが、採用担当が不在でもメールを自動で送ることができると考えればかなり時短になる
*  「採用試験システムからのメールを受けとる」などのトリガーを設定することで今後解消してより実用性を高めたい
* 途中から部長・上司も加わり、デジタルツールを積極的に使用すれば定型的な作業を効率化できること、判断にかける時間を確保できてより多くの応募者の方と面接ができることなど提案でき、有意義な時間となりました。

# まとめ
  今回の記事では、Power Automate Desktopを使用してATSから応募者の適性検査結果と履歴書を自動でダウンロードする方法を紹介しました。
このフローを活用すれば、採用担当が手動で行っていたダウンロード作業を大幅に効率化できます。
　また弊社はシフト制のため、採用担当者が平日にお休みを取っている場合も多く、お休み明けに届いていた履歴書を面接官に送信する…ということが多かったです。そうすると、応募者にエントリーしてから面接の連絡をするまでお待たせしてしまうことがネックでした。
　今回は記載しませんでしたが、適性検査と履歴書をメールに添付して送信するフローも自動化すれば、採用担当が数日不在にしていても、滞ることなくスムーズに面接試験に案内することができますね！
今後取り組む課題がまた生まれました！道のりは長く大変ですが自動で動くのが楽しくて夢中になっちゃいます★

次回もお付き合いお願いします　お疲れ様でした♪

### 今回参照した記事はこちら

https://qiita.com/45shingo/items/9e795432caf207ac738a


https://qiita.com/tnsato4000/items/ccb788e003092b783936


https://www.teijitaisya.com/pad-download-file-ie/