月末日または隔週でワークフローを自動実行する
この記事では、月末日や隔週でワークフローを自動実行する方法を紹介します。
【できるようになること】
- 月末日に任意のワークフローを自動実行する(うるう年含む)
- 隔週でワークフローを自動実行する
※「最終営業日」と「月の末日」が異なる場合は、こちらの記事をご参照ください
スケジュール設定の基本についてはこちらの記事をご参照ください
月末日のスケジュール設定例
隔週や特定週にワークフローを実行する
隔週でワークフローを実行する方法は、以下3つとなります。
- スケジュール設定画面で、2週間に1回の実行となるcronを登録する
- ワークフロー内で、月内の第何週かを判定する
- 予めGoogleCalendarにワークフローの実行予定日を隔週登録しておいて、それをワークフロー内で読み取る
(特に曜日等が不規則な場合)
この記事内では、1,2について解説します。
3については以下記事をご参照ください。
1. 2週間に1回実行するスケジュールを登録
2. 月内の第何週かを判定する
AUTOROのスケジュール設定画面のcronでは、月内の第何週か(第3週の水曜など)を判定することができません。
よって、例えば「月内の第3週の金曜日にのみ実行したい」といった場合は、ワークフローの内部で「今は今月の第何週か?」を判定する必要があります。
以下に、月内の奇数週(第1, 第3, 第5)の金曜を判定する例を紹介します。
今現在が月内の第何週かは、以下の式で求まります。
年初から見た現在の週番号 - 年初から見た現在の月の月初の週番号 + 1
これをワークフローに指定していきます。
- 実行対象ワークフローの一番上に、日時を取得(GetTime)を設定します。
- フォーマットを「w」とします
- 変数に保存を追加します。
- 名前はcurrentWeekNumとします
- 値は直上のGetTimeのアウトプットとします
- GetTimeを1つ追加します。
- フォーマットを「w」とします
- startEndOptionを「月初」にします
- 変数に保存を追加します。
- 名前はcurrentMonthStartWeekNumとします
- 値は追加したGetTimeのアウトプットとします
奇数週の場合にのみ後続の処理を実行するための条件分岐を設定します
- IF(条件分岐)を設定します。
- 以下の条件式を入力します。これは月内の奇数週にのみtrueとなります
${(currentWeekNum - currentMonthStartWeekNum + 1) % 2 !== 0}
- IFの範囲内に、後続する処理を埋め込みます。これにより、月内奇数週n場合にのみ後続の処理が実行されるようになります。
※IFの範囲内に各アクションを移動する際の操作方法
アクションカードをドラッグアンドドロップすることで、IFの範囲内にアクションを移動できます。
しかし、移動するアクション数が大量にある場合は、ドラッグアンドドロップによる操作は非常に面倒です。
このような場合は、以下の手順をお試しください
- エディタモードをONにします
- IFの中に入れたいアクションの範囲をすべて選択します
- キーボードのTabキーを2回押します。
- エディタモードをOFFにしてワークフローを確認、保存します。
※IFの条件を「偶数週ならワークフローを強制終了する」に変更する際の操作方法
アクションの移動の手間を省く手段として、条件を「偶数週ならワークフローを強制終了する」に変更する方法もあります。方法は以下です。
- 条件式を以下に変更します(前の逆です)
${(currentWeekNum - currentMonthStartWeekNum + 1) % 2 === 0}
- IFの範囲内にKillAttempt(強制終了)を設定します
- 任意:KillAttemptの終了メッセージに「偶数週のため強制終了」などの文言を入れておきます。
ただし、この設定を適用するとセッションログがエラー扱いとなります。
あとからエラーログを検索/管理する場合などに面倒が発生する場合があるので、ご注意ください。
現在の月内週番号を2で割った数の余り(剰余)が0なら偶数週、0でなければ奇数週となります。
上で紹介した条件式は、現在の週番号が0でなければtrueとなります。
${現在の月内週番号 % 2 !== 0}
※剰余演算で使用する算術演算子は%
となります。
# 日時を取得_現在は年内の第何週か +get_time_weekNum: action>: GetTime format: w timezone: 'Asia/Tokyo' relativeTime: number: '' unit: '' preposition: '' startEndOption: '' private: false # 変数に保存_年内第何週 +store_value_currentWeekNum: action>: StoreValue key: currentWeekNum value: +get_time_weekNum private: false # 日時を取得_現在の月の月初は年内の第何週か +get_time_weekNum_month: action>: GetTime format: w timezone: 'Asia/Tokyo' relativeTime: number: '' unit: '' preposition: '' startEndOption: startOfMonth private: false # 変数に保存 +store_value_currentMonthStartWeekNum: action>: StoreValue key: currentMonthStartWeekNum value: +get_time_weekNum_month private: false # テキストを作成_確認用 +text_console_log_weeknum: action>: Text text: "今日は${moment().utcOffset(540).format('MM月')}の第${currentWeekNum - currentMonthStartWeekNum + 1}週です" private: false # 真のとき_奇数週なら続行 +if_isOddWeek: if>: ${(currentWeekNum - currentMonthStartWeekNum + 1) % 2 !== 0} _do: # テキストを作成 +text_x: action>: Text text: 'ここに奇数週の処理' private: false
# 日時を取得_現在は年内の第何週か +get_time_weekNum: action>: GetTime format: w timezone: 'Asia/Tokyo' relativeTime: number: '' unit: '' preposition: '' startEndOption: '' private: false # 変数に保存_年内第何週 +store_value_currentWeekNum: action>: StoreValue key: currentWeekNum value: +get_time_weekNum private: false # 日時を取得_現在の月の月初は年内の第何週か +get_time_weekNum_month: action>: GetTime format: w timezone: 'Asia/Tokyo' relativeTime: number: '' unit: '' preposition: '' startEndOption: startOfMonth private: false # 変数に保存 +store_value_currentMonthStartWeekNum: action>: StoreValue key: currentMonthStartWeekNum value: +get_time_weekNum_month private: false # テキストを作成_確認用 +text_console_log_weeknum: action>: Text text: "今日は${moment().utcOffset(540).format('MM月')}の第${currentWeekNum - currentMonthStartWeekNum + 1}週です" private: false # 真のとき_偶数週なら終了 +if_isOddWeek: if>: ${(currentWeekNum - currentMonthStartWeekNum + 1) % 2 === 0} _do: # 強制終了 +kill_attempt_1: action>: KillAttempt message: '偶数週なので終了します' private: false