Docly Child

月末日または隔週でワークフローを自動実行する

2049 views

この記事では、月末日や隔週でワークフローを自動実行する方法を紹介します。

【できるようになること】

  • 月末日に任意のワークフローを自動実行する(うるう年含む)
  • 隔週でワークフローを自動実行する

※「最終営業日」と「月の末日」が異なる場合は、こちらの記事をご参照ください


スケジュール設定の基本について

スケジュール設定の基本についてはこちらの記事をご参照ください

 月末日のスケジュール設定例

スケジュール設定画面の「何日?」の部分に L と入力することで、月末日を指定することができます。
※閏年も対応可能です。

 隔週や特定週にワークフローを実行する

隔週でワークフローを実行する方法は、以下3つとなります。

  1. スケジュール設定画面で、2週間に1回の実行となるcronを登録する
  2. ワークフロー内で、月内の第何週かを判定する
  3. 予めGoogleCalendarにワークフローの実行予定日を隔週登録しておいて、それをワークフロー内で読み取る
    (特に曜日等が不規則な場合)

この記事内では、1,2について解説します。
3については以下記事をご参照ください。

参考:最終営業日にワークフローを実行する

 1. 2週間に1回実行するスケジュールを登録

cronの実行日の範囲を絞ることで、「2週間に1回」の実行が可能となります。
この方法では、年初(1月第一週)から見て現在が奇数週なのか、偶数週なのかを判定することにより、2週間に1回の実行を実現しています。

例:年内奇数週の水曜、17:45に実行

45 17 1-7,15-21,29-31 * WED

例:年内偶数週の水曜、17:45に実行

45 17 8-14,22-28 * WED

 2. 月内の第何週かを判定する

AUTOROのスケジュール設定画面のcronでは、月内の第何週か(第3週の水曜など)を判定することができません。

よって、例えば「月内の第3週の金曜日にのみ実行したい」といった場合は、ワークフローの内部で「今は今月の第何週か?」を判定する必要があります。

以下に、月内の奇数週(第1, 第3, 第5)の金曜を判定する例を紹介します。

まずは、スケジュールのcronに「毎週金曜」に実行するスケジュールを登録します。

  • スケジュール画面から「追加」をクリックします
  • 任意の時間帯を入力します。
  • 曜日は、FRIにのみチェックを入れます。

AUTOROのスケジュール設定画面内のcronによる月内週数指定ができない以上、毎週金曜に実行されるワークフローの一番最初の部分で「今日は月内の第何週か?」を判定する形になります。

今現在が月内の第何週かは、以下の式で求まります。

年初から見た現在の週番号 - 年初から見た現在の月の月初の週番号 + 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}

※剰余演算で使用する算術演算子は%となります。

参考:条件式の作成

参考:比較演算子/論理演算子

参考(外部リンク):式と演算子 – JavaScript | MDN

# 日時を取得_現在は年内の第何週か
+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

<スケジュール>月末

このページは役に立ちましたか?