はじめに
こちらの記事はカスタマイズの難易度が高いものとなっております。
具体的には、本記事ではJob Runnerを用いたカスタマイズとしては一般的でないループ処理をJob Runner上で実現し、これを使って処理を実現しているためループに関する設定に誤りがあると、容易に無限ループが発生します。
ですので、この記事で説明しているカスタマイズをアレンジして用いたい場合は、記事をよく読み、記事通りにカスタマイズを作成してその通りに動く事を確認し、内容をよくご理解いただいた後に、具体的なカスタマイズ作成に移るようにしてください。
指定した期間のレコードをまとめて作成したい場合、やること「日付の範囲からレコードを追加する」を使って頂くと、1日につき1レコードという形でレコードを作成することはできます。
ただ現在(2024年9月3日時点)では、1ヶ月につき1レコードを作成する「やること」はないため、今回の記事ではこれをカスタマイズで実現します。
今回のカスタマイズの例
次のように、1ヶ月につき1レコードを作成できます。
kintoneアプリの構成と設定
今回は、下記の2つのアプリを使用します。
レコード作成範囲の日付アプリ
レコードを作成したい月の範囲を指定するための、「開始日付」「終了日付」というフィールドをもつアプリです。
フィールドに値を入力する際は、日は常に「1日」を指定するようにしておきます。
kintone アプリのカスタマイズで、やること「年月選択フィールドを作成する」を使用すると常に日は1日になるため、このカスタマイズと組み合わせて使用すると日を意識せずに入力できます。
また、定期実行アプリでカスタマイズを行うので、APIトークンをアクセス権「レコード閲覧」で設定しておきます。
レコード作成範囲アプリ
こちらが、ひと月ごとのレコードを作成するアプリです。
今回はシンプルに、日付フィールドを一つだけ配置しています。
また、このアプリも定期実行アプリでカスタマイズを行いますが、このアプリについてはレコード追加も伴うので、APIトークンをアクセス権「レコード閲覧」「レコード追加」で設定しておきます。
カスタマイズ
Job Runner の定期実行タスクのカスタマイズを作成します。
Job Runnerのカスタマイズが初めての方は、下記のページもご覧ください。
Job Runnerを利用するとき、初めにすること : ジョブへのスロット割り当てについて
はじめての gusuku Customine Job Runner : 年齢計算のカスタマイズ
接続設定
まずは、やること「kintone 接続設定を行う」で、今回利用する2つのアプリに対して接続設定します。
kintone アプリのAPIトークンのアクセス権の設定は、レコード作成範囲の日付アプリはレコード閲覧のみ、レコード作成範囲アプリはレコード閲覧とレコード追加の権限を指定しておきます。
カスタマイズの起点となるアクションの条件は「実行予定時刻になった時」、続くアクションの条件は「他のアクションの実行が完了した時」を指定して繋げておきます。
元になるレコードの取得
次に、レコード作成範囲の日付アプリから、開始日時と終了日時の値が入ったレコードを取得します。
今回はやること「キーを指定してレコードを取得する」でレコード番号をキーにレコードを取得していますが、適宜適切なやることやキーに読み替えてください。
ここでポイントになるのが条件です。
「いずれかのアクションの実行が完了した時」で、アクション番号2、5、8を指定しています。
2についてはkintone接続設定を行っているアクションですが、5、8については後で出てくる後続のアクションです。
後続のアクションが完了したとき、ふたたびこのアクションに戻る、という設定を行う事で、”条件が満たされる間処理を繰り返す”ことができます。
一連のカスタマイズの最後に表示しているアクショングラフも確認してみてください。
なお、このような繰り返し処理は条件を誤ると処理が適切に終了せず、
Job Runnerの実行時間上限15分に到達するまで処理を繰り返すような動きとなります。
APIリクエスト数の消費が大幅に増加してしまう事もあり得る為、条件は慎重に設定ください。
既存のレコードを取得
次に、レコード作成威範囲アプリ(実際にレコードを追加するアプリ)から、日付フィールドの値が開始日付から終了日付内の値をもつ既存のレコードを取得します。
やること「条件を組み立ててレコードを取得する」、条件「レコード1行が準備できた時」を使います。
検索条件の条件ビルダーは次のようになります。
レコードを追加する(レコードが0件だった場合の処理)
開始日付と終了日付の範囲でレコードを取得した結果、レコードが0件だった場合はまだレコードが1件も作成されていない状態なので、開始日付をセットしたレコードを追加します。
やること「レコードを追加する」、条件「他のアクションの実行が完了した時」、「レコード件数が0件ならば」を使います。
ここでポイントになるのが、パラメーター「即時反映するかどうか」です。
「即時反映するかどうか」は、原則としては特に理由がなければ「即時反映しない」で使用いただくと、ある程度まとめてレコードが処理されるようになるため、kintone への APIリクエスト数が少なく済み、処理速度も向上するためお勧めです。
ただ今回は、kintone上にレコードがある・ないで処理を行うかどうかを決めるため、
アクションが実行された時点でレコードをkintoneに即時追加してほしい事から、本パラメーターでは「即時反映する」を選択しています。
また通常Job Runnerのカスタマイズでは、レコードを取得するアクションの次のアクションで前のアクションで取得したレコードの情報を使用する場合、条件「レコード1行が準備できた時」や「レコード全行が準備できた時」を使用します。
ですが、これらの条件はレコードが取得されなかった時は発生しないため、
レコードが取得されなかった時を条件にしたい場合は、今回のような条件を指定してください。
ここまでで、レコードがまだ1件もなかった時の処理は終了です。
ここまで進むと、次のアクションは前のアクション番号3に戻ります。
レコードを追加する(レコードが1件以上あった場合の処理)
ここからは、開始日付と終了日付を条件にレコードを取得した結果、レコードが1件以上取得された場合の処理です。
今回、レコードは日付が古いものから順番に(2021年1月→2021年2月・・・のように)作成していきますので、条件に合致したレコードのうち、最も新しい日付を取得することで、どこまでレコードが作成されているかを識別します。
そのため、やること「レコード中のフィールド最大値を計算する」を使い、最も新しい(大きい)日付を取得します。また、最大値を計算するには全レコードが揃っていないと正しく取得できないので、条件「レコード全行が準備できた時」を用います。
次に、取得した最も新しい日付が終了日付より小さい場合に、次の月のレコードを追加します。取得した最も新しい日付が終了日以上であれば、もうレコードを追加する必要はないのでアクションは実行されず、ここで処理は終わります。
次の月の日付を取得するため、やること「日付を計算する」で1か月後の日付を取得し、
条件「他のアクションの実行が完了した時」に加えて「アクションの結果が特定の値ならば」を用い、終了日付と6番アクションで取得した、最も新しい日付を比較しています。
最後に、レコードを追加します。
こちらも、「即時反映する」を必ず指定しておきます。
以上でカスタマイズは完成です。
このカスタマイズのアクショングラフは次のようになります。
アクション番号5、8から3に処理が戻っているのがわかります。
カスタマイズが作成できたら、「ジョブ生成・設定」ボタンを押し、ジョブを作成してください。
即時実行する場合は、「直ちに実行」で実行します。
アクショングラフが思った形とならない場合は、次のカスタマイズの全体像と見比べてみてください。
終わりに
上でも述べていますが、このようなアクションを繰り返すようなカスタマイズは、条件を誤ると意図せず長時間処理が実行され続けてしまう危険性があります。
実行前にカスタマイズの内容をしっかり確認してください。
また、この記事では月初の日付でレコードを作成していますが、月末の日付でレコードを作成する記事が次のものになります。
少し難しいカスタマイズとなりますが、こちらも参考になさっていただければと思います。
Customineドキュメントやサポートページもぜひご活用ください。
また、ご不明点等ございましたら、チャットにてご質問ください!