【Power Automate Desktop】特定のフォルダとそのサブフォルダ(任意の複数階層)をコピーする

1.やりたいこと

みなさん、自身のPCのフォルダはどのように管理しているでしょうか。

私は下図のように会計年度毎に各項目に分けてフォルダ管理することが多いのですが、これまでは当年度が終わる前に翌年度用のフォルダをまた一から作り直していました。よくよく考えたらこれはすごく無駄な作業だと思います。かといって、当年度のフォルダをまるまるコピーするとその中のすべてのドキュメントもコピーされてしまい、時間をかけてコピーした後にファイルを削除するというかなりの手間が掛かってしまいます。はじめから数年分の空フォルダを作っておいても1年の間でフォルダ体系は変わってしまいます。

そこで、今回PADを使って同じ体系のままフォルダのみをコピーする仕組みを考えてみました。

f:id:shusoshin:20210708134447g:plain

長くなりますので、全体の流れとポイントを要約したものを下図にまとめました。

f:id:shusoshin:20210708134455g:plain

 

2.実践① フロー作成 ~ 新しいフォルダの作成

トップ画面から、新しいフローをクリックします。

f:id:shusoshin:20210708134501g:plain

任意の名前を付けて作成ボタンをクリックします。

f:id:shusoshin:20210708134508g:plain

画面左のアクション一覧からフォルダ→特別なフォルダーを取得 をダブルクリック(又は真ん中のフロー詳細へドラッグ&ドロップ)します。このアクションは以降のファイル選択等の際に「初期フォルダ」を設定するために変数化しておくものです。

f:id:shusoshin:20210708134515g:plain

ここでは、特別なフォルダ―の名前: デスクトップ を選択します。特別なフォルダーのパス:は自身のデスクトップのパスが自動設定されます。生成された変数はデフォルトの SpecialFolderPath のままとし、保存します。

f:id:shusoshin:20210708134521g:plain

【コピー対象フォルダを選択をするためのダイアログ設定】

アクション一覧 → メッセージボックス → ファイルの選択ダイアログを表示 をダブルクリックします。

f:id:shusoshin:20210708134527g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134534g:plain

ダイアログの説明: コピー対象のフォルダを選択(任意のテキスト)

初期フォルダ:%SpecialFolderPath% (右端の{X}をクリックし、変数名を選択)

フォルダ―選択ダイアログを常に手前に表示する:オン

 

生成された変数:デフォルトの SelectedFolder を CopyFolder に変更します。変数名は後続の処理を考慮して極力わかりやすい名前にしておいた方がよいです。変数ButtonPressedは今回特に使用しませんのでデフォルトのままとします。

 

【コピー対象フォルダのサブフォルダ(1階層目)のフォルダを取得】

アクション一覧 → フォルダ― → フォルダ―内のサブフォルダーを取得 をダブルクリックします。

f:id:shusoshin:20210708134539g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134543g:plain

フォルダ―:%CopyFolder% (右端の{X}をクリックし、変数名を選択)

フォルダ―フィルター:*(デフォルトのまま)

サブフォルダーを含める:オフ

※ここをオンにしてしまうと、1階層目に2階層目以降のフォルダが含まれてしまうため、必ずオフにする必要があります。

生成された変数:SubFolders に変更します。

 

【コピー階層選択用のリストを設定】

アクション一覧 → 変数 → {x}変数の設定 をダブルクリックします。

f:id:shusoshin:20210708134549g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134553g:plain

設定: SelectList (任意の変数名)

宛先: %[3,2,1]%  と入力。

 変数をリストにする場合は、値を [] で括り ,  で区切る必要があります。リストの順は%[1,2,3]%でもよいのですが、使用頻度を考慮して今回は降順にしています。

 

【コピー階層選択用のリストダイアログを設定】

アクション一覧 → メッセージボックス → リストから選択ダイアログを表示 をダブルクリックします。

f:id:shusoshin:20210708134557g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134602g:plain

ダイアログのタイトル:コピー対象フォルダの階層数選択(任意)

ダイアログメッセージ:コピー対象フォルダに含まれるサブフォルダのうち、何階層目までをコピーするか選択してください。(1~3) (任意)

選択元のリスト: %SelectList% (右端の{X}をクリックし、変数名を選択)

選択ダイアログを常に手前に表示する:オン

リストに制限:オン

空の選択を許可:オフ

複数の選択を許可:オフ

生成された変数: SelectedItem(デフォルトのまま)、SelectedIndex と ButtonPressed3は今回使用しないためこちらもデフォルトのままで結構です。

 

【新規コピー先のフォルダ名の入力ダイアログ設定】

アクション一覧 → メッセージボックス → 入力ダイアログを表示 をダブルクリックします。

f:id:shusoshin:20210708134607g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134615g:plain

入力ダイアログのタイトル:コピー先のフォルダ名を入力(任意)

入力ダイアログメッセージ:ブランク(必要に応じて任意入力)

規定値:ブランク

入力の種類: 1行(デフォルトのまま)

入力ダイアログを常に手前に表示する:オン

生成された変数 NewFolderName に変更します。ButtonPressed2は今回使用しない為デフォルトのままで結構です。

 

【新規コピー先のフォルダの作成】

アクション一覧 → フォルダー → フォルダ―の作成 をダブルクリックします。

f:id:shusoshin:20210708134621g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134627g:plain

新しいフォルダーを次の場所に作成:%CopyFolder.Parent% と入力。

※プロパティ「.Parent」を使用します。これにより、CopyFolder の親フォルダ、つまり、コピー元フォルダと同じ場所に新しいフォルダーが作成されることになります。

新しいフォルダー名: %NewFolderName %(右端の{X}をクリックし、変数名を選択)

 

ここまでで作成したフローは下図の通りとなります。

f:id:shusoshin:20210708134634g:plain

 

3.実践② Switch条件の設定 ~ 各階層サブフォルダの作成ループ処理

 ここから各階層ごとにフォルダのコピーを行う設定をしていきます。

【コピー階層の選択結果に応じた条件の設定】

恐らく If条件でも設定できると思いますが、折角なのでSwitch条件を使ってみました。ExcelのSwitch関数と同じ考え方だと思います。

 

アクション一覧 → 条件 → Switch をダブルクリックします。

f:id:shusoshin:20210708134640g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134646g:plain

チェックする値:%SelectedItem%(右端の{X}をクリックし選択)

 

【コピー階層選択が3(階層)の場合を設定】

アクション一覧 → 条件 → Case をダブルクリックします。

f:id:shusoshin:20210708134653g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134703g:plain

演算子: と等しい(=) を選択

比較する値: 3 を入力

 

【フォルダ作成(1階層目)のループ処理】

アクション一覧 → ループ → For each をダブルクリックします。

f:id:shusoshin:20210708134708g:plain

変数SubFoldersを変数CurrentItemに入れ、CurrentItemの数分フォルダのコピーを繰り返します。

下図の通り入力し保存します。

f:id:shusoshin:20210708134713g:plain

反復処理を行う値: %SubFolders% (右端の{X}をクリックし選択)

生成された変数: CurrentItem (デフォルトのまま)

 

【1階層目処理を示すコメントを設定】

任意ですが、後続の処理でわかりやすいようにコメントを入れておきます。

アクション一覧 → フリーコントロール → コメント をダブルクリックします。

f:id:shusoshin:20210708134720g:plain

コメント:任意のコメントを入力し保存します。

f:id:shusoshin:20210708134727g:plain

【新規フォルダにサブフォルダ(1階層目)をコピーするためのフォルダ名取得】

アクション一覧 → テキスト → テキストを置換する をダブルクリックします。

f:id:shusoshin:20210708134732g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134736g:plain

解析するテキスト:%CurrentItem%  (右端の{X}をクリックし選択)

検索するテキスト:%CopyFolder%  (右端の{X}をクリックし選択)

検索と置換に正規表現を使う:オフ

大文字と小文字を区別しない:オフ

置き換え先のテキスト: %''% を入力

※ブランクに置き換えたいのですが、ここをブランクにするとエラーとなるので、このように%’’%(シングルクオーテーション2つ)を入力します。

生成された変数: NewSubFolderName に変更します。

 

以下、実際に最初に変数に入る値を例として補足します。

① 解析するテキスト:CurrentItem → C:\Desktop\2020年度\00_日時関係

② 検索するテキスト:CopyFolder  → C:\Desktop\2020年度

③ ①の中の②をブランクにする。  → \00_日時関係

となります。ただ、このままだと頭に余計な \ が残ってしまうので次のアクションで取り除きます。

 

再び、アクション一覧 → テキスト → テキストを置換する をダブルクリックします。

f:id:shusoshin:20210708134741g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134748g:plain

解析するテキスト:%NewSubFolderName%  (右端の{X}をクリックし選択)

検索するテキスト: \  

検索と置換に正規表現を使う:オフ

大文字と小文字を区別しない:オフ

置き換え先のテキスト: %''% を入力

生成された変数: NewSubFolderName として変数を上書きします。

 

【 新規フォルダにサブフォルダ(1階層目)を作成】

アクション一覧 → フォルダー → フォルダ―の作成 をダブルクリックします。

f:id:shusoshin:20210708134756g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134800g:plain

新しいフォルダを次の場所に作成:%Newfolder% (右端の{X}をクリックし選択)

新しいフォルダ名: %NewSubFolderName%  (右端の{X}をクリックし選択)

生成された変数: NewSubfolder に変更します。

 

【2階層目処理を示すコメントを設定】

任意ですが、後続の処理でわかりやすいようにコメントを入れておきます。

アクション一覧 → フリーコントロール → コメント をダブルクリックします。

 f:id:shusoshin:20210708134804g:plain

コメント:任意のコメントを入力し保存します。

f:id:shusoshin:20210708134809g:plain

【1階層目のサブフォルダ(2階層目)を取得】

アクション一覧 → フォルダ― → フォルダ―内のサブフォルダーを取得 をダブルクリックします。

f:id:shusoshin:20210708134815g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134819g:plain

フォルダ―: %CurrentItem%  (右端の{X}をクリックし選択)

フォルダ―フィルター:*(デフォルトのまま)

サブフォルダーを含める:オフ

生成された変数: SubFolders2 に変更します。

 

前述の例だとこのCurrentItemは  C:\Desktop\2020年度\00_日時関係

となります。つまり、00_日時関係 のサブフォルダ(2階層目)が取得されることになります。

 

【フォルダ作成(2階層目)のループ処理】

アクション一覧 → ループ → For each をダブルクリックします。

f:id:shusoshin:20210708134708g:plain

変数SubFolders2を変数CurrentItem2に入れ、CurrentItem2の数分フォルダのコピーを繰り返します。

下図の通り入力し保存します。

f:id:shusoshin:20210708134828g:plain

反復処理を行う値: %SubFolders2% (右端の{X}をクリックし選択)

生成された変数: CurrentItem2 (デフォルトのまま)

 

【新規フォルダのサブフォルダ(1階層目)にサブフォルダ(2階層目)をコピーするためのフォルダ名取得】

アクション一覧 → テキスト → テキストを置換する をダブルクリックします。

f:id:shusoshin:20210708134832g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134836g:plain

解析するテキスト:%CurrentItem2%  (右端の{X}をクリックし選択)

検索するテキスト:%CurrentItem%  (右端の{X}をクリックし選択)

検索と置換に正規表現を使う:オフ

大文字と小文字を区別しない:オフ

置き換え先のテキスト: %''% を入力

生成された変数: NewSubFolderName2 に変更します。

 

以下、前述と同様に実際に最初に変数に入る値を例として補足します。

①解析するテキスト:CurrentItem2→C:\Desktop\2020年度\00_日時関係\00_未処理事項

②検索するテキスト:CurrentItem → C:\Desktop\2020年度\00_日時関係

③ ①の中の②をブランクにする。  → \00_未処理事項

となります。ただ、このままだと頭に余計な \ が残ってしまうので次のアクションで取り除きます。

 

再び、アクション一覧 → テキスト → テキストを置換する をダブルクリックします。

f:id:shusoshin:20210708134841g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134845g:plain

解析するテキスト:%NewSubFolderName2%  (右端の{X}をクリックし選択)

検索するテキスト: \  

検索と置換に正規表現を使う:オフ

大文字と小文字を区別しない:オフ

置き換え先のテキスト: %''% を入力

生成された変数: NewSubFolderName2 として変数を上書きします。

 

1階層目の時はこの置換まででうまくいったのですが、2階層目以降はこの置換までで実行するとなぜか余計な空白が含まれた状態となってしまい実行時エラーとなります。そのため、次のトリミング処理を追加します。

 アクション一覧 → テキスト → テキストのトリミング をダブルクリックします。

f:id:shusoshin:20210708134900g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134909g:plain

トリミングするテキスト: %NewSubFolderName2%  (右端の{X}をクリックし選択)

トリミング対象: 先頭と末尾の空白文字 を選択します。

 

【 新規フォルダにサブフォルダ(2階層目)を作成】

アクション一覧 → フォルダー → フォルダ―の作成 をダブルクリックします。

f:id:shusoshin:20210708134756g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708134918g:plain

新しいフォルダを次の場所に作成:%NewSubfolder% (右端の{X}をクリックし選択)

新しいフォルダ名: %NewSubFolderName2%  (右端の{X}をクリックし選択)

生成された変数: NewSubfolder2 に変更します。

 

ここからは3階層目の設定になりますが、2階層目の設定と同じ内容となりますので画面のみの貼り付けとし、説明は省略します。

f:id:shusoshin:20210708134922g:plain

f:id:shusoshin:20210708134927g:plain

f:id:shusoshin:20210708134931g:plain

f:id:shusoshin:20210708134936g:plain

f:id:shusoshin:20210708134944g:plain

f:id:shusoshin:20210708134949g:plain

f:id:shusoshin:20210708134955g:plain

f:id:shusoshin:20210708135000g:plain

f:id:shusoshin:20210708135006g:plain

f:id:shusoshin:20210708135011g:plain

f:id:shusoshin:20210708135019g:plain

f:id:shusoshin:20210708135024g:plain

f:id:shusoshin:20210708135028g:plain

f:id:shusoshin:20210708135032g:plain

ここまでで3階層目のフォルダコピー処理が完了です。ここで設定したフローは以下の通りです。

f:id:shusoshin:20210708135039g:plain

 

4.実践③ コピー階層の選択2と1の場合(それぞれサブフローを設定)

 次に最初のコピー階層の選択で2、1を選択した場合の分岐処理を設定していきます。単純にそれぞれのケース毎に先ほどのアクションを減らしたものを追加してもよいのですがフロー全体がかなり長くなってきたこともありますので、それぞれのケース毎にサブフローを設定することにします。

【コピー階層選択が2(階層)の場合を設定】

アクション一覧 → 条件 → Case をダブルクリックします。

f:id:shusoshin:20210708135046g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708135051g:plain

演算子: と等しい(=)  を選択。

比較する値: 2 を入力。

 

 

次に画面上の サブフロー をクリックします。

f:id:shusoshin:20210708135100g:plain

+ 新しいサブフローをクリックします。

f:id:shusoshin:20210708135106g:plain

任意のサブフロー名を入力し保存します。

今回は、Subflow_1_Case_2 とします。

f:id:shusoshin:20210708135111g:plain

Mainフロータブの隣に新しいサブフロータブが作成されました。

f:id:shusoshin:20210708135115g:plain

次に一旦Mainフローに戻り、下図の通りCase3の次の For eachアクションからCase2の前のEndまでを選択し、Ctrl+C(又は右クリックでコピーを選択)でコピーします。

f:id:shusoshin:20210708135122g:plain

サブフロータブをクリックし、Ctrl+V(又は右クリック→貼り付け)で貼り付けます。

f:id:shusoshin:20210708215232g:plain


コメント(3階層目)から次のEndまでは不要となりますので下図の通り選択し削除します。

f:id:shusoshin:20210708135137g:plain

 

Subflow_1_Case_2 はこれで完了です。下図の通りのフローとなります。

f:id:shusoshin:20210708135143g:plain

再び、Mainフローに戻ります。Case2の下に作成したサブフローの実行を設定します。

f:id:shusoshin:20210708135149g:plain

アクション一覧 → フリーコントロール → サブフローの実行 をダブルクリックします。

f:id:shusoshin:20210708135154g:plain

Subflow_1_Case_2 を選択し保存します。

f:id:shusoshin:20210708135159g:plain

Case2の下にサブフローの実行が設定されました。

f:id:shusoshin:20210708135204g:plain

【コピー階層選択が1(階層)の場合を設定】

アクション一覧 → 条件 → Case をダブルクリックします。

f:id:shusoshin:20210708135209g:plain

下図の通り入力し保存します。

f:id:shusoshin:20210708135214g:plain

演算子: と等しい(=)  を選択。

比較する値: 1 を入力。

 

この後のサブフローの設定は先ほどほぼ同じで、最後に削除する部分が増えるだけですので説明は省略します。

Subflow_1_Case_1 のフローは下図の通りとなります。

f:id:shusoshin:20210708135218g:plain

Mainフローの末尾は次の通りとなります。

f:id:shusoshin:20210708135223g:plain

 

これですべてのフローの設定は完了となります。設定したMainフロー全体は下図の通りです。

f:id:shusoshin:20210708135227g:plain

 

5.フローの実行/確認

【フローの実行】

詳細設定画面から実行するとデバッグモードで実行され時間が掛かる為、作成したフローを一旦保存後に閉じて、トップ画面から実行します。

f:id:shusoshin:20210708135234g:plain

コピー対象フォルダ選択ダイアログが表示されるので対象フォルダを選択し、OKをクリックします。

f:id:shusoshin:20210708135238g:plain

次にコピー対象フォルダの階層数選択ダイアログが表示されます。今回は3を選択し、OKをクリックします。

f:id:shusoshin:20210708135244g:plain

続いて、コピー先のフォルダ名入力ダイアログが表示されるので、任意の名称を入力しOKをクリックします。今回は 2021年度 とします。

f:id:shusoshin:20210708135249g:plain

その後、コピー処理が実行されます。わずか2秒で完了しました。

f:id:shusoshin:20210708135254g:plain

 

【結果の確認】

コピー元のフォルダ 「2020年度」と同じ場所に「2021年度」が作成されました。

f:id:shusoshin:20210708135258g:plain

 

ドリルダウンしてみると、1階層目のフォルダが作成されています。

更に1階層目の「00_日時処理」をドリルダウンします。

f:id:shusoshin:20210708202157g:plain

 

2階層目のフォルダも作成されています。

更に2階層目の「00_未処理事項」をドリルダウンします。

f:id:shusoshin:20210708202207g:plain

 

3階層目のフォルダまできちんと作成されたことが確認できました。

f:id:shusoshin:20210708202217g:plain

以上となります。