Power Automate Desktop 入力制限を考える

#概要
　Power Automate Desktop（以下PAD）の入力値に制限をつける方法について考えてみます。
![ezgif.com-gif-maker (13).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/646e474d-91f5-016a-ef7d-255d3867b534.gif)


PADの入力ダイアログに半角数字4桁が正しく入力されるか、Cancelボタンが押されるまでまでループが続くサンプルです。
#背景
　システムからシステムにデータ転記を行う場合でも、最低限の入力が発生するケースあります。例えば期間やコード番号などです。
　業務利用で作成したフローを共有する場合、入力する値に制限をつけることは余分な問い合わせを減らしたり安定した運用を行う上で必要だと感じています。人である以上必ず間違えるからです。
　PADのようなノーコード、ローコードツールでもこの辺りの意識の仕方で生産性は変わると考え、拙いですが書いてみようと思います。
#環境等
Windows10pro 20H2
Power Automate Desktop 2.2.20339.22608
2021年1月の情報です。
今回のお題は【半角数字「1000～9999」に入力制限する】です。
Formsから行うケースとPAD単体でのケースを考えてみます。

**注意:** 制約する方法は幾つもあり、業務に合わせて考え検証する必要があります。
#Formsから入力を考える
Formsの機能で数値制限を行う場合、ケースによっては配慮した方がよいです。
次のようなFormsに、PowerAutomateを介して入力した数値をPADに受け渡す簡単な例で検証してみます。
1. Formsを作成
　4桁のコードにしたいのでFormsの機能で制限しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/50ef1f97-9880-4b1a-da23-b228f3c5837e.png)
2. Power Automate Desktopのフローを作成
 入力変数をFormsInputとして、フローは「メッセージを表示」アクションで表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7ed85b7d-6136-45e5-9d13-00bc213ba486.png)
3.Power Automateのフローを作成
FormsとPower Automate Desktopを次のようにフローを作成して接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/79136305-3b0b-e2cc-fc80-9f66687da872.png)
###検証
当然3桁の数字は制限されて送信できません。
また、全角数字も制限されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/faff104e-014b-064f-0290-64e8d5b9541d.png)
4桁半角数字であれば当然うまくPADに数値を送信できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/987ce05b-e28d-5a29-ecd1-699d99eb4e7a.png)

ぱっと見は意図したように動作しますが、実は大きな落とし穴があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0eddd276-a65c-3e4b-31e1-e9c914a2ed2b.png)
コード番号として「5005」を入力しようとして、うっかり「5000.5」になってしまったとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/355f8dde-def8-1cd0-6aad-2cc86f971436.png)
Formsの機能で半角数値で「1000～9999」に制限出来ましたが、整数という条件は指定できません。
小数以下の数値がが含まれていても1000～9999の条件に合致するため送信できてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/781d6c16-d0c2-5170-1793-49c90eb1cb50.png)

転記先に誤った数値が、万が一、受入れされてしまった場合が怖いので、Power Automate Desktopで転記処理を行う前に、整数4桁でない場合は停止する仕組みを考えます。

例：　変数%FormsInput%の長さ(桁数)を調べ4以外は停止
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ff7e0355-41de-9402-7ee8-652d2ae76a28.png)


```Robib:PowerAutomateDesktop
Display.ShowMessage Title: $'''PAD''' Message: $'''入力値は%FormsInput%です。
よろしいですか？''' Icon: Display.Icon.Information Buttons: Display.Buttons.OKCancel DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''Cancel''' THEN
    Display.ShowMessage Title: $'''PAD''' Message: $'''フローをキャンセルします。''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed3
    EXIT
END
IF FormsInput.Length <> 4 THEN
    Display.ShowMessage Title: $'''PAD''' Message: $'''入力コードがエラーです。
フローを停止します。''' Icon: Display.Icon.ErrorIcon Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed2
    EXIT
END
Display.ShowMessage Message: $'''入力したコードは%FormsInput%''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed2
```
![ezgif.com-gif-maker (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ffab436c-879e-40d8-47a4-46fe4916c9ab.gif)
小数が含まれたまま実行しようとすると停止します。
#Power Automate Desktop から入力を考える
同じく4桁の数値を入力するケースで、Power Automate Desktopで完結させる方法を考えてみます。

「入力ダイアログを表示」アクションで制限を付け4桁の半角数字が正しく入力されるまで次に進めないようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/afbebd88-4f75-17d7-de53-21c347e26203.png)
1. ループ条件
次のようにエラーが出ますが構わず作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0e7c361f-6b56-f8b7-156d-b85fa2a16578.png)
最初のオペランド：```%CodeInput%```
2番目のオペランド：```%''%``` パーセント　シングルクォーテション2個　パーセントです。空を表す特殊な変数です。ループ条件には空に関する選択肢がないためこのように表記して代用します。
%CodeInput%が空の場合ループが続くという設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e567a5e4-6c4d-64de-f031-2e966f7cc21b.png)

**以下ループ条件とEndの間に作成していきます。**

2.入力ダイアログを表示
ここで変数```%CodeInput%```とメッセージを設定します。
ループ条件とEndの間に作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/186948dd-e999-b960-dc09-992a65cdd99c.png)
3. テキストの解析
正規表現を用いて4桁の半角英数1000~9999を検索するため```^[1-9][0-9]{3}$```と表記しました。検索条件に合致した場合変数%Matches%に代入されます。
%Matches%はデフォルトで設定される変数です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/dd3868a8-0b99-bea6-572a-cdadec5f3565.png)

4.If 
%Matches%に数値が代入されないということは4桁の整数で無いので%CodeInput%に空を代入します。%CodeInput%が空にリセットされることでループが回り続けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/f0a7d29c-3396-bbb2-0a8a-1b49ce29bdee.png)
5.変数の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7cfbcb65-d7f6-b62a-d2af-f44682aa8146.png)
6.End
設定はありません。
7. If
 入力ダイアログでキャンセルが押された場合フローを終了するようにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2d64214f-ba21-5062-7f22-467bb080c086.png)
8.フローを停止する
設定はありません。
9.　End
設定はありません。
10.End
ループのEnd。
設定はありません。
11.メッセージを表示　
これだけループ条件の外側です。
ループを抜けたときに表示するメッセージボックスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7f147832-24b2-f81b-1310-aada3c2ca696.png)

```Robin:PowerAutomateDeskTop
LOOP WHILE (CodeInput) = ($'''%''%''')
    Display.InputDialog Title: $'''コード入力''' Message: $'''4桁のコードを入力してください(半角数字1000-9999)''' InputType: Display.InputType.SingleLine IsTopMost: True UserInput=> CodeInput ButtonPressed=> ButtonPressed
    Text.RegexParse Text: CodeInput TextToFind: $'''^[1-9][0-9]{3}$''' StartingPosition: 0 IgnoreCase: False OccurrencePositions=> Positions Matches=> Matches
    IF IsEmpty(Matches) THEN
        SET CodeInput TO $'''%''%'''
    END
    IF ButtonPressed = $'''Cancel''' THEN
        EXIT
    END
END
Display.ShowMessage Message: $'''入力したコードは%CodeInput%''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True ButtonPressed=> ButtonPressed2
```

![ezgif.com-gif-maker (12).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8c582858-cacd-9000-115e-6b17dbdbf325.gif)

#まとめ、雑感
* ローコード、ノーコードツールは比較的簡単に自動化フローを作れますが、係わる業務内容によっては数値一つの入力にも配慮する必要があります。
* 正規表現は便利。
* フローを共有する場合、想像外の可能性を考慮してなるべく多く検証したほうがいいです。
* 入力制限の他にも必要に応じてログを書き出すこともフローの共有時には必要だと思います。（PAの監視に一応ログが残るがループ回数が多かったり長いフローは全部残るわけでないため）