Power Automate DesktopでSAP系の操作を自動化してみた（SAPログオン編）[How to automate SAP logon with MS PAD]

こんにちは。

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

## 目次

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

## Power Automate Desktopとは？
マイクロソフト社が提供しているPower Platformに含まれるPower Automateのうち、 **有人型(Attended)RPA** と呼ばれる **デスクトップフロー** をユーザが作成・利用するためのアプリケーションがPower Automate Desktop（正式名称：Power Automate for Desktop）です。Windows10、11のユーザは無料で利用できます（11には標準でインストール済み）。

**デスクトップフロー** においては多くのことが実行可能ですが、特に、ユーザが使用するアプリケーション（Excel・メモ帳・エクスプローラやファイルの操作など）やWebブラウザにおける **操作の自動化** 、および変数の定義・条件分岐・反復処理・入出力処理が実行可能となっています。

細部の情報や操作方法については、下記サイトなどをご確認いただくとわかりやすいです。サンプルのフローも多く掲載されています。

https://cravelweb.com/rpa/power-automate-desktop/power-automate-desktop-explanation-entries-2021

### PADのダウンロードとインストール
下記の、「Install Power Automate Installer」のリンクからダウンロードをすることができます。

https://docs.microsoft.com/en-us/power-automate/desktop-flows/install

## SAP環境へのログオンを行うフローを作成

今回は、SAP環境へのログオンをMS PADで実行する際のフローを作成します。
作成するフローは、マイクロソフトのブログ記事を参考にしています。

https://docs.microsoft.com/ja-jp/power-automate/guidance/rpa-sap-playbook/creating-sap-desktop-flow-action-based-gui

:::note info
当記事ではMS PADのみでSAP環境へのログオンを行うフローを作成するため、上記サイトのフローの内容を一部変更しています。
:::

### フローの記述

今回のフローの完成形です。処理の流れは以下のとおりです。

1. ログオンに必要な情報を変数に持たせる
2. C:\Program Files (x86)\SAP\FrontEnd\SapGui\sapshcut.exeを実行する。その際に、上記の各値をコマンドライン引数として渡す
3. 応用編として、ログイン言語の設定を可能とする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/f15bc494-1274-b879-15ca-ca5b15376ddc.png)
PADではフローに設定する各処理のことを **「アクション」** と呼んでいます。アクションは画面左のアクションペインのツリーをたどっていくことや、文字列検索で探すことができます。

…ここまで見て、 **「sapshcut.exeのショートカット作ってパラメータ記述すればPADでの実行いらないですよね」** と思ったそこの方、ご静粛に願いますｗ

#### 変数の定義

画面左のアクションペインから **変数>変数の設定** アクションを使用して、ログオンに必要な以下の情報を変数（フロー変数）として定義します。変数名には大文字小文字の区別があります。また、変数は動的型付け（設定値から自動的に変数の型が決定される）となっています。昨今のABAPでは、動的型付けでの変数定義もできますよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/01c84bf2-059d-7858-3150-fcf1f8c68cf9.png)

※変数名は今回は下記のとおりとします（変数名は任意の名称に変更可能です）

| 変数内容 | 変数名 |
|:-:|:-:|
|システムID(SID)|SAPSystemId|
|クライアント|SAPClient|
|ユーザID|SAPUser|
|パスワード|SAPPassword|

今回、クライアント以外の項目は設定値を隠しています。変数を定義後、画面右側にあるフロー変数ペインにて「機密情報としてマーク」をすることで、フロー画面上には値が表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/3eda2d4c-c2c8-bb4b-d087-2b2c48007515.png)

#### sapshcut.exeの実行

sapshcut.exeは、SAPGUIに含まれているSAPGUI用のショートカットアプリケーションです。詳細な情報は下記リンク先の記事が参考になります。
※1件目の記事によるとGUI620からはSAPgui.exeが使用できるとのことですが、GUIバージョン750でもsapshcut.exeが使用できることが確認できましたので今回はsapshcut.exeを実行するフローの説明をしていきます。

https://github.com/senkousya/tutorialSAPGuiShortcuts

https://www.stechies.com/sapshortcut-program-parameters/

SAPアクションペインから、 **システム>アプリケーションの実行** を使用して以下のように記述します。コマンドライン変数には、事前に定義した各種値の情報を渡します。PADで変数を使用する際は、変数名を%で囲って記述することに注目してください。また、変数名は前述のとおりですがABAPと異なり、 **変数名の大文字小文字を区別します** ので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/c26518e6-85e1-134d-3cbe-f9d1e8f9bb7f.png)

**アプリケーションパス:** C:\Program Files (x86)\SAP\FrontEnd\SapGui\sapshcut.exe
**コマンドライン引数:** start -system=%SAPSystemId% -client=%SAPClient% -user=%SAPUser% -pw=%SAPPassword%
**ウィンドウ スタイル:** 正常
**アプリケーションの起動後:** アプリケーションの完了を待機します

#### フローの実行

フローが完成したら実行します。動作を確認しながら実行する場合はフローデザイナ（フローを作成・編集する画面）から実行し、不具合がなくなったら、フローコンソール（作成したフローの一覧が表示されている画面）から実行することをお勧めします。指定した環境にログオンできれば成功です。
※フロー処理が遅くなる場合があります（なんなら人間が実行した場合よりも遅い場合も）。これは実行するパソコンのスペックや通信状況が原因であることが多いです。別記事でも述べますが、SAPGUIの操作を自動化する際は、SAP環境の負荷状況によりフローが遅延する場合が多いようです。

**フローデザイナ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/e77448be-401b-85c6-6043-ac4cae3116f5.png)

**フローコンソール**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/1415eaac-df23-a1b1-867b-e26eed69bb30.png)

### 他言語ログオン対応

応用編として、ログオン時にログオン言語を選択する仕様を追加します。赤枠内が追加・変更分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/18616ecc-0a1a-2aab-b19d-3e25374c8a62.png)

* 使用する言語を変数に設定する（今回は日本語(JA)と英語(EN)を例とします）
* ログオン言語を入力する画面を表示し、ユーザに決定させる
* キャンセルボタンがクリックされたら処理を終了する
* sapshcut.exeのコマンドライン変数に言語の内容を追加する

#### 使用する言語を変数に設定する
MS PADにおける一次元配列の変数を「リスト（リスト型変数）」と呼んでいます。リストの定義方法は複数ありますが、今回は**変数>変数の設定**から以下のように定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/69946788-1555-7bd0-b1e3-7e84d97064ee.png)
**変数名：** LangList
**宛先：** %['JA','EN']%
この設定によりLangListというリストに「JA」「EN」が設定されます。最初に設定した内容が次で定義する画面に初期表示されます。選択肢を増やす場合はカンマで区切り、シングルクォーテーションで値を囲ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/a2c887a1-7fc2-0242-cb68-31b1a96dcdae.png)

リスト型変数については以下の記事が参考になります。

https://qiita.com/sys_zero/items/82951049466791b2b728

#### ログオン言語入力画面を表示し、ユーザに入力させる

上記で設定した言語をユーザに選択させる画面を作成します。**メッセージボックス>リストから選択ダイアログを表示**を実行して、以下のように値を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/659262f4-a06b-e617-7135-2f0e9d91200e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/be8a7245-2ba2-09c5-8a84-35d8eea377b6.png)
**ダイアログのタイトル** ：ポップアップウィンドウのタイトル（オプション）
**ダイアログメッセージ** ：ポップアップウィンドウ内の文章（オプション）
**選択先のリスト：** %LangList%   ※入力枠内の{x}をクリックして変数一覧から選択できます
**選択ダイアログを常に手前に表示する：** スイッチをオン（右側にする）
**リストに制限：** スイッチオン（右側にする）
**空の選択を許可：** スイッチオフ
**複数の選択を許可：** スイッチオフ

生成された変数のうち、一番上の変数にユーザ設定した言語の値が設定されます。この変数の名称を **SAPLang** と変更しました。2つ目以降は生成時のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/a7457e38-70a2-b7e4-e697-5e443ca8d0f9.png)

#### キャンセルボタンがクリックされたら処理を終了
**条件>if** および **else** アクションを使用して処理を分岐します（条件分岐の終了を示すEndは、Ifにセットされています）。ダイアログでクリックされたボタンの内容値は、アクションで生成された変数である **%ButtonPressed%** に格納されています。Ifの設定内容は以下の内容となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/9f57a4d5-a201-48c7-2714-4fb13b48fbe5.png)
**最初のオペランド:** %ButtonPressed%
**演算子：** 「と等しい(=)」※初期設定値
**2番目のオペランド：** Cancel ※先頭のみ大文字
フローの処理を終了するには、**フローコントロール>フローを停止する** アクションを使用します。

Else側には、sapshcut.exeを実行するアクションを設定します。
※アクションを移動するには、キーボードやマウスの右クリックでの **コピー&ペースト** および、マウスでの **ドラッグ&ドロップ** が使用できます。

#### sapshcut.exeのコマンドライン変数に言語の内容を追加
ダイアログで選択した言語の値は、アクションで生成された変数 **%SAPLang%** に設定されますので、この値をsapshcut.exeに渡します。コマンドライン変数に1バイトスペースを挿入後、**-language=%SAPLang%** を追加してください（記述位置の決まりはありません）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/eecef7b9-d9b3-1319-1205-ee798aad2a5b.png)

#### 動かしてみる

フローを実行すると、ログオン画面を設定するポップアップメッセージが表示されます。
リスト型変数に設定した順に設定されていることが確認できます。言語が設定できること、設定した言語でログオンできること、キャンセルボタンをクリックした際にログオン処理を行わずフローが終了することを確認できれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326392/11d3f989-414d-3eb6-3491-1f019fe88f73.png)

## まとめ

以下について説明いたしました。
* Power Automate Desktopの概要
* sapshcut.exeを使用したSAPログオン用フローの作成
* 上記にログオン言語を選択する処理の追加

概要設計書や詳細設計書を書くような感覚で、自動化フローが設定できることに気づいた方もいらっしゃったのではないでしょうか。次回はSAPGUIの画面処理の自動化を行う予定です。今回は以上となります、ありがとうございました。