Power Automate Desktop開発 Tips

# 概要
Power Automate Desktop開発で詰まりやすい事象の解決に役立つTipsを記してあります。

# 変数
- 変数名はパーセント記号(%)で囲む必要がありますが、算術演算子(＋,－,×,÷)・比較演算子(=,<>,>,<)・論理演算子(Index,StartsWith,EndsWith)等を使用した数式内で変数を使用する場合は%で囲む必要はありません<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/e5ccec5a-2eb2-0acc-0a2f-a70448793453.png">
<br>

- Power Automate Desktopでは変数をnullに設定することはできないので、値に```%''%```を設定することでエラーを回避します
[Power Automate Desktopで変数を空にする方法【初期化】](https://prtn-life.com/blog/pad-val-null)
[Power Automate Desktop 入出力変数でnullを利用する方法 | Qiita](https://qiita.com/baku2san/items/73ff9ccebd4d35a20eb2)
<br>

- Power Automate Desktopでは、アクションによって変数が自動生成されます
例えば、［Excelワークシートから最初の空の列や行を取得］アクションでは、FirstFreeColumnとFirstFreeRowという2つの変数が自動生成されます。<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/d767d381-cd52-cd1e-0e30-0d4a1e10de18.png">
<br>しかし、FreeFirstRow変数はフロー上で使用しません。そのような場合、使用しない変数をオフにすることでフローデザイナーのフロー変数から非表示にすることができます。<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/ca6a7ad3-5d6b-29aa-eb0f-a255b55d1df1.png">

# UIオートメーション
### ウィンドウ
- Power Automate Desktopに限らず、**RPAで自動化を組み込む場合、ウィンドウサイズを最大化に設定することを推奨します。**
理由として、画面上のボタンやテキストボックス等はウィンドウサイズや表示倍率の変更にともない、表示位置が変わる可能性があるからです。レコーディング時に指定した検索範囲内に検索対象のUI要素が存在しなくなると、RPAが認識できなくなりエラーとなってしまいます。

  - デスクトップアプリの場合、［ウィンドウの状態の設定］で設定する<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/cbe2f1cc-d5b7-6510-8b77-6723bf59acbf.png">

  - ブラウザの場合、各ブラウザ起動のアクションで設定する<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/60861ea4-755e-951e-3b2c-b581c5ab4070.png">

### データ抽出
- 以下エラー「**○○に失敗しました(ウィンドウを取得できません)**」の対処方法 
ウィンドウを取得するためのセレクターに問題がある、ということになるので、ウィンドウのUI要素を修正します。
※Webページの場合、ブラウザインスタンスで操作対象のブラウザ(タブやウィンドウ)を判断するので気にしなくてOK。
<br>

- 以下エラー「**○○に失敗しました(UI要素を取得できません)**」の対処方法
カスタムセレクターのClassもしくはIdにランダム値が入っている場合はチェックを外す。
また、特定の要素を取得できない場合は、eq演算子を使用して取得する要素を指定します。詳細は[こちらの記事](https://start-rpa.hatenablog.com/entry/2021/11/23/003000)を参考にしてください。
他の参考記事：[Power Automate Desktop (UI要素エラー)：UI要素が見つかりません](https://qiita.com/fsdg-yook/items/761c648e144b7083a941)

# HTTP
- ［Webサービスを呼び出します］アクションでは、外部APIと連携して多種多様な業務プロセスを自動化して効率化できます。外部APIを利用することで、複雑なロジックを自前で組む必要がなくなり、開発プロセスが大幅に簡略化されます。これにより、時間や労力、コストを節約しつつ、高機能で信頼性の高いシステムを構築できます。ただし、利用規約・HTTPS/CORS対応・APIの正確性などを精査した上で使用しましょう<br>
例：現在の日付が祝日であるかを判定するフロー<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/90f55e2a-2f4d-fc4a-2013-2ca352b21e51.png">

1. クエリに現在の日付を渡してAPIを叩いて、JSON形式でレスポンスを取得する
APIドキュメント：https://national-holidays.jp/api.html<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/ac332553-1abd-3019-4582-7ecb31b6a2d9.png">

1. JSONをカスタムオブジェクトに変換し、国民の祝日であるかどうかを判定する<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/d2acc647-5277-ef7e-7684-d278ac2e9726.png">

# ブラウザー自動化
- ［WebページでJavaScript関数を実行］アクションでは、標準的なアクション操作では対応しきれない場合に、ページの動作や内容を柔軟に制御するために非常に有用です。このアクションを利用することで、動的なページや複雑なWebアプリケーションに対しても、自動化スクリプトを効果的に実装できます。<br>
例：休日・祝日を考慮した翌営業日を取得するフロー<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/5b9c4c2d-d10d-c6d0-23ea-850589984d9f.png">

1. ［Webサービスを呼び出します］で今年と来年の祝日リストを取得する
APIドキュメント：https://national-holidays.jp/api.html<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/bd55a758-47a0-a6d0-6626-96b5c11ca7e0.png">

2. ブラウザを起動する ※ブラウザはChrome以外のIE,Edgeでも可能
3. ［WebページでJavaScript関数を実行］で祝日リストを元に翌営業日を計算する<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/e899594d-abb0-9e4d-0fa6-6b133da74798.png">

4. ブラウザを閉じる


``` js:JSのサンプルコード
function ExecuteScript() {

const holidays = %WebServiceResponse%
const datesOnly = holidays.map(holiday => holiday.date);

// 祝日かどうかを確認する関数
function isHoliday(date) {
  const formattedDate = date.toISOString().split('T')[0];
  return datesOnly.includes(formattedDate);
}

// 翌営業日を取得する関数
function getNextBusinessDay(date) {
  let nextDay = new Date(date);
  nextDay.setDate(nextDay.getDate() + 1); // 翌日へ

  // 翌日が土日または祝日である限りループ
  while (nextDay.getDay() === 0 || nextDay.getDay() === 6 || isHoliday(nextDay)) {
    nextDay.setDate(nextDay.getDate() + 1);
  }

  return nextDay;
}

// new Date()の引数に現在の日付を渡す
const inputDate = new Date('%FormattedDateTime%');
const nextBusinessDay = getNextBusinessDay(inputDate);

// 翌営業日を返す
return nextBusinessDay.toISOString().split('T')[0];

}

```

［WebページでJavaScript関数を実行］アクションにおける返り値が [Object Object] になる場合は、```JSON.stringify()```もしくは```toString()```を使用して文字列に変換する。

# マウスとキーボード
- マウス操作の自動化はウィンドウサイズ等や表示倍率にともなって、表示位置が変わりクリック位置もずれてしまうことでエラーが起こりやすいです。そのため、**マウス操作ではなく、［キーの送信］アクションを使用して、キーボード操作やショートカットキー操作での自動化を推奨します。**<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/caafc9be-5c96-9624-540b-20e96706c987.png">

# 参考記事
- [Power Automate Desktop ナレッジ記事一覧 | Hatena Blog](https://start-rpa.hatenablog.com/archive/category/Power%20Automate%20for%20Desktop)
- [Power Automate Desktop 有償版と無償版 | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/premium-features#premium-feature-list)
- [Power Automate Desktop カスタムセレクターを作成する | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/build-custom-selectors)
- [Microsoft Power Automate Desktop Community](https://powerusers.microsoft.com/t5/Power-Automate-Desktop/bd-p/MPADesktop)