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