カスタムフォームの表示を利用して、強調メッセージを表示する

新機能のカスタムフォームを利用して、より見やすいメッセージボックスを表示するフローです

@@statistics_TextBlock: '1'
@@statistics_Action_Submit: '1'
Display.ShowCustomDialog CardTemplateJson: '''{
  \"type\": \"AdaptiveCard\",
  \"version\": \"1.4\",
  \"id\": \"AdaptiveCard\",
  \"body\": [
    {
      \"type\": \"TextBlock\",
      \"id\": \"TextBox\",
      \"size\": \"extraLarge\",
      \"weight\": \"bolder\",
      \"text\": \"${TextBox_Text}\",
      \"wrap\": true
    }
  ],
  \"actions\": [
    {
      \"type\": \"Action.Submit\",
      \"id\": \"OK\",
      \"title\": \"${OK_Title}\",
      \"IsCancel\": false
    }
  ],
  \"verticalContentAlignment\": \"center\",
  \"FormTitle\": \"${AdaptiveCard_FormTitle}\"
}''' @AdaptiveCard_FormTitle: $'''PowerAutomate''' @TextBox_Text: $'''強調したい文字列をここに入力する''' @OK_Title: $'''OK'''

2022年3月1日時点では、プレビュー機能の解説となります。
今後の本機能化の際にはご注意ください

記事コードを貼り付けした時に作成されるアクションの表示状態
コードを貼り付けた時に作成されるアクション

画像の様に「(プレビュー)」の文字がある場合は、本記事と同環境です

フローの実行時に実際に表示されたメッセージボックスの画像
実行時に表示されるメッセージボックス

こちらの画像の様に、指定した文字列を強調して表示することが出来ます

通常のメッセージボックスの表示状態の画像
通常のメッセージボックス

こちらが通常のメッセージボックスで表示された状態です
実際の画面で比べてみると差が良く分かりますが
この状態でも文字列の見やすさがどちらが良いかは一目瞭然です

これは新しく追加された「カスタムフォーム」を利用しています
このカスタムフォームは既存のメッセージボックスでは実現できなかった、任意のオブジェクトを自由に配置することが可能となったメッセージボックスです
今回の場合は、このオブジェクトからテキスト表示を行うオブジェクトとOKボタンの2つのオブジェクトを設定しています

カスタムフォームのウィンドウ操作

こちらの動画を確認してみてください
このカスタムフォームは、任意のサイズに調整可能で、しかも最小化にも対応できます
最大化については解像度にもよりますが画面いっぱいまでは広がらないです

テキストボックスやオプションボタンなどが自由に配置可能なので
ユーザーフォームをイメージ出来るようなウィンドウになっています

ただ、あくまでもメッセージボックスの延長線なので
ユーザーフォームの様にイベント処理はありません
ボタンを押すと画面が消えて次のフローが実行されます

なので現時点でもっとも有用なのが、もともとのメッセージボックスで指定できなかった文字の見やすさを調整できる点です
今回のフローは、単純に見えやすいメッセージボックスを振り替える目的以外に
Excelデータなどを見やすく表示するなどにも利用できます

ちなみにカスタムフォームは、常に最前面に表示されます
また現時点ではその設定を変更することは出来ません
メッセージボックスにはあるので本機能の際には対応されるかもしれません

表示文字列の設定方法について

アクションをwクリックして開いた設定画面の画像
アクションの設定画面

「カスタムフォームの表示」アクションをwクリックで設定画面を開きます
設定画面の「カスタムフォームデザイナー」という青いボタンをクリックします

カスタムフォームのオブジェクト配置を行うデザイナー画面の画像
カスタムフォームデザイナーの設定画面

こちらの「カスタムフォームデザイナー」というウィンドウが新規に立ち上がります
こちらを使って、カスタムフォーム内のオブジェクトを配置・設定を行います
全ての設定はこの画面から行います

表示文字列の変更には、1つ目の「TextBox」をクリックします

表示文字列の設定項目をハイライトした画像
設定項目

右側に表示されたメニューから「テキスト」という項目が表示される文字列に当たります
こちらを任意の文字列に変更することで表示する文字列を変更することが可能です
グレーアウトしていますが、変数を指定することも可能ですので
事前のアクションで取得したExcelデータの変数を指定すれば、動的に文字列を変更することが可能です
ただ、現時点で改行に対応していません
入力ボックスでも行えませんし、改行した変数を指定しても改行は無視されます
(ここは通常のメッセージボックスであれば対応出来る箇所なので、本機能時は対応されるかもしれません)

設定メニューの「折り返す」を表示した画像
改行の設定

また設定メニューを下に送ると「折り返す」という設定がありますが
こちらは今回の場合はオンにしておきます
これをしていないと、ボックスの幅からはみ出た分が表示されなくなります
文字列が極端に長い場合は、最大化しても全てが表示されなくなりますので、今回のような文字列を大きく表示する場合はオンにしておきます

また改行には対応していないと解説しましたが、この設定と下の「最大幅」を応用すればなんとなく任意のところで改行を組むことは可能ですがあんまり意味は無いかもしれません

表示文字の設定項目を表示した画像
表示文字の設定

さらに下の項目が表示文字列の設定になります
ここのサイズが一番大きい設定が画像の特大になります
もうちょい小さくしたい場合は、ここで変更可能です
「色」ですが、赤とか青という設定では無いし、現状背景色の設定が変更できないので逆に見えにくい文字色になる場合もあるので良し悪しです

基本的には「テキスト」の項目を変数か任意文字列に変更すればフローの役割は果たすと思います
これを利用して、Excelデータを別のデータとwチェックをする際にExcelを表示しなくても確認しやすくできます

ちなみに、設定項目最上の「ID」については日本語が入るとエラーになります
デフォルトが日本語になっているのでオブジェクト配置して、そのまま保存するとエラー発生してしまいますので注意が必要です
さすがにこれは本機能時には解消されるでしょう

字幕に簡易解説が付いてます

強力パスワードの生成をしてテキスト保存を行う

PowerAutomateDesktopを利用して、強力なパスワードを生成し、さらにそれをテキストファイルとして出力します

Variables.CreateNewList List=> List
LABEL ReCreate
Variables.ClearList List: List
LOOP LoopIndex FROM 1 TO 10 STEP 1
    LABEL Regene
    Text.Random UseUpperCaseLetters: True UseLowerCaseLetters: True UseDigits: True UseSymbols: True MinimumLength: 15 MaximumLength: 20 RandomText=> RandomText
    Text.Replace Text: RandomText TextToFind: $'''\\.|,|-|_''' IsRegEx: True IgnoreCase: False ReplaceWith: $'''再生成''' ActivateEscapeSequences: False Result=> Replaced
    IF Contains(Replaced, $'''再生成''', False) THEN
        GOTO Regene
    END
    Variables.AddItemToList Item: RandomText List: List
END
Display.SelectFromListDialog.SelectFromList Title: $'''生成パスワードの選択''' Message: $'''リストから使用するパスワードを選択してください(再生成を選択するとパスワードを再度生成します)''' List: $'''再生成
%List%''' IsTopMost: True AllowEmpty: False SelectedItem=> SelectedItem ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''Cancel''' THEN
    EXIT Code: 0
END
IF SelectedItem = $'''再生成''' THEN
    GOTO ReCreate
END
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
File.WriteText File: $'''%SpecialFolderPath%\\NewText.txt''' TextToWrite: SelectedItem AppendNewLine: False IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.DefaultEncoding
Display.ShowMessageDialog.ShowMessage Title: $'''PowerAutomateDesktop''' Message: $'''デスクトップにテキストファイルを生成しました''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True

強力なランダムパスワードを生成して、テキストファイルに書き出します
これを利用することで、考えるのが面倒なパスワードを簡単に生成出来ます
またローカルで作成が出来るので安心感もありますね

このフローでは使用不可文字を設定しています
それは「,」「.」「-」「_」の4文字です
これらは特別な意味を持つものもあったりするのであまり使用しなくても良いかな、と感じた4文字です
後述の解説を読んでもらえれば、除外を解除することも追加・変更も自由に行えます

また、リスト生成してその中から1つを選ぶものとなっており
気に入らなければ再生成することも可能になっています

フローの解説

コードを貼り付けると、22行のフローとなります
順番に解説を行います

1~3行目のフローの画像
1~3行目のフロー

1行目:新しいリストの作成
1行目ではランダム作成した文字列の選択リスト用のリスト変数を作成しています
ここで作成したListという変数に後述で選択するパスワードを格納していきます

2行目:ラベル
このラベルは、後述のフローでリストの再作成を選択した場合に戻ってくる場所になります
再作成を選択した場合は、ここから再開することで全く新しいパスワードの生成を行ことになります

3行目:リストのクリア
2行目でフローが返ってきたときには、前回生成のパスワードリストが残ったままです
それを削除するためのアクションです
なので再生成をしていない場合はまったく意味のないアクションですね

4行目のフローの画像
4行目のフロー

4行目:Loop
4行目からループ処理を行います
12行目のEndまでがループ処理内となります
このループでは、パスワードの生成リストを作成しています
ループの条件が1から10になるまで1を加算しつつ実行なので、ようするに10回実行しているってことですね
ここもリストに10個も選択肢いらんねんって場合は減らしても良いですし、もっとたくさんの中からめちゃめちゃ悩むけど選びたいって場合は増やしても良いですね

5~11行目のフローの画像
5~11行目のフロー

5行目:ラベル
2度目のラベルの登場ですね
ここでは後続の文字列生成時に除外したい文字が含まれていた場合に再作成を行うために戻ってくる個所になります
除外文字が含まれる文字列が生成された場合はここに何度でも帰ってきます

6行目:ランダムテキストの作成
これが今回の処理の目的のアクションですね
例コードでは22行にもなっていますが、シンプルに文字列だけ生成するならこの1行で済んでしまうって、身も蓋もない話です
また、このアクションには設定で利用する文字範囲の指定が出来るので
記号は含めたくない、とか大文字は含めたくないとかであればこちらの設定を変更すれば簡単に対応可能です

7行目:テキストを置換する
ここで除外文字を置換しています
6行目の解説にもあるように大きく利用文字の指定は出来るのですが、その中でこれだけとかの細かい設定は出来ないので除外処理を入れる必要があります
それがここのアクションになります

テキストを置換するアクションの設定画面を表示した状態の画像
テキストを置換するアクションの設定画面

このアクションの設定のうち、「検索するテキスト」に指定したものが除外したい文字になります
今回の場合は4文字なので、それを指定しています
ただ指定の方法が正規表現というなかなかクセのある指定方法になるので
正規表現を使うをオンにする必要があります

正規表現について細かく話すと、とんでもないことになるので
詳しく知りたい方はGoogle先生に聞いてみてください
今回の設定では、記事最初に記載した4文字を除外します
ただ「.」だけは正規表現上特別な意味を持つ文字なので、エスケープ文字という「\」を入力して「\.」としています
また各文字の間に「|」が入力されていますが、これは正規表現でORを意味します
なので4文字のどれかを置き換えるという意味になりますね

置き換え後については、なんでも良いのですが判定に必要になるので日本語の方が良いですね
ランダムテキスト作成で利用される文字だけは利用したらあかんですね

正規表現がなんかよく分からん、という場合はこの「検索するテキスト」に1文字だけ指定して、アクションを4行にしても構わないです
ただ、その時に注意してほしいのが「解析するテキスト」は2つ目以降は置換をした変数を指定しないといけないという点です
これをしてないと、1つ目で置き換えたものが2つ目でリセットされてしまいます

ここのアクションの設定次第で、除外文字を自由に指定できます
ただここに指定を増やしすぎると再作成になる可能性が上昇してパスワード生成に時間がかかってしまうので、あんまり増やしすぎないほうがええです

8行目:If
ここで置き換えした文字列「再作成」が存在しているかどうかの判定を行っています
その文字が含まれていれば、5行目のラベルに戻って再作成を行います
ちなみに10行目がこのIfの終了行になります

9行目:移動先
これが指定のラベル行に移動するアクションです
このアクションでフローを巻き戻すことが出来るんですね~

13行目のフローの画像
13行目のフロー

13行目:リストから選択ダイアログを表示
ここで作成したパスワードリストを表示して、ユーザーに生成するパスワードの指定を行ってもらっています
設定には、1行目で作成したListの変数を指定しているのと、再作成依頼用に「再作成」という項目も追加しています
これを最上部指定することで、初期選択に再作成が表示されます
またここではキャンセルも出来るようにしています
なので、戻り値として選択した項目の文字列と選択したボタンを設定しています

14~19行目のフローの画像
14~19行目のフロー

14行目~16行目:
ここでは13行目の選択ダイアログでキャンセルを選択した時の処理を行っています
キャンセルをした場合はフローを停止しています
ただそれだけですね

17行目~19行目:
ここでは選択したアイテムが再生成かどうかを判定しています
再生成が選択されていた場合は2行目のラベルに戻ります
リスト自体を更新することになります

20~22行目のフローの画像
20~22行目のフロー

20行目:特別なフォルダーを取得
ここでDesktopのパスを取得しています
保存場所自体は別にどこでもいいのですが、このフローの性質上作成されたテキストファイルを利用するのが後日とか、ずっと同じ場所に残しておきたいという想定が低いのでそういったファイルはDesktopに作成するのが便利です
パスワードを設定して、ブラウザに記憶させたり別途管理表に転記したならもう削除してしまうのが良いからです
ここではパス取得だけなので、保存場所を別の場所にしたい場合は次の行を変更します

21行目:テキストファイルに書き込みます
ここでテキストファイルの生成を行っています
同じ名称のファイルがあった場合は上書きします(確認は出ません)
フローの性質上、上書きせずに前回分を残しておく必要性が低いので上書きで良いです
またこの設定の「ファイルパス」を任意に変更すれば、好きな場所に生成することが可能です

22行目:メッセージを表示
完了メッセージを表示しています
ここも必要なければ削除して良いです
デスクトップ通知を無効にしていなければ、処理完了は通知が出るので不要っちゃ不要です

Desktop版からWeb版のフローを起動する

PowerAutomateのDesktop版からWeb版のフローを自動的に実行させる方法について

基本記事にも解説していますが、無償版ではWeb版のAutomateからDesktop版のフローを起動することは出来ません
またDesktop版からWeb版のフローを直接実行するアクションはありませんが、間接的・限定的ではありますが可能です
その方法は単純にWeb版のトリガーとなるようなアクションをDesktop版で実行すればよいだけです
ただ、この方法は上記の通り間接的な実行となるのでWeb版の起動開始までのタイムラグが数分かかることがあります
またWeb版を実行する段階でDesktop版から処理が移行して、以降はDesktop版側の処理を実行できません
その点を考慮した上で処理の検討を行ってください

具体的には、Web版でDesktop版が行えるアクション内でのトリガーを実行させる事になります
最も簡単なものが、OneDriveへのトリガーとOutlook等のメール受信です
この二つはいずれもDesktop版のアクションで可能なものとなっています

Desktop版のフロー

まずは、Desktop版のフローについてみていきます
上記の通り使用するアクションはOneDriveへのファイル作成とメールの送信です

OneDrive利用の場合

OneDriveのフォルダ構成の例画像
OneDriveのフォルダ構成例

画像の様に、トリガー用のフォルダー「新しいフォルダー」を作成して
処理加工を行ったものを格納する「新しいフォルダー(2)」を作成します

トリガー次第ではあるのですが、ファイルの作成や更新などのトリガーを利用している状態で加工後のファイルもトリガー用に入れてしまうと思わぬエラーに見舞われる可能性がありますので、分けておくようにしましょう

Desktop版で利用するアクションの場所を表示状態にした画像
Desktop側で利用するアクション

アクションのファイルの中にある「ファイルのコピー」(元ファイルが必要の場合)や「ファイルの移動」(元ファイルが不要の場合)を利用すれば簡単にファイルを作成できます
ローカルのフォルダにあるファイルを、上記のトリガー用のOneDrive「新しいフォルダー」に複製するだけです
これでDesktop版側の処理は完了になります

Web版AutomateのOneDrive上にファイルが作成された際のトリガーの設定状態の画像
Web版フローの設定状態

こちらはWeb版のAutomateのフローとなります
1つ目がトリガーです
ファイルが作成されたときに実行されます
またこの設定でトリガー用フォルダを指定しておきましょう

2つ目がOneDrive上で複製を行っているアクションです
実際にはこのアクションまでに何らかの処理等が行われて、加工や通知などを行いますが今回はそのまま加工用フォルダーに同じ名称のファイルを作成しています
ファイルという設定項目は識別子なのでパスではない点に注意してください

メール受信の場合

メール受信の場合はWeb版のトリガーとなれるアプリである必要があります
Office系アプリが入っている前提なので、Outlookが最も処理で扱いやすいです

Outlook.SendEmailThroughOutlook.SendEmail Instance: OutlookInstance Account: $'''自己メルアド''' SendTo: $'''自己メルアド''' Subject: $'''Desktopフローからの自動送信''' Body: $'''kkk0014
上記IDコードの処理を実行する''' IsBodyHtml: True

Outlookでのメール送信アクションのコードです
これ単体では使用できませんが、使用できるフローとなると少し長くなり
ここでそれを説明すると蛇足になるのでこれで確認してください

Outlookからのメールメッセージの送信アクションの設定画面と設定すべき項目の画像
アクションの設定画面

こちらが、メール送信アクションの設定画面です
今回の場合はトリガーの役割となるので、自分のアカウントから自分のアカウントへメール送信を行います
「アカウント」と「宛先」はいずれも同一のメールアドレスを指定すると自己送信が可能です

次に「本文」の1行目ですが「kkk0014」と記載しています
これはこちらのトリガーでの実行すべき処理判定に利用できます
処理コードとでも言っておきましょう
コードなので形式だけ整えておきましょう
例えば、1番目の処理なら「kkk0001」というように、数値の部分だけ連番で記載します、ここの詳細は後述します
あとは、コードだけだと迷惑メールに指定される可能性もあるので
適当に日本語の通じるメッセージを追記しておきましょう

また「本文はHTMLです」のチェックはオン(画像の状態)にするようにしておきましょう、これをしていないとHTMLのコードが本文として表示されてしまいます

次にPowerAutomateWebの作成を行います
今回はGmailになっていますが、Outlookではトリガーと本文指定が違うだけですので適宜読み替えてください

PowerAutomateWebのトリガーの設定を表示した状態の画像
トリガーの設定画面

1つ目の「新しいメールが届いたとき」がトリガーとなります
指定としては、件名をDesktop版で指定したものと同一にします
これを行っていないと、届いたメール全てでフローが実行されてしまいます
つまり、Desktop版から送信するメールの件名は他のメールと重複しそうなものは指定しないようにする必要があります
だいたい、Automateとか自動送信とかといった単語を組み合わせておけば重複することは無いでしょう
どうしても件名だけで重複がのぞけないのであれば、送信者であったり他の項目で絞っていきます

PowerAutomateWebの1つ目のアクションの画像
1つ目のアクション

1つ目のアクションでは、本文内容から処理コードを抜き出します

テキスト関数を検索して表示した状態の画像
テキスト関数

このアクションは「テキスト関数」というアクションを使用します
検索に「文字列」と入力すると表示されます
このうちの「部分文字列」というのが上記のアクションになります

指定した文字列から、任意の文字位置から指定の文字数を指定することで抜き出しが行えます
ちなみにこれ自体は関数にも同様の役割のモノがありますが、
基本的にPowerAutomateWebの関数は可読性が低く、アクション名の修正に対応できない点があるのでなるべくアクションを利用する方が良いです
また、このアクションでは文字位置は0から始まる点に注意してください
1文字目から抜き出す場合は「開始位置」が0となります
あとはコードの形式に合わせた文字数を指定するだけです

PowerAutomateWebで条件分岐を設定した状態の画像
条件分岐

あとは、スイッチを利用して処理コードごとの分岐を設定します
この時の条件に上記で取得した部分文字列を指定します
そのケース一致のところに任意の処理を作成します

フォルダー作成の方と違い、Web版のフローで処理の条件分岐が必要となるので少し煩雑に感じるかもしれませんがこちらの利点は比較的処理開始が早い点です
OneDriveのファイル作成は数分実行までかかることがありますが、こちらの受信処理はすぐに実行されるのでGmailでフローを作った場合は、Outlookに受信されるより先に処理結果が出てきたりします

ようするに一長一短なので、運用上の点から検討してください

上記の様に限定的ではありますが、Desktop版から自動的にWeb版のフローに移行させることが工夫次第で可能となります
ここで紹介した方法以外にも、Web版のトリガーに設定可能なものでDesktop版から処理出来ることはあります
いずれも少しずつアクションを見て、出来ることを再確認していってください

PowerAutomateDesktopの処理実行方法の検討について

PowerAutomateDesktop版でフローを作成する前に、しっかり検証しておいてほしいバックグラウンド可能について

PowerAutomateDesktopは、その名前の通りDesktop操作を含めて自動化を行うアプリです
いわゆるRPAですが、このアプリで利用できるアクションでは処理の実行についてバックグラウンド可能なものとアクティブ操作が必要となるものがあります

処理を組む際に、ここを念頭において作成を進めることはとても重要です
前提としてPCが占有されるアクションが存在することは理解しておいてください
これはアップデート等でどうにかなるものではありませんので
フローの流れを考える際に、可能な限りバックグラウンドで可能なもので作成するように意識しましょう
と、いうのもこのアプリはWin11で標準搭載となるなど、個人利用の場面想定が非常に大きいです
個人利用の場面において、RPA用のPCを準備しているという想定がほぼ出来ないためです、VBA実行のためだけのPCを準備したりはほぼ無いと思いますので、それと同じ認識で良いです

そして、バックグラウンド可能を考慮したいのが処理時間の観点です
人が操作するよりは早いとはいえVBAのそれらと比べるまでもなくゆったりしています
そのためPC占有をする処理の場合、それだけ占有時間がかさばります
ただこれは裏を返せば、バックグラウンドで実行できれば他の作業を行いやすいことも意味します

バックグラウンドで可能なアクションは、ファイルやフォルダーの操作やアプリ関係ではインスタンスの作成が選択肢として存在する場合は、完全にバックグラウンド可能です
またインスタンス表示自体は行っていても最小化で実行可能であれば、エラー時のことなどを考慮してその方が良いです
つまりアプリを最小化状態で処理できることが、実務上で目指すべき点です

逆にバックグラウンド実行が不可能なのが、WindowsのUI操作や画像判定です
WindowsのUI操作は最小化していても必ず標準サイズに戻されて全面表示されてしまいますし、クリックアクションであればマウスまで操作されます
また画像判定も同様に画面に表示されていなければ判定を行えません
これらのアクションが不可避の場合は、そのフローはあなたの作業を阻害します
こういったアクションを含むフローを作成する場合は、処理時間や実行タイミングで通常作業との衝突が避けられないなら、いっそ作成しない事も検討してよいです
もちろん、専用PCが準備できるのであれば別です

また、上記のアクションを回避する方法として別のアプリを利用する方法も検討してみてください
例えばUI操作も内容によってはVBAやVBSで実行可能なのであれば、そのExcelやコードをAutomateに実行させることでバックグラウンド化できます

あとはWeb版のAutomateを利用することも検討してみてください
無償版ではWeb版からAutomateDesktopのフロー実行はできませんが
トリガーさえ確保できれば、Desktop版からWeb版を起動することは可能です
簡単なもので言えば、OutlookやGmailなどのメール受信・OneDriveへのファイル作成あたりでしょうか
会社アカウントでなければ、メールやOneDrive利用が良いでしょう

自分から自分へのメール送信を行うフローをDesktop版で作成します
件名や本文に実行したい処理の条件分岐判断文字列を入れて送信します
Web版では受信をトリガーとして処理の実行を行います
こうすることでDesktop版ではメールの送信を行うだけなのでバックグラウンドで処理可能です

Web版のAutomateで出来ることも含めてフローを検討出来ます
2022年2月時点では会社アカウント限定ですが、ExcelWeb版のOfficeScriptも利用可能になるのでOneDrive上でExcelの加工も自由自在になります

フロー作成時は、まずアクションを実行してみてそれがバックグラウンド可能なものかを調べてから作成を進めるようにしましょう
アクションリストにあるので出来ることは確認した、では無く実際に実行してバックグラウンド可能かどうか確認した、という作り方をしましょう
この辺は今までのRPAのイメージとは違いますね

またVBAと比較しても、VBAはPCの占有を前提としている(マルチタスクが得意でない)ので処理速度はかなり重要な要素です
ですが、バックグラウンド処理であればそれほど重要な要素では無くなりますね
さすがAutomate、これからも常識を変えていくでしょうね

Automateで現在日時を任意のテキスト形式にする

PowerAutomateDesktopで日付データを任意のテキスト形式に変更するフロー

DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyyMMdd''' Result=> FormattedDateTime

年月日数値のみ(2022/1/1=20220101)

DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyyMMddhhmmss''' Result=> FormattedDateTime

年月日と時分秒(2022/1/1 1:23:45=20220101012345)

現在日時を取得して、任意のテキスト形式に変換するフローです
主にはファイル作成などの際に、ファイル名に利用したりする場面が多いです

フローの解説

1つ目のコードをコピペして作成されたフローの画像
作成されるフロー

1つ目のコードをコピペすると画像の様にアクションが作成されます
2つ目のアクションは形式を変更しているだけなので解説は割愛します

1行目でPCのシステムの日時データを取得しています
設定では日付のみも選ぶことは可能です

現在の日時を取得しますアクションの設定画面を東京時間で取得する設定にした画像
日時取得アクションの設定画面

こちらの画像の様に、特定のタイムゾーンを指定することも可能なので
PC時間が不安に感じるような場合には、標準時を取得させることも可能です
画像の設定では東京の標準時を取得しています
時差のある場所などの場合にはこの設定を行えば良いです

2行目で、日付データからテキスト形式に変換を行っています

datetimeをテキストに変換アクションの設定画面の画像
変換アクションの設定画面

ここで任意の設定にするには、「使用する形式」からカスタムを選択して「カスタム形式」に形式を指定します
画像では西暦4桁、月日は2桁にそろえる形で数値だけの形式です
ファイル名に「/」が使えないのでそれを除外した形ですね

他の文字列を結合したりもできるので、Excelの表示形式と同じイメージで設定できますが、それほどまだ特殊形式は無いです
特に和暦は存在していないですね
またカスタム形式ではなく標準形式も多少あるので、年月日の漢字も含めたい場合はそちらにあります
他にもいろいろありますが、だいたい以下のものが使えるかもしれません

カスタム形式説明サンプル(2022/1/1 1:23:45)
y年月のみ漢字付き2022年1月
yy西暦下2桁22
t時刻と分数1:23
tt午前/午後午前
ddd曜日(曜日抜き)
dddd曜日(曜日有り)土曜日
m月日のみ漢字付き1月1日

上記のうち1文字だけのものは単独で利用可能なものです
ちなみに「thh」とすると「午01」となります
本来はAM/PMのAかPが取得されるのでしょうが、日本語になっているせいで同じ文字列になってなんの意味もないですね
ちなみにこの影響でAM/PMの取得は出来ません

PDFファイルを分割してファイル作成を行う

PowerAutomateDesktopでPDFファイルのページを抜き出して、それぞれのページのみのファイルを作成するフロー

LOOP LoopIndex FROM 1 TO 100 STEP 1
    Pdf.ExtractPages PDFFile: $'''対象ファイルパス''' PageSelection: LoopIndex ExtractedPDFPath: $'''出力先ファイルパス''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix
    ON ERROR

    END
END

1ページごとに分割する

LOOP LoopIndex FROM 1 TO 100 STEP 2
    Pdf.ExtractPages PDFFile: $'''対象ファイルパス''' PageSelection: $'''%LoopIndex%-%LoopIndex + 1%''' ExtractedPDFPath: $'''出力先ファイルパス''' IfFileExists: Pdf.IfFileExists.AddSequentialSuffix
    ON ERROR

    END
END

2ページずつ分割する

PDFファイルで取得したデータが、ファイル数の軽減のために一つにまとめられてしまっていたりしてページごとに分割して保管をしたい場合に使用します
こんなPDF加工処理はVBAを使うと、オブジェクトの作成が必要となったり
なにかとややこしいですが、Automateを使うとたった一つのアクションで可能です
さらにループ処理を利用することで、ファイル内の全ページに対して処理を行うことも簡単に行えます

フロー解説

1つ目のフロー

1つ目のフローをコピペした際のフロー
1つ目のフロー

1つ目のフローをコピペすると、このような3行のアクションが作成されます

1・3行目はループ処理です
設定は全て1行目で行います

ループ処理の設定画面の画像
ループ処理の設定画面

ループ処理ではページの更新を行っています
「開始値」はPDFファイルの分割を開始ページとなります
「終了」についてはPDFファイルの最終ページ数と一致するのが望ましいのですが、簡単に取得も出来ませんし、実際処理上はそれほど重要ではありません
なので発生しないページ数を指定すれば問題ありません
ここでは100を指定していますが、100ページを超えるファイルの分割処理を行いたい場合は任意に増やすと良いです
「増分」についてはページの更新になるので、1つ目の場合は1ページごとの分割になるので1が指定されています
またループで数値は利用するので、変数は生成します

新しいPDFファイルへのPDFファイルページの抽出アクションの設定画面の画像
PDF分割アクションの設定画面

2行目のアクションではPDFファイルの分割と新規ファイルの生成を行います
「PDFファイル」「抽出されたPDFファイルのパス」にはそれぞれ元ファイルと出力先のパスを拡張子まで含めて行います
ここの設定に関しては「ファイルが存在する場合」で連番ファイルの生成を指定しているので元ファイルが上書きされることが無いため同じパスにしていても問題はありません、むしろ同じ場所に生成されるので分かりやすいかもしれません
「ページ選択」はループの変数を指定することで、対象ページを更新していきます
ちなみにこのアクションでファイルの保存まで完了するので、後続処理が無いので変数は生成していません

ここで重要なのが、ループ処理の説明でおこなった終了ページと終了数値が一致していない点についてです
このままだとループの数値がPDFファイルに存在していないページ数を指定するためエラーが発生してしまいます
そこでこのアクションにエラー処理を設定します

エラー処理を設定した場合のフロー上の表示についての画像
アクションの表示

2行目のアクションの左側に青色のマークがついていることに気づいていましたでしょうか
これはエラー処理が設定されている場合に表示されるものです
どんな設定がされているかは、アクションの設定画面から確認できます

エラー処理を設定するにはアクションの設定画面下部にある「エラー発生時」を選択する
エラー処理を設定する箇所

エラー処理を設定・確認するには、設定画面の下にある「エラー発生時」をクリックします

エラー処理の設定画面の画像
エラー処理の設定画面

すべてのアクションに対して、この設定は行えます
設定項目は豊富にあるので特にWebブラウザ操作などの不安定処理の際の再試行などが行えるため知っておくと良いです
今回の場合は、エラーが発生した状況が「存在しないページを指定した」というものであるため特に特別な処理は不要です
なので「フローの実行を続行する」と「次のアクションに移動」を選択しています

今回のフローは最低限のアクションで目的を達成するものなので行っていませんが
ループ処理に途中判定で終了条件が当てはまればループをすべて実行せずに抜けるような処理を作ることが可能です
上記の「次のアクションに移動」という選択肢のほかに「ラベルに移動」という設定もあります
これを活用することで、エラー発生時はループの外に作成したラベルに移動できます
そうすることで無駄なループ処理を行わないので処理の速度が向上できます
ページ数が膨大でかつ、そのうちのほんの一部しか処理を行わないのが前提であればそのような設定を行うことも有効かもしれません
総ページ数と処理回数は比例すると思うので、あんまりそういった場面は無いかもしれません

2つ目のフロー

2つ目のフローをコピペしたときに作成されるフローの画像
2つ目のフロー

2つ目のフローは複数ページごとに分割を行いたい場合に使用するものです
ここでは2ページごとに分割を行っています
数値を修正することで3ページごとや10ページごとなどの任意の分割を行うことが出来ます
また設定自体はページに関するところ以外は1つ目のフローと同じですので、そのあたりは割愛します

ループアクションの設定画面の画像
ループアクションの設定画面

「増分」を編集します
2ページごとに処理を行う場合は、その加算分を指定するだけです
なので3ページごとなら3、といった具合です

新しいPDFファイルへのPDFファイルページの抽出アクションの設定画面の画像
分割アクションの設定画面

次に分割アクションの設定項目の「ページ選択」を編集します
ここを編集していないと1ページしか抽出されません
入力例にもありますが、連続ページを指定する場合は開始と終了の数値の間に「-」(半角ハイフン)を入力して指定します
今回の場合は変数となるので変数で指定を行います

変数の計算についてですが、画像のとおり「%LoopIndex + 1%」とします
%で囲んだものは変数と認識されます
そのため「%LoopIndex%+1」とした場合はエラーとなります
はじめはこの%内に入れ込むことが分からなくて、わざわざ変数に加算するアクションを利用したりしていました
なので、ここの+1の数値を3ページごとなら+2にする、といった具合で編集を行います

以上の様に任意ページも2か所編集するだけで可能になります
VBAでも出来ますが、こっちのほうが楽なのが分かりますな

デスクトップに複製ファイルを作成する

PowerAutomateDesktopでデスクトップに指定のファイルを複製するフロー

File.GetPathPart File: $'''複製元ファイルを指定する''' Directory=> Directory FileName=> FileName
File.GetTempPath TempFile=> TempFile
File.Delete Files: TempFile
File.Copy Files: $'''%Directory%\\%FileName%''' Destination: TempFile.Directory IfFileExists: File.IfExists.Overwrite CopiedFiles=> CopiedFiles
File.RenameFiles.Rename Files: CopiedFiles[0] NewName: $'''複製ファイル名を指定する''' KeepExtension: True IfFileExists: File.IfExists.Overwrite RenamedFiles=> RenamedFiles
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
File.Move Files: RenamedFiles[0] Destination: SpecialFolderPath IfFileExists: File.IfExists.Overwrite

PowerAutomateDesktopで自動化を行う際に、原本ファイルの編集は行わないようにして、複製を作成して加工処理を行うような場合に使用するフローです

フローを実行すると、指定したファイルを指定した名前でデスクトップに複製ファイルを作成します
このフローでは単一のファイルを想定していますので複数ファイルを対象とすることは出来ません

このフローで修正が必要な点は、原本ファイルの完全パスと複製ファイル名です
この2点だけ任意に変更してください

フロー解説

作成されたフロー

画像のものが実際に作成されたフローとなります

1行目では原本ファイルのパスを取得しています

原本ファイルの指定

ファイルパスの設定を変更します
これが原本ファイルの指定になります

ファイルの選択ダイアログで指定が出来るので、簡単に指定できます
エクスプローラーで完全パスをコピペしても良いです

2~3行目のアクションでは、仕様上必要となるアクションで
元々の目的には一切関係のない箇所です
と、いうのもファイルの複製や移動がフォルダ指定までしか行えないため
複製を行う場合は一旦元のファイルとは別の場所に格納する必要があります
同名なので同じ場所は当然使用できません

別の場所というのが案外やっかいで、PCの環境ごとにフォルダ構成も異なっています
なので方法としては2つ考えられます

今回のフローの様に一時ファイルという仕様上のファイルを利用する方法と、同場所に重複が確実に発生しない名称でフォルダの作成を行ってそこに格納する方法です

後者の場合はフォルダの名称が確実に重複しないことが大前提になりますので、名前の定義が面倒ですし、場所がローカルでは無くサーバー環境などであれば他の人にも変なフォルダの作成がされたのが分かるためそれも好ましくはないです

そこで今回のフローでは一時ファイルの取得アクションを利用することで、そのファイルが作成される過程で同時に作成されるフォルダを利用します
このフォルダはローカル環境であることと、Automateによる一時ファイルフォルダのため通常利用しているフォルダの可能性も皆無なので安全です

ただ、残念なことにファイルの作成を行わないアクションがありません
なので一時ファイルが完全に不要なのですぐに削除を行っています
これでフォルダだけが作成された状態にすることが出来ます

4行目で原本ファイルのコピーを一時ファイルフォルダに作成を行います
前述のとおり、この複製ファイルは原本ファイルと同名になっているので
5行目でファイルの名前を変更しています

ファイル名変更の設定画面

設定項目中の拡張子を保持するを有効にしているため、ファイル名の指定に拡張子は不要です
これのおかげで元ファイルの形式が一切判断が不要となっていますし、どんな形式にも対応可能になります

6行目はVBAでもある特別なフォルダーの取得というアクションです
他にもダウンロードフォルダなどが取得可能です
ここではデスクトップを取得しています
当然デスクトップはPC環境によって差があるので取得を行う必要があります

7行目で一時フォルダ内に作成した複製ファイルをデスクトップに移動しています
この時同名ファイルがあった場合は上書きされるので注意してください

ファイルのコピーアクションで、同時にファイル名の指定が出来ないおかげでステップ数が結構増えてしまいました
今後のアップデートで設定可能になるかもしれませんが、それまではこれで対応してください

変数について

PowerAutomateDesktopでの変数の基本的な話

PowerAutomateDesktopでは、変数が利用できます
変数には型の指定は存在しません
VBAのような型指定は行わずに、変数の名前のみ設定を行います

また、独自の仕様として変数名は自動的に作成されます
ほとんどの場合においてはこの変数名をそのまま利用する方がコードの可読性は上がりますので、そのまま利用して問題ありません
同じ名前があった場合は自動的に連番が付与されるので、変数名の重複は発生しません

フロー変数

変数の生成などについて

フロー変数とは、PowerAutomateDesktopで作成するフロー内でのみ有効な変数となります
他のフロー実行時には当然影響を与えないものです

このフロー変数は、フロー単位のためサブフローを作成していたとしてもそこは共通となりますのでそこに関しては注意が必要です

まずは実際の作成を行ってみます
返し値を持つアクションであれば、自動的に作成が行われます

作成された変数

今回は「マウスの位置を取得します」アクションを利用してみます
このアクションは実行された時点でどこにマウスカーソルがあるかを返すアクションです
返された値は変数に格納されます
VBAでいうようなアクションの中にアクションを入れて、返し値を計算等にそのまま利用するような作成は行えません
返し値は全て一旦変数に格納する必要があります

このアクションでは、マウスのXとYの位置を数値で返します
2つの値を返すので変数も自動的に作成されるものが「MousePosX」「MousePosY」が作成されます
画像の右側に作成されていることが確認できます
変数の名前からも容易に用途が分かるようになっています

変数名の設定画面

アクションの設定画面の一番下に変数の設定があります
「生成された変数」を開くと、各変数の詳細が確認できます
ここできちんと変数の解説がされているので、改めて変数に入るものがなんなのか確認しやすくなっています

設定を変更した状態

変数の名称の箇所をクリックすると変数の名称を変更可能です
また返し値が不要な場合は無駄な変数が作成されて一覧が煩雑になるので
変数の生成を抑止できます
その場合は、トグルボタンを切り替えることでグレーアウトして作成がされなくなります

変数の変更を保存した状態

画像の様に設定変更を行うことで、フロー変数が任意の状態に設定されていることが確認できます
このようにして、変数の自動作成には対応を行っていきます

処理実行した後の状態

この変数一覧は内容の確認も行えます
実際に処理を実行してみると、変数に格納された値が表示されます
デバッグ時などに確認します

また、下部にある消しゴムボタンをクリックすると全ての変数を一括してクリアできます

簡易設定

パスワードなどデータが見えてしまうと困るようなものの場合は、マウスオーバーで表示される帽子とメガネマークをクリックすることで内容が表示されないようになるモードもあります

基本的にPowerAutomateDesktopは自分のための自分で作成した処理なので通常は気にしなくても良いですが、このサイトの様に説明を行う場合などには活用できます

活用メニュー

また右クリックでも表示されるメニューから「使用状況の検索」を実行すると
画像の下側にあるような変数が使用されているアクションの一覧が表示されます

何らかの理由で変数を置き換えたり、削除したりする場合には事前に漏れなく確認を行うことが可能です

変数の指定について

変数を生成したら、それを各アクションで使用します

生成された変数を指定する場合のボタンの場所についての画像
変数の指定ボタン

生成した変数を指定するには、アクションの設定ボックスの右側に「{x}」というボタンがあり、それをクリックすることで変数リストが表示されるので
そこから指定することで設定ボックスに入力されます
画像の通り、変数は「%変数名%」の形式で表されます
この%で囲んだ中身が変数として認識されるので、ファイルのパスなどで変数以外のものを指定したい場合はこの%の外側に指定することで設定できます
この場合は特に文字列であることを明記する必要はありません
Automateは基本的に変数は自動判定をするからです

また、数値変数の場合に設定ボックス内で既定の計算をして指定をしたい場合がありますがその場合は以下の様に入力を行います

数値変数を指定する段階で計算する入力方法の画像
変数を計算して指定

画像の様に%の内側に計算式を記入します
こうすることで計算された結果が変数として出力されます
「%NewVar%+1」と%の外に計算式を記入した場合は「+1」は文字列と認識され計算が行われず、しかも数値変数であったものが文字列変数に変化してしまいます

変数を上記の形式でそれぞれ入力して実行した場合の出力結果の画像
計算を実行した状態

画像を確認してください
1行目で変数に「1」を設定しています、この変数は数値変数です
2行目では「%NewVar%+1」と指定しています
その結果は右側にある通り「1+1」という文字列になってしまって1+1の計算が行われていません
3行目では「%NewVar+1%」と指定しています
こうすることで変数内で計算が行われるため、1+1が計算されて結果「2」が出力されています
4~6行目はそれぞれ四則演算を行っていますが、すべて2行目同様に%の内側に入力を行っています

また、固定数値ではなく変数と変数を計算したい場合もあります
その場合も同じく%の内側に指定を行います

変数と変数を計算して出力する入力方法と出力結果の画像
変数と変数を計算して出力

画像では「NewVar5」の内容を変更しました
変数で変数を計算する場合には「%変数名 * 変数名%」という形で入力します
ここも「%変数名% * %変数名%」の様に計算式を%の外に出してしまうと文字列化してしまいます
画像の場合は「NewVar」は1、「NewVar3」は2なので「1*2」が計算されて2が出力されていることが分かります

ここが少し知っていないと出来なくて不便な点なので、しっかり押さえておいてください

入出力変数について

入出力変数とは、このフローの外部とやり取りをすることの出来る変数となります
いわゆる引数となります

前述していますが、あくまでも外部のフローとのやり取りに使用するものであり
メインフローとサブフロー間でやり取りするようなものではありません
つまり、単独で実行されるフローには一切作成の必要は無い変数になります
またフロー変数と違い自動的に作成されることはありません

まずは作成を行ってみます

作成ボタン

作成する画面は、画像の+ボタンをクリックすると入力か出力かの選択肢が表示されます
まずは入力を選択してください

入力変数の設定画面

入力変数では主に設定するのは変数名と既定値です

変数の種類とデータの種類についてはここでは変更できませんので初期値で問題ありません

「変数名」はこのフロー内で利用する際の名称です
「外部名」はこのフローを呼び出す際の設定画面に表示される名称です
ここは後述します

「既定値」はフローの呼び出しの際の未入力時のデータです
処理のエラーリスクを考慮すると、何らかの設定はある方が良いでしょう

「説明」は呼び出しの際の変数の説明に表示されます
変数名が紛らわしい場合は記載しても良いです

出力変数の設定画面

出力変数は設定項目はほとんど必要ありません
格納されるデータによって型が決まるので、型指定も存在しないです

とにかく、外部から分かりやすい記載をしていれば大丈夫です

そして今回テスト処理としてはこのフローは引数に渡された数値に1.1を積算して返す、いわゆる消費税込み金額の計算処理とします
VBAでもよくある処理ですね

SET NewOutput TO NewInput * 1.1
作成するアクション

変数の設定をするアクションで計算を実行します
出力変数に入力変数から計算を行い格納しています

これで一旦フローを名前を付けて保存を行います
とりあえず名前は「消費税計算」とします

このフローは一旦閉じておいてください
※ここまでに作成したフローとは別のフローで作成を進めてください
次に新規でフローを作成して、以下のアクションを作成します

@@flowname: '消費税計算'
External.RunFlow FlowId: 'e5450efa-1d40-4c88-ab9e-73324cb03d41' @NewInput: 100 @NewOutput=> NewOutput
アクションの設定画面

外部フローを実行するには、「Desktopフローを実行」から行えます
「Desktopフロー」では環境にあるフローが自動的にリスト表示されます
なので先ほど作成して保存した「消費税計算」を選択します

選択すると、同期されて入力変数が反映されます
画像の通りで作成した「NewInput」が表示されます
この変数の右側にある情報ボタンにマウスオーバーさせると、説明に記載した文章が表示されます

テストのために、引数に渡す数値を「100」に設定します
設定が完了したら処理を実行してみましょう

計算結果

処理を実行すると、変数に計算値が格納されています
数値は引き渡した数値「100」に1.1の積算で「110.0」が返されています
小数点数値が表示されているので、変数の型が実数になっているようですね
元々「消費税計算」の引数ではString型でしたが、普通に数値計算出来るし
返し値は数値となっています

型の確認も出来ないので、結果をみて判断するしかないですが
実数か整数かはあまり影響は無いとは思いますがそれ自体はこのフローで処理を行えばよいだけですね

Excelで空白になるまでセル参照ループする

PowerAutomateDesktopでExcelのセルを参照していくループ処理

Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeRow=> FirstFreeRow
LOOP LoopIndex FROM 1 TO FirstFreeRow STEP 1
    Excel.ReadFromExcel.ReadCell Instance: ExcelInstance StartColumn: 1 StartRow: LoopIndex ReadAsText: False CellValue=> ExcelData
    IF IsEmpty(ExcelData) THEN
        EXIT LOOP
    END
    # ここにセル値(ExcelData)での処理内容を作成する
END

PowerAutomateDesktopで開いたExcelのアクティブシートの指定列のセルを1セルずつ参照していく処理になります
Excel表データの自動化の基本中の基本の処理になります

事前にExcelを開いて、シートのアクティブ状態は設定した状態で使用します

アクション解説

アクション作成時

処理の最初に、空白行数値を取得しています
この数値をループ処理の終了判定とします
ちなみにアクションとしては行と列の両方を取得出来るアクションですが
今回の処理に列数値は必要ないので除外しています

次にループ処理に入ります
上記で取得した数値まで1ずつ加算しながら処理を行います
ループ内ではExcelからループで加算している変数の行数値にあるデータを取得しています
この内容によってなんらかの処理をさらに作成を行っていく形となります
またループの終了条件としてセルが空白かどうかも追加しています
通常実行であればそれほど大きな時間はかからないかもしれませんが、必要ないなら終了してしまいます

この一連のアクションで設定すべき箇所はあまり多くありません
参照列と開始行の指定くらいです

それ以外の少しの改変で応用できる部分は1行ずつ処理するかどうかや空があっても最終行まで処理を行うかなどになります

指定列の変更について

列の設定画面

列の指定には、3行目の「Excelワークシートから読み取り」の設定を変更します
この設定項目のうちの先頭列が列指定になります

今回の処理では単一セルの値を取得しているので、先頭列という名称にはほぼ意味は無いので、指定列数値と置き換えて考えてください

ここは数値になるので、アルファベットでの指定は出来ません
A列なら1、C列なら3といった具合で指定を行います

今回のコードでは1となっているので、A列が指定されていることになります

行の設定について

行に関する設定

行の設定については2つの用途があります
設定は2行目の「Loop」の設定を行います

まず「開始値」ですがここの数値がセル参照の初期セルとなります
今回のコードでは1となっているのでA1から参照が始まる形になります
ですが、だいたい見出しがある場合があるかと思いますので
その場合には実データの行数値を指定する必要があります

処理対象

例えば、画像のような表データを参照したい場合は見出しが2行目で実データは3行目から始まっています
なので、開始値の数値を「3」に設定する必要があります

次に「増分」ですが、この数値を増加させることで1行ずつの処理では無く
1行飛ばして処理を行ったりすることが可能になります
表データの場合はあまり変更することはないかもしれませんが
複数行を1つのデータとして表が作成されているようなものの場合にはこの設定が必要となります

空白の場合の終了判定について

ループ処理を行う際に、途中に空白セルが存在する前提がある場合は
途中で処理が終了してしまうことになってしまいます
そんな場合は空白で終了する判定を無くす必要があります

ここは設定では無く、4~6行目のIF処理をそのまま削除すれば良いだけです

削除した状態

画像のような形になればOKです

この処理についてはインスタンス表示が無くても可能な処理なので
完全バックグラウンドで処理を実行することが出来ます

安心感のあるゴミ箱を空にする方法

PowerAutomateDesktopを活用して不要ファイルを一定期間復活可能な状態で削除する方法

/# F_Name_1=常に処理時に空にしたいフォルダの絶対パス
F_Name_2=OneDrive上に作成したゴミ箱フォルダの絶対パス#/
SET F_Name_1 TO $'''空にするフォルダの絶対パス'''
SET F_Name_2 TO $'''OneDriveのゴミ箱の絶対パス'''
BLOCK Get_Err
ON BLOCK ERROR all

END
    Folder.GetFiles Folder: F_Name_1 FileFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
    LOOP FOREACH CurrentItem IN Files
        File.Move Files: CurrentItem Destination: F_Name_2 IfFileExists: File.IfExists.Overwrite
    END
    Folder.GetSubfolders Folder: F_Name_1 FolderFilter: $'''*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Subfolders=> Folders
    LOOP FOREACH CurrentItem IN Folders
        Folder.Move Folder: CurrentItem Destination: F_Name_2
    END
    Folder.Empty Folder: F_Name_2
END
ERROR => LastError
IF LastError <> $'''エラーはありません''' THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''PowerAutomateDesktop''' Message: $'''ファイル整理が失敗しました''' Icon: Display.Icon.ErrorIcon Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
END

フローの最初にある変数の修正をしてください

不要ファイルは毎日発生します
本当の意味での不要ファイルというものは存在せず、その内容自体は機密事項であったり個人情報があって他人に知られるのは困ってしまう情報が含まれたファイルがほとんどです

会社のセキュリティルールによっては定期的に不要ファイルの削除を行うようになっていることもあると思います

しかし、ゴミ箱に放り込んだファイルを完全に削除する操作は少し躊躇することが多々あります
なぜなら完全削除した後に、やっぱりあのファイル必要だった!とか再確認だけしたかった!とか一時的でも復活して欲しいことが懸念としてあるからです

これは結構ネックに感じてしまう部分です
かといって長期間ゴミ箱を空にせずにおくこともルール違反になってしまうし
ゴミ箱の自動削除設定で削除すると復元が大変です

要するにゴミ箱は常に空にしつつ、削除したファイルは一定期間は復元出来る状態にしておきたい、というすごくわがままな考えを抱くのが自分だけでしょうか!?
いえ、これがあるとめっちゃ出遅れてもう無くなってしまったと諦めていた人気商品がまだあった時の感動と同義です!
この記事の方法で、会社の情シスの人や上司にはちゃんと空になったゴミ箱をこれ見よがしに見せつけてください
後述の方法で、一定期間は復元可能なので毎日の削除作業も気楽なもんですよ!

OneDriveを活用する

結果から言いますと、OneDrive上で削除を行うという方法になります
OneDriveは削除されたデータは、通常アカウントでは30日・職場などのアカウント等の場合は93日(管理者で変更可能)の間は復元が可能な状態でゴミ箱に格納されます

ゴミ箱からは削除しておいて、こちらでバックアップを取っちゃおうというものです
OneDriveのクラウド上であれば必要な時に復元するのもデバイスを選ばず行うことが可能なのも今の時代にあっていて良いと思います

しかし、単純にExplorerでOneDriveのファイルを削除してもゴミ箱に行ってしまいますし、削除のためにいちいちWebアプリを起動するのも面倒です

そこでPowerAutomateDesktopを活用します
今回のフローでは同時に不要ファイルがたまりやすいダウンロードフォルダも空にするようなフローにしています

いや、ダウンロードフォルダは空にせんでええですよ
余計なことまでしないで下さいという人は下のコードだけで良くなります

Folder.Empty Folder: $'''OneDrive上に作成したゴミ箱フォルダの絶対パス'''

OneDriveの指定フォルダを空にするアクションです
ただこんだけになります

いや、やっぱりダウンロードフォルダも空にしたいねん、という人は引き続き記事確認を行ってください

フローの流れについて

変数設定アクション

フローの流れですが、途中に幾度か対象フォルダのパスが出てくるので最初に変数でダウンロードフォルダとゴミ箱フォルダの絶対パスを変数に取得します
これ以降は変数で対象フォルダの指定を行います

エラー処理

4行目からのエラー処理です

エラー処理終端

14行目までを包括する形に設定しています
これはファイルの移動や削除の処理がファイルの編集権限であったり、使用中による削除不可という状況が往々にして発生することを考慮して後続のエラーメッセージ用に設置しています

この4行目のアクションではエラーが発生した場合は処理を継続してかつ14行目から実行するようにしているため後続処理が実行されます

ちなみに処理的には移動できなかったとか、削除できなかったとか、フォルダパス構成が違っていたとかの原因についてはどうでも良いと考えます
単純に削除したつもりがされていなかった状況を回避できれば十分なので
後続でエラー内容の判定までは行っていません

ファイルの移動アクション

ダウンロードフォルダにあるファイルを全てゴミ箱フォルダに移動させます
ちなみにファイルとフォルダを同時に移動させるアクションが無いので、ファイルとフォルダをそれぞれで行う必要があります
まずはファイルの移動を行っています

フォルダの移動アクション

次にフォルダの移動も行います
中のデータはそのまま移動できるので再帰処理は不要です

ゴミ箱を空にするアクション

ここがゴミ箱フォルダを空にするアクションです
前述していますが、結局ここだけでもほぼ目的を達成できます

エラーメッセージアクション

ここまでのファイル操作でエラーが発生しているかどうかを判定して
発生していれば、15行目でエラー情報の取得を行います
その結果が「エラーではありません」になっていなければなんらかのエラーが発生していると判断が出来ます
その場合にのみメッセージを表示しています
処理の目的から完了のメッセージは不要と思います
欲しい場合はこの辺を修正してください

ゴミ箱は空っぽの状態でバックアップ体制取れるなんて、なんて素晴らしいの!
というお声にお応えしますが残念なことに、無償版では自動実行ができません
なのでAutomateDesktopを起動して、フローを手動実行する必要があります
はい、最後の最後に爆弾です
自動的に出来ひんのんか~いって声が聞こえてきそうです