待機時間を制御する全体のフローの作成
サブフローができたので、ここからは新たにメインフローを作成し、前節で作成したサブフローを指定した時刻で繰り返し呼び出します。
以下の内容のテキストファイルをドキュメントフォルダーの直下に[ScheduleFlow.json]という名前で保存します。先頭から
- 別フロー実行時刻
- 終了時刻
- 実行の間隔(分)
を表すものとします。開始時刻はフローの実行開始予定より後にしてください。終了時刻は、開始時刻+間隔より後にしてください。
以下の例では、4/25 23:00から4/26 23:00までの間5分ごとに別のフロー(BrowserShotFlow)を呼び出す設定例です。フローができていない段階では、仮の値を記載しておき、完成して実行直前に適切な時刻を設定することにしましょう。
{ "TimeOfNextRun": "2023/04/25 23:00", "TimeOfEnd": "2023/04/26 23:00", "WaitingMin": 5 }
[1]新しいフローを作成する
Power Automate for desktopを開きます。トップ画面から[+新しいフロー]をクリックして、適当な名前(ここでは「ScheduledFlow」)で新規のフローを作成します。
[2]設定ファイルのあるドキュメントフォルダーパスを取得する
[フォルダー]アクショングループから[特別なフォルダーを取得]アクションを配置します。
以下の入力/選択をして保存します。
- 特別なフォルダーの名前:ドキュメント
- 生成された変数:%Documents%
[3]設定ファイルを読み込む
[ファイル]アクショングループから[ファイルからテキストを読み取る]アクションを配置します。
以下の入力/選択をして保存します。
- ファイルパス:%Documents%\ScheduleFlow.json
- エンコード:UTF-8(既定値)
[4]設定内容をカスタムオブジェクトにする
[変数]アクショングループから[JSONをカスタムオブジェクトに変換]アクションを配置します。
以下の入力をして保存します。
- JSON:%FileContents%
- 生成された変数:%Setting%
[5]次の実行時刻を変数に設定
同様に[変数]アクショングループから[変数の設定]アクションを配置します。
以下の入力をして保存します。
- 変数:%TimeOfNextRun%
- 値:%Setting.TimeOfNextRun%
[6]終了時刻を変数に設定
同様に[変数]アクショングループから[変数の設定]アクションを配置します。以下の入力をして保存します。
- 変数:%TimeOfEnd%
- 値:%Setting.TimeOfEnd%
[7]待機時間(分)を変数に設定
同様に[変数]アクショングループから[変数の設定]アクションを配置します。以下の入力をして保存します。
- 変数:%WaitingMin%
- 値:%Setting.WaitingMin%
[8]終了時間と次の実行時間の差を取得する
[日時]アクショングループから[日付の減算]アクションを配置します。
以下の入力をして保存します。
- 元となる日付:%TimeOfEnd%
- 日付の減算:%TimeOfNextRun%
- 差異を次の単位で取得:秒
- 生成された変数:%Period%
[9]ループする
[ループ]アクショングループから[ループ条件]アクションを配置します。
以下の入力をして保存します。
- 最初のオペランド:%Period%
- 演算子:より大きい(>)
- 2番目のオペランド:0
[10]現在日時を取得する
[日時]アクショングループから[現在の日時を取得]アクションをループの中に配置します。
以下の入力をして保存します。
- 生成された変数:%Now%
[11]次の実行時刻と現在の差を取得する
[日時]アクショングループから[日付の減算]アクションをループの中に配置します。
以下の入力をして保存します。
- 元となる日付:%TimeOfNextRun%
- 日付の減算:%Now%
- 差異を次の単位で取得:秒
[12]次の実行時刻まで待機する
[フローコントロール]アクショングループから[Wait]アクションをループの中に配置します。
以下の入力をして保存します。
- 期間:%TimeDifference%
[13]他のデスクトップフローを呼び出す
[フローを実行する]アクショングループから[Desktopフローを実行]アクションを配置します。
以下の選択をして保存します。(前節作成したフロー)
- Desktopフロー:BrowserShotFlow
[注意]
ここで前節で作成したフローが表示されない場合は冒頭の[注意]の後半を参照して、そのフローを開きコードをコピーして保存して作成し、このアクションで表示されるか確認してください。
[14]次の実行時刻を計算する
[日時]アクショングループから[加算する日時]アクションをループの中に配置します。
次の実行時刻を計算します。
以下の入力をして保存します。
- 日時:%TimeOfNextRun%
- 加算:%WaitingMin%
- 時間単位:分
- 生成された変数:%TimeOfNextRun%
[15]終了判定のために終了時間と次の実行時間の差を取得する
ループの前の[8]で配置した[日付の減算](終了時刻-次の実行時刻)アクションをコピーして、貼り付けるとすぐ下にコピーされるので、ループの中の最後に移動します。
ループの処理が複雑になってきたので、ここで補足しておきます。
- 変数Periodには(終了時刻)-(次の実行時刻)の秒数が入っていて、値が正である(つまり次の実行時間が終了時刻より前である)限りループを実行します。0以下になった場合ループを終了します。
- 次の実行時刻までフローを一時停止するため、(次の実行時刻)-(現在時刻)の秒数を変数TimeDifferenceに取得します。
- [Wait]アクションでTimeDifference秒待機します。
- 時刻が(次の実行時刻)になっているはずなので、別フローを実行します。
- (次の実行時刻)に指定の待機時間を加算して新しい(次の実行時刻)とします。
- ループ条件で使用するため、(終了時刻)-(次の実行時刻)を計算して、変数Periodに格納し、1に戻ります。
上述の設定例の場合、23:00、23:05、23:10、…に別フローが呼び出されます。
[16]実行する
最後に、メインフローを実行してみましょう。実行に際しては、ScheduleFlow.jsonの内容が「(現在時刻)<(最初の実行時刻)<(終了時刻)-(間隔)」となっていることを確認してください。
上のように、指定時間の範囲で動画のキャプチャが複数記録されていれば成功です。
指定時間で処理を実行するフローは以下のようなバリエーションが考えられます。
- 開始時刻(最初の実行時刻)の値に現在日時をフロー内で設定する→設定に開始時刻は不要。
- 停止ボタンで停めるまで実行する前提で、常に真となるループ条件を設定して無限ループにする→設定に終了時刻は不要。
- 設定ファイルをループの中で実行直前に読み込むようにする→各設定値を全体の実行開始後に変更可能。
- 繰り返しの実行時刻を一定間隔ではなく、時刻のリストの設定から読み取るようにする。
- 一定の間隔で実行するだけで「時刻」が重要でない場合は、実行前の[Wait]アクションのみする→フローが単純化。
まとめ
Power Automate for desktopでループと待機のあるフローから、他のフローを呼び出すことで、指定時刻と間隔でアクションを実行するフローをデザインしました。呼び出されるフローの他の例としては、第9回「データ登録を自動化する」のGmailの受信メールを取得してDBのテーブルに登録するフローなどが考えられます。また、定期的にフォルダーをチェックして、ファイルが追加されたら処理を行うフローを実行するなどといったことも考えられます。