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を起動して、フローを手動実行する必要があります
はい、最後の最後に爆弾です
自動的に出来ひんのんか~いって声が聞こえてきそうです

PowerAutomateDesktopのフローのコピー方法について

Desktop無料版でのフローの共有方法について

本サイトでのコピーについて
PowerAutomateDesktopのコードコピーはバージョンの相違により
コードが貼り付けられない事や設定項目の追加によるエラー発生があります
コードの貼り付けが行えない場合はバージョンの確認を行ってください

PowerAutomateDesktopではフローの共有が有償版でないと行えません
そもそもデスクトップ環境というのは案外差があるので、あまりフローを汎用的に作成するというのは向いていないのですが、それでも汎用的なものやこのサイトで紹介するようなフローをコピペしたい場合があります

PowerAutomateDesktopは多少触ればわかると思いますが、アクションをコピーして複製することは普通に右クリックメニュー等から可能です

実はこのコピペしているのはアクションのそれではなく、内部コードをコピペしています、内部コードの結果が画面には分かりやすくフロー表示されているだけなんですね

Display.ShowMessageDialog.ShowMessage Title: $'''test''' Message: $'''テストメッセージ''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> TestValue
貼り付けしたアクション

上記のコードをコピーしてから、PowerAutomateDesktopのフロー範囲で貼り付けを行ってください
すると画像のアクションが作成されるはずです

このように実際のコピペにはコードが利用されているのが重要な点です
しかもこのコードは設定項目もしっかり反映されるので変数についても同じものがコピペすることが可能なので、自動作成ではない変数を利用していても問題ありません
UI要素などの利用しているものも同じくコピペされるので便利です

また今回は1アクションですが、まとめてコピペすることも可能です
この場合の文字数が凄まじいことになりますので本記事では割愛します

注意点としては、サブフローやそれをまたぐようにコピペは出来ない点です
サブフローを利用している場合は、コピペ先でも同名のサブフローを作成してフローごとにアクションをコピペする必要があります
とはいえ、ただのコピペなのでそれほどの作業量にはならないと思います

そして、このコードのコピペがチャット送信などで簡単に共有できますし
メモ帳に貼り付けてテキストファイルで送信してコピペしてもらうことも可能です

これは実は個人的な開発でも有用です
PowerAutomateDesktop自体結構重たいアプリなので、他のフローで作成した一部の汎用処理をコピペしたい場合にいちいち編集画面を起動しなくても
再利用したいフローをテキストファイルとして保管しておけば簡単に複製が可能です

Windows11で標準搭載となるPowerAutomateDesktopは今後さらに利用場面が増えるはずなので、無料版でのフローの共有方法は早い段階で習得しておきましょう

Excelのテーブルのデータ範囲を削除する

PowerAutomateDesktopでテーブル機能のデータ範囲のみを一括削除を行う方法

Excel.LaunchExcel.LaunchAndOpen Path: $'''対象ファイルの絶対パス''' Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance
Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
IF FirstFreeRow > 2 THEN
    Variables.DecreaseVariable Value: FirstFreeColumn DecrementValue: 1 DecreasedValue=> FirstFreeColumn
    Variables.DecreaseVariable Value: FirstFreeRow DecrementValue: 2 DecreasedValue=> FirstFreeRow
    Excel.DeleteCells.DeleteCells Instance: ExcelInstance StartColumn: 1 StartRow: 3 EndColumn: FirstFreeColumn EndRow: FirstFreeRow ShiftCellsDirection: Excel.ShiftCellsDirection.Up
END
Excel.CloseExcel.CloseAndSave Instance: ExcelInstance

対象ファイルの絶対パスを修正してください

PowerAutomateDesktopにはテーブル範囲を取得するアクションはありません
通常のセル範囲と同じように取得を行う必要があります
しかし、テーブル機能は通常のセル範囲と同様に扱えないことが多くあります
そのひとつが削除操作になります

テーブル機能の範囲をうまく取得せずに削除を行おうとするとエラーとなります
削除前に少し手間をかける必要があります

実際のフロー

画像のようにフローを組むとテーブル機能のデータ範囲を削除することが可能となります
実際の削除に必要となる手順としては2~7行目のアクションになります
1・8行目はExcelの起動と終了なので割愛します

まず2行目はアクティブシートの行と列の最初の空白の位置を取得します
ここで注意したいのがデータの無い行列を取得する点です

VBAのLastCellのような使用済みの最終セルの外側になります
さらにAutomateではテーブル機能の判別が出来ないので、テーブルの外側に入力値があった場合はテーブル範囲を超えてしまうため、削除アクションでエラーとなります
あくまでもテーブル機能の範囲のみのシートに対して有効ということになります
ただテーブル範囲より上の行や左の列であれば、削除範囲の始点を変更すれば対応可能です

3行目はIF分岐になります
データ範囲が存在しなければエラーとなってしまうので、見出し範囲と同じ行数であれば処理は行いません

4行目・5行目では取得した最終列・行数値を1減らしています
これは前述のとおり、ここで取得されるのはデータの最終セルではなくその1つ外側になっているので削除対象範囲がそれぞれ1を引いた数値となります
これをしていないとテーブル機能の場合はエラーになってしまうので重要になってきます
ただのセル範囲であれば気にしなくて大丈夫です

6行目で実際に削除を行います
開始の行列に関しては決め打ちで問題ありません
終点については取得・計算した列・行数値を使用します
このアクションを行うことでテーブルのデータ範囲を一括で削除出来ます

ちなみに、テーブル機能には集計行というデータ範囲外の行を作成することが出来ます
画像と同じアクションではその集計行まで削除を行ってしまいます
集計行を作成している場合は、5行目の行数値の減算数値を1から2に変更することでうまくデータ範囲だけを指定することが出来るようになります

まだまだ思い通りの動きをさせようと思うと回りくどいフローになってしまうことが多いですが、最悪VBAを作成してそれを実行しても良いです
処理速度は圧倒的に早いですしね
ただ、今回のような処理であればインスタンス表示を無くせば完全バックグラウンド処理に出来るのでその点を考慮すると処理時間はVBAほど考慮しなくても良いですね