制御フロー(待機・くり返し)
コマンドビルダーには、処理の流れそのものをコントロールするためのブロック(ノード)が用意されています。たとえば「数秒だけ処理を止める」「同じ処理を決まった回数くり返す」「くり返しを途中でやめる」といった操作です。
このページでは、ビルダー左側のパレットにある「制御」カテゴリのブロックの使い方を、画面の操作にそって説明します。
このページのブロックは「制御」タブ(パレット左側のカテゴリ)の中の「実行制御」グループに入っています。並んでいるのは「待機」「反復処理」「反復中断」「反復スキップ」の 4 つです。
制御ノードとは
通常、コマンドビルダーのブロックは上から下へ順番に実行されます。制御ノードは、この「順番に進む」という流れに割り込み、次のような動きを加えます。
| ブロック名 | できること |
|---|---|
| 「待機」 | 指定した時間だけ、次の処理に進むのを止めます。 |
| 「反復処理」 | 接続したブロックを、指定した回数だけくり返します。 |
| 「反復中断」 | 実行中のくり返しを、その場でやめて抜け出します。 |
| 「反復スキップ」 | 今回のくり返しを途中で打ち切り、次の回へ進みます。 |
ブロックの追加方法(共通)
制御ブロックは、パレットからキャンバス(作業領域)へ追加します。追加のしかたは 2 通りあります。
「制御」タブを開く
ビルダー左側のパレットで「制御」カテゴリを選びます。「実行制御」の見出しの下に「待機」「反復処理」「反復中断」「反復スキップ」が並んでいます。
ブロックをキャンバスに置く
追加したいブロックを、キャンバスの空いている場所へドラッグ&ドロップします。クリックするだけでも追加できます。
前のブロックとつなぐ
追加したブロックの上側の丸い接続口を、ひとつ前のブロックの下側の接続口とつなぎます。これでコマンドの流れの中にブロックが組み込まれます。
待機
「待機」は、指定した時間だけコマンドの実行を一時停止するブロックです。たとえば「メッセージを送ってから 3 秒待ち、続けて別のメッセージを送る」といった、間(ま)を作りたい場面で使います。
「待機」を追加する
「制御」タブから「待機」をキャンバスに置き、前のブロックとつなぎます。
ブロックをクリックして設定を開く
キャンバス上の「待機」ブロックをクリックして、右側の設定パネルを開きます。
待機時間を入力する
「待機時間」の欄に数値を入力し、右側のプルダウンで単位を選びます。
| 単位の表示 | 意味 |
|---|---|
| 「秒」 | 秒 |
| 「分」 | 分 |
| 「時間」 | 時間 |
| 「日」 | 日 |
たとえば「待機時間」に 10、単位に「秒」を選ぶと、10 秒間処理が止まります。
ノードタイトルを変える(任意)
「ノードタイトル」の欄に文字を入れると、キャンバス上に表示されるこのブロックの名前を、好きな名前に変えられます。空欄のままでもかまいません。
待機時間の上限と実際の動作
「待機」には、覚えておきたい実際の動作があります。
- 1 回の待機は最大 25 秒まで です。25 秒より長い時間を入力しても、自動的に 25 秒に短縮されて実行されます。短縮されても画面に通知は出ないため、長い間(ま)を作りたいときは「待機」を複数つなぐ形を検討してください。これは、後述する「コマンド 1 回あたり 30 秒」という実行時間の上限を超えないようにするための仕組みです。
- 0 秒以下や、数値として読み取れない値を入力した場合は、待機せずにそのまま次へ進みます(何もしないブロックとして扱われます)。エラーにはなりません。
「待機」で長く止めても、コマンド全体の実行時間は 30 秒までという上限があります。待機時間と他の処理の合計が 30 秒を超えると、コマンドは途中で打ち切られ、後述のタイムアウトメッセージが表示されます。
反復処理(ループ)
「反復処理」は、接続したブロックを指定した回数だけくり返し実行するブロックです。「メンバー全員に同じ処理をする」「指定した回数だけメッセージを送る」といった、同じ作業のくり返しに使います。
「反復処理」をキャンバスに置くと、「ループ本体」と「ループ後」という 2 つの子ブロックが自動で作られ、最初からつながった状態になります。くり返したい処理は必ず「ループ本体」につないでください。
反復処理の設定
「反復処理」を追加する
「制御」タブから「反復処理」をキャンバスに置きます。同時に「ループ本体」「ループ後」のブロックが自動で作られます。
ブロックをクリックして設定を開く
「反復処理」ブロックをクリックして、右側の設定パネルを開きます。
「ループ変数名 (ネームスペース)」を決める
これは、くり返しが「今、何回目か」を後の処理で使えるようにするための名前(ネームスペース)です。
ループ本体内で利用できる反復カウンタのネームスペース名です。
{<名前>.index}(0 始まり) と{<名前>.count}(1 始まり) として参照できます。英数字と_のみ、英字または_で始まる必要があります。
英数字とアンダースコア以外の文字(ピリオドや日本語、空白など)は自動的に取り除かれます。
「ループ回数」を入力する
くり返す回数を入力します。この欄では数値のほか、変数を差し込むこともできます。
ノードタイトルを変える(任意)
「ノードタイトル」の欄で、キャンバス上の表示名を任意に変更できます。空欄でもかまいません。
ループ回数の既定値と上限
「ループ回数」には、実際の動作として次の決まりがあります。
- 未入力のときは 10 回 くり返します。
- くり返しの上限は 100 回 です。100 を超える回数を入力しても、自動的に 100 回に短縮されて実行されます。短縮されても画面に通知は出ません。
- 0 回や負の数を入力した場合は、「ループ本体」を一度も実行せず、すぐに「ループ後」へ進みます。エラーにはなりません。
- 数値として読み取れない値(空白や文字など)を入力した場合も、「ループ本体」は実行されず、すぐに「ループ後」へ進みます。
- 「ループ本体」に何もつないでいなくても、ループ自体は指定回数だけ回ります(ただし毎回何もしません)。
くり返し回数が多い処理や、くり返しの中で多くのブロックを実行する処理は、後述する「ステップ上限」「実行時間の上限」に達しやすくなります。100 回 × 1 回あたりの処理数が大きくならないように設計してください。
ループ変数(ネームスペース)とカウンタ参照
「ループ変数名」で決めた名前を使うと、くり返しの中で「今が何回目か」を文章や値の中に差し込めます。参照できる値は 2 種類です。
| 書き方 | 意味 | 例(変数名が loop_1 のとき) |
|---|---|---|
{ループ変数名.index} | 0 から数えた回数(0、1、2…) | {loop_1.index} |
{ループ変数名.count} | 1 から数えた回数(1、2、3…) | {loop_1.count} |
たとえばループ変数名を loop_1 にして、「ループ本体」の中で「○ 回目の処理です」のようなメッセージを送りたいときは、本文に {loop_1.count}回目の処理です と書くと、1 回目・2 回目…と回数が入った文章になります。これらのカウンタは、「ループ本体」より後ろの(ループ本体の中の)すべての処理で文章や値に差し込めます。
index と count は数え始めが 1 つずれている点に注意してください。
ループ変数名を空欄にしたとき
「ループ変数名」を空欄にしたり、英数字とアンダースコア以外の文字だけを入れたりした場合は、ブロックごとに自動で名前が割り当てられます。意図した名前でカウンタを参照したいときは、必ず半角英数字とアンダースコアで名前を決めておいてください。
ループを入れ子にしたとき
「反復処理」の中にさらに「反復処理」を置く(入れ子にする)こともできます。内側と外側で同じループ変数名を使っても、外側のカウンタの値は内側のループが動いている間だけ一時的に退避され、内側が終わると元に戻ります。そのため、入れ子にしても外側の回数が壊れる心配はありません。
ループ本体 と ループ後
「反復処理」を置くと自動で作られる「ループ本体」と「ループ後」は、それぞれ次の役割を持つ目印のブロックです。設定項目はなく、処理をつなぐためのアンカー(接続点)として使います。
| 子ブロック | 役割 |
|---|---|
| 「ループ本体」 | くり返したい処理をつなぐ場所。ここにつないだ流れが、設定した「ループ回数」だけくり返されます。 |
| 「ループ後」 | くり返しがすべて終わった後(または「反復中断」で抜けた後)に実行したい処理をつなぐ場所。 |
「ループ本体」をクリックすると、設定パネルに次の説明が表示されます。
このブロックには、繰り返し実行したいブロックを接続してください。親の反復処理ノードに設定された回数だけ実行されます。
「ループ後」をクリックすると、次の説明が表示されます。
このブロックに接続されたブロックは、ループ処理が完了した後 (または反復中断で抜けた後) に実行されます。
「ループ本体」と「ループ後」は「反復処理」ブロックに紐づいているため、単独で削除することはできません。これらを消したいときは、親の「反復処理」ブロックを削除してください。あわせて自動的に消えます。同様に、「反復処理」と「ループ本体」「ループ後」をつなぐ線も手動では消せません。
反復中断(break)
「反復中断」は、実行中のくり返しをその場で打ち切るためのブロックです。設定パネルには「現在のループを直ちに中断し、最も内側の反復処理の「ループ後」へ移動します。」と表示されます。
たとえば「ループの中で目的のものが見つかったら、それ以上くり返す必要はない」という場面で、「反復中断」を使うとすぐにくり返しを終えて「ループ後」へ進めます。
ループ本体の中に置く
「制御」タブから「反復中断」を追加し、必ず「ループ本体」につながっている処理の流れの中に置きます。
抜けたいタイミングにつなぐ
くり返しを終わらせたいタイミングのブロックの後ろに「反復中断」をつなぎます。ここに到達すると、くり返しは即座に終了し、流れは「ループ後」へ移ります。
反復スキップ(continue)
「反復スキップ」は、今回のくり返しだけを途中で打ち切り、次の回の先頭に戻るためのブロックです。設定パネルには「現在の反復をスキップし、次の反復の先頭に戻ります。」と表示されます。
くり返しそのものは続けたいけれど、「ある条件のときだけは残りの処理を飛ばしたい」という場面で使います。「反復中断」がくり返し全体を終わらせるのに対し、「反復スキップ」は今回の 1 回だけを飛ばして次へ進む、という違いがあります。
ループ本体の中に置く
「制御」タブから「反復スキップ」を追加し、「ループ本体」につながっている処理の流れの中に置きます。
飛ばしたいタイミングにつなぐ
今回の残りの処理を飛ばしたいタイミングのブロックの後ろに「反復スキップ」をつなぎます。ここに到達すると、今回の回はそこで打ち切られ、次の回の先頭から続行します。
「反復中断」「反復スキップ」はループ本体の中だけ
「反復中断」「反復スキップ」は、どちらも「ループ本体」の中(つまり「反復処理」の配下)でだけ意味を持つブロックです。設定パネルにも次のように表示されます。
このブロックは反復処理ノードの「ループ本体」配下でのみ有効です。ループの外側に配置された場合、何も行いません。
上の「何も行いません」は、ループの外側に置いた場合の実行時の意味です。ただし実際にはビルダーがその配置を許しません。「反復中断」「反復スキップ」が「ループ本体」の配下に無いと、保存時に検証エラーとなりコマンドを保存できません(実行時に no-op になる前に、保存の段階で止まります)。必ず「反復処理」ブロックの「ループ本体」につながった流れの中に置いてください。
ループが入れ子になっている場合、「反復中断」「反復スキップ」はもっとも内側のループに対して働きます。外側のループはそのまま続きます。
「反復中断」と「反復スキップ」の違い(実際の動作)
似たブロックなので、それぞれが「ループ後」に与える影響を整理します。
| ブロック | くり返しの扱い | 「ループ後」の実行 |
|---|---|---|
| 「反復中断」 | もっとも内側のくり返し全体をその場で終了します。 | くり返しを抜けた直後に 1 回実行されます。 |
| 「反復スキップ」 | 今回の 1 回ぶんだけ残りを飛ばし、次の回へ進みます。 | 1 回ごとには実行されません。すべての回が終わるか「反復中断」したときにだけ実行されます。 |
実際の動作と既定値
ここまでの設定をふまえて、制御ブロックの主な既定値を 1 か所にまとめます。いずれも画面に表示されない内部の動作も含め、ユーザーから見て影響するものだけを挙げています。
| 項目 | 既定値・動作 |
|---|---|
| 「待機時間」 | 既定値なし(必ず指定します)。0 秒以下や読み取れない値は待機せず素通りします。 |
| 「ループ回数」 | 未入力のときは 10 回。0 以下・読み取れない値は「ループ本体」を実行せず「ループ後」へ。 |
| 「ループ変数名」 | 空欄や無効な文字だけのときは、ブロックごとに自動の名前が割り当てられます。 |
カウンタ {名前.index} | 0 から数えた現在の回数。 |
カウンタ {名前.count} | 1 から数えた現在の回数。 |
上限とクールダウン
制御ブロックには、コマンドが暴走したり長時間サーバーを占有したりしないよう、いくつかの上限が設けられています。
| 上限の対象 | 値 | 超えたときの動作 |
|---|---|---|
| 1 回の「待機」時間 | 最大 25 秒 | 自動的に 25 秒へ短縮(通知なし)。 |
| 1 つの「反復処理」のくり返し回数 | 最大 100 回 | 自動的に 100 回へ短縮(通知なし)。 |
| コマンド全体の実行時間 | 30 秒 | 途中で打ち切り、タイムアウトのメッセージを表示。 |
| コマンド全体の処理ステップ数 | 5000 ステップ | 上限到達時にメッセージを表示し、以降の処理をスキップ。 |
「ステップ数」とは、コマンドの中でブロックが処理された回数のおおまかな目安です。くり返しの中のブロックは、回るたびに数えられます。たとえば 100 回のくり返しの中にブロックを多数つなぐと、ステップ数が一気に増えて 5000 に達しやすくなります。
「待機」が 25 秒、「反復処理」が 100 回までに自動で短縮されても、画面には通知が出ません。思ったより短い・少ない動作になったときは、これらの上限に達していないか確認してください。長い待機や多い回数が必要な場合は、複数のブロックに分けたり、処理を見直したりしてください。
ボタンや選択メニューでユーザーの操作を待つ処理を「反復処理」の中に入れると、操作を待つあいだも実行時間に数えられます。ユーザーの反応待ちで 30 秒を超えると、コマンドはタイムアウトします。
表示されるメッセージ
制御に関係して、コマンドの実行が正常に進められなかったときには、コマンドを実行した本人にだけ見える形(エフェメラル)で次のメッセージが表示されます。
| 状況 | 表示されるメッセージ |
|---|---|
| 実行時間が 30 秒を超えた | コマンドの実行がタイムアウトしました。 |
| 処理ステップ数が 5000 を超えた | ⛔ コマンドが複雑すぎます (ステップ上限 5000 到達)。一部処理がスキップされました。 |
| 実行中に問題が起きた(「反復中断」「反復スキップ」の置き場所ミスなどを含む) | コマンドの実行中にエラーが発生しました。 |
ステップ上限のメッセージが出たあとは、残りの処理はそのまま飛ばされて実行されません。タイムアウトの場合も、そこでコマンドは終了します。
注意点・うまくいかないとき
実際に作ってみて「思ったとおりに動かない」と感じたときは、次の点を確認してください。
- くり返しが思ったより少ない / 待機が思ったより短い:「ループ回数」は 100 回、「待機」は 25 秒が上限で、超えた分は自動で短縮されます。短縮の通知は出ないため、上限に達していないか見直してください。
- 「ループ本体」が一度も動かない:「ループ回数」が 0 以下になっていないか、変数を差し込んでいる場合はその値が数値として正しく入っているかを確認してください。読み取れない値や 0 以下のときは「ループ本体」を飛ばして「ループ後」へ進みます。
- 「待機」で止まらない:「待機時間」が 0 以下、または数値として読み取れない値になっていると、待機せずに素通りします。
- 「反復中断」「反復スキップ」でエラーになる: これらは「ループ本体」の中だけで使えます。「ループ本体」の外に置くと保存時にエラーになり、実行時には
コマンドの実行中にエラーが発生しました。が表示されます。 - コマンドが途中で止まる / 一部だけ動く: 実行時間 30 秒またはステップ数 5000 の上限に達している可能性があります。くり返しの回数や中の処理数、待機時間を減らして全体を軽くしてください。
コマンド一覧
このページで扱う「制御」カテゴリ(「実行制御」グループ)のブロックは次の 4 つです。いずれもすべてのコマンド作成者が利用できます。
| ブロック名 | できること | 主な上限・既定値 |
|---|---|---|
| 「待機」 | 指定した時間だけ次の処理を止めます。 | 1 回あたり最大 25 秒。 |
| 「反復処理」 | 「ループ本体」につないだ処理を指定回数くり返します。 | 既定 10 回、最大 100 回。 |
| 「反復中断」 | もっとも内側のくり返しを即座に終了し「ループ後」へ進みます。 | 「ループ本体」の中でのみ有効。 |
| 「反復スキップ」 | 今回の 1 回ぶんを飛ばして次の回へ進みます。 | 「ループ本体」の中でのみ有効。 |
次のステップ・関連ページ
- コマンドビルダーの基本 — 画面の見方やブロックの追加・接続の基礎
- 条件分岐 — 条件によって処理の流れを分ける
- 変数の使い方 —
{ループ変数名.count}のような変数の参照方法