Power Automate DesktopでSAP系の操作を自動化してみた（SAPGUI操作編 その１ 一定操作を繰り返す）[How to automate SAP logon with MS PAD]

こんにちは。

今回は、マイクロソフトから提供されているRPAツールである、Power Automate Desktop（正式名称はPower Automate for Desktop、略称としてPADと記載します）を使用してSAPGUIなどの操作を自動化・簡略化する記事の第2回目となります。今回はSAPGUIの処理を自動化することで、SAPのオートログアウトを防止するフローを作成したいと思います。

## 目次

1. [SAP環境へのログオン](https://qiita.com/Go_Ohta/items/ea5aec49394d274aa4ec) 
2. SAPGUI操作編 その１ 今回の内容
3. SAPGUI操作編 その２

## SAPGUIでPADフローを実行するための準備
SAPGUIでPADのフローの実行には、SAPGUIで自動化スクリプトを実行可能とするための以下２つの設定が必要となります。これらはSAPGUIに標準実装されているVBScriptによる処理のレコーディングや実行にも必要ですので、既に設定が完了している場合もあります。

#### 1.ユーザスクリプティングの許可

下記のサイトの「1.SAP スクリプトを有効にします。」の記載のとおり、トランザクション:RZ11の設定を行なってください。

https://docs.microsoft.com/ja-jp/power-automate/guidance/rpa-sap-playbook/prerequisites#sap-gui-scripting-configuration


#### 2.SAPGUIのオプションで、スクリプトを有効化する

SAPGUIのオプションを開き（セッションの**メニューバー＞（追加＞）SAPGUIの設定とアクション＞オプション**を選択し、「アクセシビリティ&スクリプト内のスクリプト＞スクリプト」にて、「スクリプト有効化」にチェックを入れます。そしてその下３つのチェックボックスのうち、上2つの通知系のチェックをオフにしてください。これらがオンの場合、フロー実行時に大量の通知が発生しフローが正常に動かなくなります。一番下の「ネイティブ・・・」は動作を確認していませんが、今回はオフの状態で処理を進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/0b9132af-6269-3014-2fa2-e3b4df164a26.png)


## 画面処理の自動化について

バッチインプットやVBScriptレコーディング、Excelマクロの記録などと大きく変わりはありませんので、これらの経験がある方は理解しやすいかと思います。

1. 操作するセッション（画面）を指定
2. 画面項目に値を入力する・値をラジオボタンやプルダウンメニューなどで選択する
3. 画面上のボタンをクリックする・キー操作を行う
4. 次の画面の操作が必要であれば、一番上から処理を同様に行う

※今回は2.の画面項目への値入力・選択は行いません

## SM37のジョブ一覧を更新するフローを作成する

今回は、SAPGUI操作の入門編として、SM37のジョブ一覧を更新する処理を繰り返すフローを作成します。
長時間の会議、昼休み、休憩などでちょっとSAGPUIを触っていなかっただけなのにオートログアウトして再ログインしたことは誰にもあるかと思います。このオートログアウトを阻止して業務効率を大きく改善するフローとなるはずです（言ったもん勝ち:laughing:）。

### フローの記述

フローの完成形です。

1. 変数定義とループ処理 300回以下の処理を繰り返す
1-1. トランザクションSM37（またはSMX）の画面にフォーカスを合わせる
1-2. ウィンドウを待機する
1-3. ウィンドウ内の「リフレッシュ」ボタンをクリックする
1-3. 3分（180秒）待機する
ループ処理を指定した回数だけ繰り返す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/1cb16d6f-fe85-fa98-06c7-37a7b3792a27.png)


#### 1.変数の定義とループ処理

まず、フォーカスを合わせたいトランザクションSM37（またはSMX）のタイトルである、「ジョブ概要」を変数に取得しておきます。次に、アクションメニュー>ループを見て、上から2番目の「LOOP」を選んでください。LOOPは、変数の値増加（減少）・増分を利用した繰り返し処理で、ABAPで言うと「DO n TIMES」または「FOR」に該当するアクションです（ややこしいのですが、ABAPにおける、内部テーブルを1件づつ読み込むLOOPやDBのデータを読むSELECT～ENDSELECTに該当するのは、For Eachとなります）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/4bb4f8c6-fde7-8ef7-895f-53e20166fe30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/5c7d0bbe-5630-0b17-b2ae-c972fe3d6ee9.png)

開始値：1
終了:300  ※3分づつ実行とすると3分*300=900分=15時間です
増分:1

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/loops#loop

LOOPのアクション定義を行うと値が増分される変数、LoopIndexが自動的に生成されますが、このフローでは使用しません。そのような場合はアクションの定義画面にて「生成された変数」の左にあるスイッチをオフにして生成しないようにもできます。不要な変数を減らすことでフローやアクションを見やすくできますので、適時活用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/aa089153-0251-d086-f277-097c34f197a1.png)

以降のアクションは、このLOOPと自動生成されたENDの間に記述していきます。

#### 1.1 トランザクションSM37（またはSMX）の画面にフォーカスを合わせる

PADでは、「UIオートメーション>ウィンドウにフォーカスする」というアクションで、画面をアクティブ化してフォアグラウンドに表示します。

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/uiautomation#focuswindowbase

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/60385e35-0c51-3c77-c037-eae6650388d4.png)
アクションを実行すると、以下のようなアクション定義画面が表示されますので、ウィンドウの検索モードを一番下の「タイトルやクラスごと」に設定したのち、「ウィンドウの選択」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/0c57c3b6-b389-2d82-43eb-702cce96a50e.png)
すると、追跡セッションというポップアップが表示され、下記の方法でUI要素を追加するように指示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/de23d723-65d7-031c-6331-e382cf6edcf4.png)
ジョブ概要のセッション（ウィンドウ）にマウスを移動させ、セッションの外側に赤いフレームを表示させます。赤いフレームの左上に、フレーム内のオブジェクトの分類（ウィンドウ・ボタン・項目など）を示すタグがありますので、ウィンドウを表している文字列（「ウィンドウ」「Window」と表記が変わる場合があります）であることを確認したのち、Ctrl+左クリックで対象を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/58d3f21c-cdf7-909a-0864-009b1275f29e.png)
アクションの設定画面に内容が自動的に設定されますので、保存をクリックしてアクションの定義を完了させます。今回の処理ではウィンドウ クラスの設定は必ずしも必要ではありませんが、フロー実行時にSAPGUIのセッション以外にも「ジョブ概要」というタイトルのものがあった場合でも、ウィンドウ クラスの指定があればフローはSAPGUIのセッションを選択するように挙動します。今回はこのまま残しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/4734272b-44f9-efb2-1f19-8b48eb799c90.png)

#### 1-2. ウィンドウを待機する

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/uiautomation#waitforwindowaction

次に、ウィンドウが本当にフォーカスされたかを確認するアクションを設定しておきます（このアクション自体はなくてもフローは動作します）。処理対象セッションのタイトル内容を定義した変数を事前に要しておいたので、今回はこれを使用してウィンドウ タイトルの設定値として定義します。前回と同様に、「ウィンドウの選択」からウィンドウを選択することもできます。設定内容を以下に記載します。

**ウィンドウの検索：** タイトルやクラスごと
**ウィンドウ タイトル:** %titleText% ※事前に定義したタイトル名を格納した変数を指定します
**ウィンドウが次の状態になるまで待機：** フォーカスされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/41aac30e-f537-ce9b-9714-4be22d5906c1.png)
ここまで見て気づいた方もいらっしゃるかもしれませんが、先ほどの「ウィンドウにフォーカスする」も、ウィンドウタイトルに変数を指定することでウィンドウにフォーカスすることができます。

#### 1-3. ウィンドウ内の「リフレッシュ」ボタンをクリックする

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/uiautomation#pressbutton

1-1.で説明した画面のフォーカスと同様にUI要素の追加を行い、ジョブ概要の画面内にあるリフレッシュボタン（※GUIのバージョンやログイン言語などでボタンの名称や表記が変更されます）を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/1ffc8844-653c-2e55-5a17-19cea7d0a92e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/33930286-2d87-e77b-0515-e27a493f5b37.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/1d4ff7ac-178f-8478-df29-883f440b2e5f.png)

#### 1-4. 3分（180秒）待機する

https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/actions-reference/flowcontrol#wait

フローコントロール>Waitのアクションを選択し、待機させる時間を秒単位で指定します。SAPGUIがオートログアウトしない、かつパソコンが自動的にロックされない短い時間を指定する必要があります。あまり短い時間（数十秒）単位で指定すると、フローを止める場合も対応が煩雑になるので3-5分程度が良いかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/06f266d1-be40-cb10-f979-b315e79df286.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/6fe9ea4c-0be6-ab7b-5094-5b6fd79686e5.png)

### ループ処理のEND

ここまで行くと、LOOP処理のENDにたどりつきます。指定した回数を満たさないうちはループ処理が繰り返され、再度1-1.から実行します。

なお、動作中のフローの処理を止めたい場合は、一時停止または停止のボタンをクリックします。再生ボタンのあったところに停止ボタンが表示されます。

**フローコンソール**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/16ab9a87-929f-9af1-92d0-463b14574e5e.png)

**フローデザイナ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/49e07b58-cfb8-5d8f-d57c-8f4fa5b7943e.png)

### 動かしてみる

さて、実行してみましょう。ジョブ一覧画面がアクティブになり、リフレッシュボタンがクリックされる処理が繰り返されるかと思います…さっそくエラーになった方、このフローには自動でジョブ一覧画面を開く機能はまだ実装されていませんので、フロー実行前にご自身でトランザクションSM37もしくはSMXでジョブ一覧画面を開いておく必要があります。事前に説明がなくてすみません！:bow:

## まとめ

以下について説明しました。
* ジョブ概要画面のリフレッシュボタンを押下する処理を繰り返すフローの作成
* 必要なアクション（LOOP・ウィンドウのフォーカス/待機・ボタンを押す・Wait）

今回は以上となります、皆様の毎日の **「SAPGUIライフ」** がより良いものになりましたら幸いです:sunglasses:
次回はより実践的な内容に触れていきます、ありがとうございました。