コマンドビルダー

コマンド内関数(サブルーチン)

長くなったコマンドの中で、同じような処理が何度も出てくることがあります。「コマンド内関数」は、そうした 再利用したい処理のかたまり に名前を付け、引数を受け取って実行する仕組みです。同じノード列をコピーして増やす代わりに、関数を 1 つ作り、必要な場所から 呼び出す ことで同じ結果が得られます。

関数は 同じコマンドの中だけ で再利用できます。別のコマンドからは呼び出せないため、コマンドをまたいだ共通処理ではなく、1 つのコマンドの内部整理に向いています。細部を関数に追い出せば、コマンド本体には流れの骨格(条件分岐や順序)だけが残り、引数で対象ユーザーやメッセージ本文を呼び出しごとに切り替えられます。

サイドバーの「関数」セクション

コマンドビルダーの左サイドバーには、「グループ」「変数」などと並んで { } アイコンの 関数 セクションがあります。ここで、関数の一覧表示・作成・削除・編集対象の切り替えを行います。

ボタン / 表示内容
「新しい関数を追加」空の関数を 1 つ作り、関数本体の編集画面に切り替えます。
「コマンド本体に戻る」関数を編集している間だけ表示される、コマンド本体に戻るボタンです。
関数の一覧作成済みの関数が、引数の個数と戻り値の型とあわせて並びます。
「削除」アイコンその関数を削除します。

関数本体に置かれるノード

新しい関数を作ると、関数本体のキャンバスには起点として 関数定義エラーハンドラー の 2 つのノードが最初から置かれます(削除や移動はできません)。関数本体の処理は、関数定義ノードの下に続けてノードをつないで作っていきます。

関数まわりで使うノードは次の 3 種類です。

ノード置く場所役割
「関数定義」関数本体の入口(自動配置)この関数の 名前・引数・戻り値の型 を編集します。
「関数呼び出し」コマンド本体や、別の関数の本体同じコマンド内に定義した関数を呼び出します。引数を渡し、必要なら戻り値を変数として受け取ります。
「戻り値」(return)関数本体の中関数の処理を 明示的に終わらせ、戻り値を返します。戻り値の型が void の関数では値の入力は不要です。

関数の名前・引数・戻り値を編集する(関数定義ノード)

関数本体の入口にある「関数定義」ノードをクリックすると、右側に設定パネルが開き、その関数のメタ情報をまとめて編集できます。

関数名と説明

項目内容
「関数名」同じコマンド内で一意の名前を付けます。英数字・アンダースコア・ハイフンが使えます。
「説明」サイドバーの一覧や、関数呼び出しの補完で表示される短い説明文(任意)。

引数 (params)

「引数」セクションでは、関数が受け取る入力を 0 個以上 並べて定義します。「追加」ボタンで 1 件追加され、各引数には次を設定します。

項目内容
「引数名」小文字英数字・アンダースコア・ハイフン。param_ で始まる名前は使えません(参照式と重複するため)。
「型」引数のデータ型。「文字列 (string)」「数値 (number)」「真偽値 (boolean)」「ユーザー (User)」「チャンネル (Channel)」「ロール (Role)」「オブジェクト (Object)」「配列 (Array)」から選びます。
「説明」関数呼び出し側の補助テキストとして表示される説明(任意)。
「必須」オンにすると、呼び出し側で値を必ず渡す必要があります。
「デフォルト値」必須をオフにしたときに表示される、省略時に使われる値(任意)。ユーザー / ロール / チャンネル型は持てません(これらを使うときは必ず必須にしてください)。

関数本体の中では、引数を {param_<引数名>} の形で参照します。たとえば引数名を target にしたら、関数本体のメッセージ本文に {param_target.mention} と書けば、呼び出し時に渡されたユーザーのメンションが入ります。

戻り値 (returns)

関数の戻り値の型を 1 つ選びます。

選択肢意味
「戻り値なし (void)」(初期値)値を返しません。関数内の処理を行うだけ。
「文字列 (string)」「数値 (number)」「真偽値 (boolean)」「ユーザー (User)」「チャンネル (Channel)」「ロール (Role)」「オブジェクト (Object)」「配列 (Array)」この型の値を返します。関数本体の中で「戻り値」ノードを使って値を返し、呼び出し側で受け取ります。

void 以外を選ぶと、呼び出し側で戻り値を変数として受け取れるようになります。

関数を呼び出す(関数呼び出しノード)

コマンド本体や、他の関数の本体から「関数呼び出し」ノードを置くと、同じコマンド内の関数を呼び出せます。キャンバスに置いたノードをクリックすると、右側に設定パネルが開きます。

「呼び出す関数」を選ぶ

ドロップダウンに、このコマンド内に定義した関数が並びます。「(関数を選択)」のまま保存すると呼び出し先が決まらず、その呼び出しは何も実行しません。

引数を入力する

関数を選ぶと、その関数の引数フォームが下に展開されます。値の入力欄では {変数名} の参照や ${ ... } の計算式も使えます。

任意引数(必須オフ)を空欄で送ると、引数のデフォルト値が使われます(関数定義側で設定しておけます)。

戻り値の格納先を指定する(任意)

呼び出し先の関数が戻り値を持つ(void 以外の)ときだけ、「戻り値の格納先 (任意)」欄が表示されます。ここに変数名を入れておくと、戻ってきた値が {その変数名} で参照できます。空欄なら戻り値は破棄されます。

関数の途中で抜ける(戻り値ノード)

関数本体の途中で if 分岐に応じて早めに終わらせたい、または値を明示的に返したいときは「戻り値」ノードを使います。

  • 関数の戻り値型が void のときは、void 用の戻り値ノードを置けば「ここで処理を終了」する目印になります。値の入力は不要です。
  • void 以外の戻り値型のときは、入力欄に その型に合った値 を入れます。リテラル(直接の値)、{変数} 参照、${...} 計算式が使えます。

「戻り値」ノードは関数の中だけで使ってください。関数本体の外(コマンド本体側)に置くと「このノードは関数本体の外には配置できません。」と表示され、その関数は実行時に正しく動かなくなります。

関数の中で使える変数のスコープ

関数の中では、変数の 見えかた がコマンド本体と少し違います。次のように使い分けてください。

種類関数の中での扱い
永続変数(BSVAR_…、サーバー共有のグローバル変数など)読み書きできます。関数の中で増やしたカウントなどは、関数を抜けた後も残ります。{BSVAR_score}
コマンドのオプション (option_…)関数の中からは見えません。必要なら、呼び出し側で引数として渡してください。(関数の中では参照できない)
関数の引数 (param_…)関数の中だけで 読み取り 専用として参照できます。書き換えはできません。{param_target}
関数の中で「変数を設定」したローカル変数その関数の中だけで有効です。関数を抜けると消えます{tmp}

エラーハンドラーとの関係

関数本体にも、入口の「関数定義」ノードと並んで「エラーハンドラー」ノードが自動で配置されますが、現時点では関数内エラーは コマンド全体のエラーハンドラー(関数の外側、コマンド本体側にある起点ノード) が受け取ります。関数の中でエラーを返したい場合も、コマンド本体側のエラーハンドラーで処理を組み立ててください。

うまく動かないときは

  • 戻り値ノードに「このノードは関数本体の外には配置できません」と表示される: サイドバーで関数を開いてから、関数本体側に置き直してください。
  • 関数の中で書き換えたつもりの値が、関数を抜けたら消える: 関数の外まで残したい値は、呼び出し側で戻り値として受け取るか、永続変数(BSVAR_…)に書き出してください。

次のステップ / 関連ページ

最終更新:

目次