指定フォルダー直下の構成を複製する

PowerAutomateDesktopを利用して、指定したフォルダー直下のフォルダー構成を複製するフローです

Display.SelectFolder Description: $'''複製をするフォルダーの選択''' IsTopMost: True SelectedFolder=> SelectedFolder ButtonPressed=> ButtonPressed
IF ButtonPressed <> $'''OK''' THEN
    EXIT Code: 0
END
Folder.GetSubfolders Folder: SelectedFolder FolderFilter: $'''test*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Subfolders=> Folders
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
Folder.Create FolderPath: SpecialFolderPath FolderName: $'''作成用フォルダー''' Folder=> NewFolder
LOOP FOREACH CurrentItem IN Folders
    Folder.Create FolderPath: NewFolder FolderName: CurrentItem.Name
END
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: NewFolder WindowStyle: System.ProcessWindowStyle.Normal

フォルダーの選択で指定したフォルダーの直下にあるフォルダ構成をデスクトップに複製するフローです
年や月などで、同じ構成のフォルダーを作成する場合に利用します
例えば、毎月月初に担当者ごとのフォルダを作成するとか、顧客ごとのフォルダを作成するという場合です
前提として、フォルダーの中身は複製しませんので階層構造になっているフォルダーも複製は行いません
このフローの前提として、直下フォルダの構成以外は新規で利用することを想定しているからです

フロー解説

1行目:フォルダーの選択ダイアログを表示
2~4行目:IFによる選択キャンセル時のフロー終了
1~4行目のアクション

1行目は構成を複製するフォルダーを指定するためのダイアログ表示のアクションとなっています
ここで選択したフォルダーの直下にあるフォルダーを複製することになります

2~4行目は、そのダイアログで選択をキャンセルした場合の終了処理になっています
これが無いと後続で未選択時にエラーが発生します

5行目のアクション
「フォルダー内のサブフォルダーを取得」アクションの設定画面の画像
設定画面

5行目は指定したフォルダーの直下にあるフォルダーを全て取得するアクションです
ここで「フォルダーフィルター」という項目を設定することで、任意のフォルダーに制限をかけることが可能となります
例えば、直下にあるフォルダーのうちでも特別に作成したフォルダーであり複製は不要なフォルダーがある場合は、その名前で除外を行うことが可能となります
ただ所詮は名前の文字列だけでしかないので複雑な判定が必要な場合は、初期値の「*」だけにして全てを複製してから手動で削除対応を行う形となります
例の場合で言えば、「test」で始まるフォルダーを対象としています

ちなみにこの項目のうち、サブフォルダーを含めるをオンにした場合は
直下以降の階層構造全てを複製の対象には出来ますが、あまり不要かと思いますので例コードではオフとしています

6行目:特別なフォルダーを取得
7行目:フォルダーの作成
6~7行目のアクション

6行目では複製フォルダーの保存先としてデスクトップを対象とするため、デスクトップのパスを取得しています

7行目で複製フォルダーの格納用フォルダーを作成しています
同名フォルダーがあった場合は何も起きません
基本的にはここで複製したものは移動する前提のため、デスクトップに同じ名称のフォルダーは存在しない想定です

8~10行目のループによるフォルダー作成のアクション画像
8~10行目のアクション

8行目と10行目はループ処理のアクションとなっています
ここで取得したサブフォルダーの要素を全てループしています

9行目でサブフォルダーの名前で新規にフォルダーを作成して、デスクトップの作成用フォルダーの中に保管をしています
これをループにより、取得したサブフォルダーの個数分処理します

作成用フォルダーを開くアクションの画像
11行目のアクション

11行目はデスクトップに作成した作成用フォルダーをエクスプローラーで開くアクションです
デスクトップに作成しているので、探す必要はほぼ無いので蛇足のアクションではありますので削除しても問題はありません
こちらのアクションについては以下の記事で解説を行っています

指定ファイルを指定のフォルダに任意の名前を付けて保管する

指定のファイルを任意の名前に変更して保管用フォルダーに移動する処理

Display.SelectFileDialog.SelectFile Title: $'''対象ファイルを選択してください''' FileFilter: $'''TEST*.csv''' IsTopMost: True CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
IF ButtonPressed <> $'''Open''' THEN
    EXIT Code: 0
END
File.RenameFiles.Rename Files: SelectedFile NewName: $'''OutDate''' KeepExtension: True IfFileExists: File.IfExists.Overwrite RenamedFiles=> SelectedFile
File.Move Files: SelectedFile Destination: $'''保存先の絶対パス''' IfFileExists: File.IfExists.Overwrite MovedFiles=> SelectedFile
# 以下、保存先のフォルダを開くアクションのため不要であれば削除
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: SelectedFile[0].Directory WindowStyle: System.ProcessWindowStyle.Normal

この処理は指定したファイルの名前を変更して、指定のフォルダに移動します
これの利用場面としてはWeb等から取得したcsvファイルなどをデータ保管用フォルダに格納します、さらにこの先の流れとしてPowerQueryを想定しています
PowerQueryは絶対パスで読み込み先を指定するので、この処理により前回取得時情報を更新するために活用します

この処理は1件だけの処理となっておりますが、実務上は複数のファイルを同様の操作を行うことが想定されるのでその場合はファイル数×作業頻度の度合いでかなり楽になります
さらにこの処理は最後に保管したフォルダをエクスプローラで開いていますが
これも後続作業を想定したものとなりますので不要であれば削除して問題ありません

フロー解説

1行目のファイル選択ダイアログを表示するアクションの画像
1行目のフロー
ファイルの選択ダイアログを表示のアクションの設定画面
設定項目画面

1行目は対象となるファイルを指定するためのダイアログを表示させるアクションです
このアクションの設定項目としては2項目を編集します

「初期フォルダー」ダイアログ表示時に最初に開かれるフォルダの指定です
例コードでは空白となっております、この場合は前回開いたフォルダが開かれます
Webからのダウンロードファイルを想定している場合はここをダウンロードフォルダに設定したりします

「ファイルフィルター」ここで指定した文字列がファイルの制限になります
VBAの様に拡張子の制限では無く、拡張子を含めたファイル名の制限になります
この制限はワイルドカードの利用も可能となっております
例コードの場合では頭文字に「TEST」が含まれたcsvファイルを対象としています

ここをより明確に設定することで、同じcsvファイルであってもダイアログに表示させないことが可能となるのでファイル選択間違いを抑制出来ます

ファイル名の制限をかけた状態が分かる画像
表示制限がかかった状態

この画像は左がPADで表示したダイアログ、右はエクスプローラーの画面です
今回の場合は頭文字に「TEST」となっているものが条件です
そのため、同じ個所に保存されているcsvファイルでも「Sub_20221009.CSV」が表示されていないことが確認できます

そして、ワイルドカードを利用することでダウンロードした際に日時などが追記されるファイル名となっていたとしても対象に含めることが可能です
この指定をより細かく指定すれば、ファイル名で22年10月分だけ表示する、という事も可能です

2~4行目のアクションの画像
2~4行目のアクション

2~4行目はダイアログでキャンセルをした際に処理を終了させるアクションです
ここを作成していないと後続でファイル未選択によりエラーとなります
ダイアログの開くボタンをクリックすると「Open」が返されるので、それ以外のものであれば処理は終了させています

5行目の「ファイルの名前を変更する」アクションの画像
5行目のアクション
ファイルの名前を変更するアクションの設定項目画面の画像
設定項目画面

ここで変更するのは「新しいファイル名」の1つで十分です
ここを最終的に保存をしておくファイル名を指定します
基本的に処理の流れ上、同じ場所にファイルが存在する可能性はありませんが
あった場合には上書きする設定にしています

ちなみに、このアクション以降含め生成された変数は「SelectedFile」に格納しています
これは後続処理がこのファイルを対象としているので変数をアクション数分作成する意味が無いからです
ダイアログで返された変数をどんどん上書きしていきます
また拡張子を保持する設定にしているので「.csv」は指定に含めません

「ファイルの移動」アクションの画像
6行目のアクション
「ファイルの移動」アクションの設定項目画面の画像
設定項目画面

6行目はファイルを指定フォルダに移動しています
ここで設定するのは「宛先フォルダー」です
移動先のフォルダを絶対パスで指定します
この移動の際に同じファイル名があった場合は上書きしています
処理の想定が古いファイルのデータを上書きすることなのでここは重要です

7行目「コメント」と8行目「アプリケーションの実行」アクションのフロー画像
7~8行目のアクション

7行目はコメントで、8行目は保存先のフォルダをエクスプローラーで開きます
これはこの保存後に使用するファイルが保存されているところを開くことで使用ファイルを開く手間を少し楽にする目的で追加しています
ここは完全に蛇足の処理なので不要であれば2行とも削除して問題ありません
8行目の処理については以下の記事で解説しています

利用したフォルダをエクスプローラで開く

PowerAutomateDesktopで任意のフォルダをエクスプローラで開いてウィンドウを表示します

System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: $'''開きたいフォルダ絶対パス''' WindowStyle: System.ProcessWindowStyle.Normal

エクスプローラでパスを指定して実行する

新しく追加されたDesktopフロー例に、この内容のフローがあります
その中で利用したいのがこの1行だけのフローです

フローの設定項目
設定項目画面

設定項目の「コマンドライン引数」に開きたいフォルダの絶対パスを直接していします
エクスプローラと連動はさせていないので、フローの最後に利用することが多い場面になります
途中でウィンドウが開いても処理に影響を与える可能性があります

使用例

File.GetTempPath TempFile=> TempFile
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: TempFile.Directory WindowStyle: System.ProcessWindowStyle.Normal
Display.ShowMessageDialog.ShowMessage Message: $'''%TempFile.FullName%を削除します''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
File.Delete Files: TempFile.FullName
コードをコピーして作成されたフローの画像
フローの画像

コードをコピーすると画像のように4つのアクションが作成されます

行っている処理は、一時ファイルを作成して、そのファイルのフォルダをエクスプローラで開きます
処理は停止しないので、ファイルが作成されたことを確認するためのメッセージを表示して、そのメッセージが消されたら一時ファイルは削除します

このように、Excelなどのファイル作成を行った場合に自動的にフォルダに格納するような処理だと処理が完了した後にユーザーがそのファイルを確認したい場合にフォルダをいちいち開かなくてはいけなくなります

なら、最初から作成ファイルを終了しなければ良いとの話になりますが
Automateの仕様で、Excelをフロー中に終了させないとプロセスが残ったままになることがあるのでなるべくフローで操作したExcelは終了させたいです

処理の最後にこのフォルダを開くアクションを作成しておくと、非常にファイル確認が楽になります
なくても良いけど、あるとすごく便利なアクションです

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

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

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

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