Skip to Content
変数とデータコマンド内での変数の使い方

コマンド内での変数の使い方(設定・演算・削除)

コマンドビルダーでは、ユーザーの入力やコマンドの実行結果を「変数」に入れて、あとで使い回すことができます。たとえば「ユーザーが入力した名前」をメッセージに差し込んだり、「コインの勝利数」を 1 ずつ増やして保存したりできます。

このページでは、変数を扱うための 3 つのノード「変数を設定」「変数に演算を適用」「変数を削除」の使い方と、文章の中に変数を埋め込むための書き方({変数名}${ … })をまとめて説明します。

まずは変数の書き方を覚える

変数を使うときは、メッセージや入力欄の中に「合言葉」を書いておくと、実行時に実際の値に置き換わります。書き方は次の 2 種類です。

書き方役割
{変数名}変数の値を 1 つ差し込む{playerName} / {option_user.mention}
${ … }計算式を書く(足し算・引き算など)${ {price} * 2 } / ${ {count} + 1 }

{変数名} で値を差し込む

波かっこ {} で変数名をはさむと、その変数に入っている値に置き換わります。たとえばメッセージ本文に次のように書くと、

こんにちは {playerName} さん!

実行時には {playerName} の部分が、その変数の値(たとえば「タロウ」)に置き換わります。

波かっこは 2 重にできません({{playerName}} のような書き方は無効です)。また、変数名の前後の空白は自動的に取り除かれます。

${ … } で計算する

足し算や掛け算などの計算をしたいときは、ドルマーク付きの波かっこ ${} で式を囲みます。式の中では、変数を {変数名} の形で参照できます。

合計金額は ${ {price} * {quantity} } 円です

この場合、{price}(価格)と {quantity}(個数)を掛け算した結果が表示されます。${ … } の中で使える計算の種類は、後述の計算式の書き方で詳しく説明します。

{変数名} は「値を 1 つそのまま差し込む」ための書き方、${ … } は「計算した結果を差し込む」ための書き方です。単に値を表示したいだけなら {変数名}、計算が必要なときだけ ${ … } を使う、と覚えてください。

「変数を設定」ノードで変数を作る

新しく変数を作り、値を入れるには「変数を設定」ノードを使います。このノードを通過した後のノードから、{変数名} で値を参照できるようになります。

コマンドビルダーで「変数を設定」ノードを追加する

Bot のコマンドビルダーを開き、「変数を設定」ノードをコマンドの流れの中に追加します。追加したノードをクリックして設定パネルを開きます。

「変数名」を入力する

「変数名」欄に、作りたい変数の名前を入力します。入力した変数名は、コピー用に {変数名} の形でも表示されるので、後続ノードに貼り付けるときに書き間違いを防げます。

変数名には、文字・数字・アンダースコア(_)・ドット(.)が使えます。文字には英字だけでなく、日本語・中国語・韓国語・キリル文字などの各国の文字も含められるので、たとえば お金用户名 のような名前もそのまま使えます。一方で、空白や記号、絵文字は変数名には使えません。

以前は変数名に英数字・アンダースコア・ドットしか使えず、{お金} のような日本語の変数名は値に置き換わらずそのまま文字として残ってしまうことがありました。現在は各国の文字に対応し、こうした変数名も正しく値に置き換わります。なお、絵文字は変数名に含まれないため、{🎉} のように絵文字を波かっこで囲んでも変数とは見なされず、装飾としてそのまま表示されます。

「型」を選ぶ

「型」欄で、変数に入れる値の種類を選びます。選べる型:

型(画面の表記)用途
「文字列 (string)」文章・名前・任意のテキスト
「数値 (number)」数字。足し算・引き算などの計算に使える
「真偽値 (boolean)」「はい / いいえ」「オン / オフ」のような 2 択
「ユーザー (User)」Discord のユーザー
「チャンネル (Channel)」Discord のチャンネル
「ロール (Role)」Discord のロール(役職)
「オブジェクト (Object)」複数の項目をまとめて 1 つの変数に持たせる
「配列 (array)」同じ種類の値を順番に並べて 1 つの変数に持たせる(参加者一覧・在庫など)

「ユーザー (User)」「チャンネル (Channel)」「ロール (Role)」を選ぶと、後続ノードで入力するときに .id(ID)、.name(名前)、.mention(メンション)などの候補が自動で表示されます。たとえばユーザー型の変数なら {変数名.mention} でその人をメンションできます。

「値」を入力する

「値」欄に、変数に入れたい値を入力します。直接の値(たとえば文字や数字)を書くほか、{他の変数} で別の変数の値を入れたり、${ … } 式で計算した結果を入れたりできます。

「型」で「オブジェクト (Object)」を選んだ場合は、この単一の「値」欄は表示されません。代わりに、後述のプロパティを定義する画面が表示されます。

後続ノードで変数を使う

後続のノード(メッセージ送信など)で、{変数名} と書くと、ここで設定した値が差し込まれます。

オブジェクト型で複数の項目をまとめる

「型」で「オブジェクト (Object)」を選ぶと、1 つの変数の中に複数の項目(プロパティ)を持たせられます。たとえば「プレイヤー」という 1 つの変数の中に「名前」「スコア」「レベル」をまとめて入れる、といった使い方ができます。

オブジェクト型を選ぶと「値」欄の代わりにプロパティの編集画面に切り替わり、プロパティ(例: プロパティ (0/50))を最大 50 件まで追加できます。

「プロパティを追加」をクリックする

「プロパティを追加」ボタンをクリックすると、新しいプロパティの入力欄が追加されます。プロパティは 1 つの変数につき最大 50 件まで作れます。

「キー名」を入力する

「キー名」欄に、その項目の名前を入力します。キー名は、英字・数字・アンダースコア(_)だけが使え、先頭は英字またはアンダースコアにする必要があります。ルールに合わないキー名を入力すると「キー名は英字 / 数字 / _ のみ、先頭は英字または _ にしてください。」という注意が表示されます。

各プロパティの上には、{変数名.キー名} の形のプレビューが表示されるので、後続ノードでどう参照すればよいかを確認できます。

「型」を選ぶ

各プロパティにも「型」を選べます。選べる種類は変数本体の「型」と同じ(文字列・数値・真偽値・ユーザー・チャンネル・ロール・オブジェクト)です。

「値」を入力する

プロパティごとの「値」欄に、その項目に入れる値を入力します。ここでも {他の変数} の参照や ${ … } 式が使えます。

オブジェクト型の変数は、後続ノードで {変数名.キー名} の形で参照します。たとえば変数名が player、キー名が name なら {player.name} です。

「変数に演算を適用」ノードで数値を増減する

すでにある変数の値を計算して書き換えたいとき(たとえばカウンターを 1 増やす、ポイントを加算するなど)は「変数に演算を適用」ノードを使います。

このノードは「式を評価して、その結果を対象の変数に入れ直す」動きをします。

「変数に演算を適用」ノードを追加する

数値を増減したい場所に「変数に演算を適用」ノードを追加し、クリックして設定パネルを開きます。

「対象変数名」を入力する

「対象変数名」欄に、計算結果を入れたい変数の名前を入力します。ここには、前のノードで宣言済みの変数名を入れます。

「対象変数名」には、波かっこ {} を付けず、変数名だけを入力します。波かっこ付きの {変数名} の形を使うのは、値を参照する「式」の中だけです。

「式」を入力する

「式」欄に、計算式を入力します。式の中で {変数名} を使うと、その変数の今の値を使って計算できます。${ … } 式ブロックも使えます。

たとえばカウンターを 1 増やすには、対象変数名に counter、式に {counter} + 1 と入力します。これで「counter の今の値に 1 を足した結果を、もう一度 counter に入れ直す」という動きになります。

「変数に演算を適用」は、数値や文字列の計算に向いたノードです。「オブジェクト (Object)」型や、ユーザー・チャンネル・ロールといった参照型の変数には対応していません(計算結果は最終的に文字列として扱われます)。これらの型には使わないでください。

計算式の書き方

${ … } 式ブロックや「変数に演算を適用」の「式」の中では、次のような計算ができます。

使える演算子

種類演算子説明
足し算+数値の加算。文字どうしなら連結
引き算-数値の減算
掛け算*数値の乗算
割り算/数値の除算(5 / 22.5。整数の切り捨てではありません)
余り%割った余り
比較< > <= >= == !=大小や一致を比べ、「はい / いいえ」を返す

計算の優先順位は、ふつうの算数と同じです(掛け算・割り算が先、足し算・引き算が後)。順番を変えたいときは丸かっこ ( ) でくくります。

数値の計算

数値どうしは、そのまま四則演算できます。

${ {price} * {quantity} } ${ {count} + 1 } ${ ( {a} + {b} ) / 2 }

文字の連結

+ は、片方が文字(文字列)のときは「つなげる」動きになります。文字をそのまま書くときは、ダブルクォーテーション "…" かシングルクォーテーション '…' で囲みます。

${ {firstName} + " " + {lastName} }

数値以外(文字列)で足し算以外の計算(引き算・掛け算など)をしたり、種類の違う値どうしを比べたりすると、画面に警告が表示されることがあります。ただし警告が出ても保存自体はできます。意図したとおりの結果になるよう、計算に使う変数の「型」がそろっているか確認してください。

比較する

比較演算子(< > <= >= == !=)は、条件分岐などと組み合わせて使えます。

${ {score} >= 100 } ${ {name} == "admin" }

比較の結果は、小文字の true または false という文字で表示されます(True / False ではありません)。たとえば ${ {score} >= 100 }score が 120 のときは true が差し込まれます。

配列を式の中で扱う

「配列(array)」型の変数は、式の中で要素を取り出したり、件数を数えたり、つなげたりできます。配列型は「変数を設定」ノードなどで作れる変数の種類の 1 つで、同じ種類の値を順番に並べて持たせるものです(たとえば「参加者の一覧」や「在庫リスト」など)。

式の中では、配列を次のように扱えます。

やりたいこと書き方説明
特定の要素を取り出す{arr}[0]角かっこ [ … ] に番号を入れると、その位置の要素を取り出します。番号は 0 から始まります。番号には {i} のように変数も入れられます
件数を数えるlength({arr})配列に入っている要素の数を返します
含まれているか調べるcontains({arr}, "x")指定した値が配列に含まれていれば true、なければ false を返します
位置を調べるindexOf({arr}, "x")指定した値が最初に現れる位置(番号)を返します
1 つの文字につなげるjoin({arr}, ", ")配列の要素を、区切り文字(2 番目の値)でつないで 1 つの文字にします
一部を切り出すslice({arr}, 1, 3)指定した範囲の要素だけを取り出した配列を作ります
文字を分割して配列にするsplit({text}, ",")文字を区切り文字で分けて配列にします

たとえば参加者の一覧が入った配列 members があるとき、${ length({members}) } で人数を、${ join({members}, ", ") } でカンマ区切りの一覧を差し込めます。

また、+ を使うと配列どうしをつなげて 1 つの配列にまとめられます。

${ {listA} + {listB} }

角かっこの番号には負の数も使えます。{arr}[-1] のように書くと、末尾から数えた要素(この場合は最後の要素)を取り出せます。

実際の動作と既定値

ここからは、変数の書き方が実行時にどのように評価されるか(ランタイムの挙動)を説明します。書き方を覚えたあと、思ったとおりの結果にならないときの確認にも役立ちます。

見つからない変数は空文字になる(フェイルオープン)

変数の解決は「フェイルオープン」方式です。つまり、参照した変数が見つからない・式の評価に失敗したといった場合でも、そこでコマンドが止まったりエラー文が出たりはせず、その部分が空文字(何も表示されない)に置き換わってコマンドはそのまま続行します。

  • {存在しない変数} のように見つからない変数は、空文字になります。
  • ${ … } 式の中で参照した変数が見つからない場合や、計算に失敗した場合は、その式ブロック全体が空文字になります。
  • このとき、ユーザーに見えるエラーメッセージは出ません。コマンドは後続のノードへ進みます。

「変数を差し込んだはずの場所が空になっている」ときは、変数名のつづり間違い、まだその変数が作られていない順番(「変数を設定」ノードより前で参照している)、または式の中で型の合わない計算をしている、のいずれかであることが多いです。エラーが出ない分、表示が空になっていないかを目で確認してください。

数値は余分な .0 を付けずに表示される

数値の値が整数として表せるとき(5.042.0 など)は、.0 を付けずに 542 と表示されます。小数部があるとき(2.5 など)はそのまま小数で表示されます。これは {変数名} での差し込みでも、${ … } 式の結果でも同じです。

たとえばカウンター変数の中身が 42.0 でも、表示は 42 になります。

割り算は小数になる

割り算 / は小数で結果を返します。${ 5 / 2 }2 ではなく 2.5 になります(整数の切り捨てではありません)。0 での割り算や 0 での余り計算(${ 5 / 0 } など)は計算に失敗するため、フェイルオープンによりその式ブロックは空文字になり、コマンドは続行します。

文字列型の変数は数値に変換されない

変数の「型」が「文字列 (string)」のときは、中身が数字に見えても(たとえば 42)、数値としては解釈されません。このため ${ {output} + 100 }output が文字列型の 42 のときは、足し算ではなく文字の連結になり、結果は 142 ではなく 42100 になります。

これは画面で宣言した「型」を尊重する動きです。数値として計算したいときは、その変数の「型」を「数値 (number)」にしてください。逆に、文字列として扱いたい値が勝手に数値になってしまうのを防ぐ役割もあります。

ある値を必ず数値として計算したいなら、その変数の「型」を「数値 (number)」にしておきます。数値型の変換に失敗した場合の既定値は 0 です。真偽値は計算の中では true1false0 として扱われます。

真偽値(boolean)として扱われる文字

「真偽値 (boolean)」型の変数では、true / yes / on / 1(いずれも小文字)が「はい(真)」として扱われ、それ以外は「いいえ(偽)」になります。

オブジェクト型をそのまま参照したとき

オブジェクト型の変数を {変数名} のように丸ごと参照すると、その中身が JSON 形式の文字列として差し込まれます。特定の項目だけを使いたいときは、{変数名.キー名} のようにプロパティを指定してください。API リクエストの応答など、構造を持った値も同様に、{apiReq_response.status} のようにたどって取り出せます。

配列型を参照したとき

配列型の変数も、{変数名} のように丸ごと参照すると、その中身が JSON 形式の文字列として差し込まれます。一部だけを取り出したいときは、次のように書きます。

  • {変数名}[0] — 角かっこに番号を入れて、その位置の要素を取り出します(番号は 0 から始まり、{変数名}[-1] のような負の数で末尾から数えられます)。
  • {変数名.length} — 要素の数。
  • {変数名.first} — 最初の要素。
  • {変数名.last} — 最後の要素。

たとえば参加者の一覧が入った配列なら、{members.length} で人数、{members.first} で先頭の参加者を差し込めます。式の中でのさらに進んだ扱い方は、前述の配列を式の中で扱うを参照してください。

変数の種類と参照のしかた(namespace)

{ … } の中では、用途の違ういくつかの種類の変数を参照できます。いずれも実行時に値へ置き換わります。

  • 基本情報: {User.name}{Guild.name}{Channel.name}{Now}(現在時刻)など、コマンドを実行した人やサーバー・チャンネルの情報。
  • コマンドの入力(オプション): {option_user.mention} など、ユーザーがコマンド実行時に入力した値。
  • 一時変数(ローカル変数): 「変数を設定」ノードなどで作った、その実行中だけ有効な変数。
  • 永続変数: {BSVAR_変数名} の形で参照する、実行をまたいで保存される変数。
  • ループ変数: ループの中で自動的に作られる進捗用の変数(後述)。

ドット記法で使えるプロパティは決まっている

{User.name}.name のように、ドット記法で取り出せるプロパティは種類ごとに用意されたものに限られます。たとえばユーザーには nameidmentioniconcreatedAt、ロールには nameidmentioncolorposition といった候補があります。

用意されていない項目や、先頭がアンダースコア _ で始まる項目({User._private} など)は参照できず、空文字になります。これは内部の項目を読み出せないようにするための仕組みです。

コマンド入力(オプション)変数のプロパティ

ユーザー・ロール・チャンネルなどを受け取るオプションは、オブジェクトとして扱われます。{option_user} だけだとそのオブジェクト全体、{option_user.mention} のようにプロパティを付けると個別の項目を取り出せます。たとえば {option_user.mention} はそのユーザーへのメンション、{option_role.mention} はロールへのメンションとして表示されます。

ループ変数(進捗の取得)

ループのノードで変数名を決めておくと、ループの中でその進捗を 2 つのプロパティで取り出せます。

  • {ループ変数名.index} — 現在が何回目かを表す番号(0 から始まります)。
  • {ループ変数名.count} — 繰り返しの合計回数。

たとえば {loopVar.index} / {loopVar.count} 件目 のように書くと、処理の進み具合を表示できます。これらは自動で作られるため、「変数を設定」で上書きすることはできません。

上限とクールダウン

変数を使ったコマンドには、暴走防止のための実行上限が共通で適用されます。現在はベータ版で、本来プレミアムの機能も含めて全ユーザーが無料で利用できます。

項目説明
1 回の実行時間30 秒コマンド全体の実行にかけられる時間です。ボタンやモーダルの入力待ちの時間も含みますが、入力を受け取るたびに待ち時間ぶんは延長されます。
1 回の実行ステップ数5000 ステップノードを通過するたびに 1 ステップとして数えます(ループの中では繰り返しぶん増えます)。
ループの最大回数100 回ループの繰り返し回数は最大 100 回までに制限されます。それより大きい回数を指定しても 100 回で止まります。

また、書き方そのものにも次の制限があります。

  • ${ … } 式ブロックの中に、さらに ${ … } を入れることはできません(入れ子の式は不可)。
  • {{変数名}} のように波かっこを 2 重にすることはできません(1 段だけ有効)。

永続変数(BSVAR_)の実行時の挙動

永続変数(BSVAR_)は、コマンドの実行をまたいで保存される変数です。実行時の挙動には、いくつか押さえておきたい点があります。

新しい永続変数はストレージでだけ作れる

「変数を設定」ノードでは、新しい永続変数を作ることはできません。永続変数は必ず先にストレージで作っておく必要があり、コマンドの中の「変数を設定」「変数に演算を適用」「変数を削除」でできるのは、すでにストレージにある永続変数の値を更新・リセットすることだけです。ストレージに登録されていない BSVAR_ 名を指定しても、その操作は何も起こりません。

スコープと、DM での書き込み

永続変数には「全体・サーバー・ユーザー」などのスコープ(値が共有される範囲)があります。スコープの考え方は永続変数で詳しく説明しています。

サーバー単位(guild / guild_user)のスコープを持つ永続変数を、DM(ダイレクトメッセージ)で実行したコマンドから更新しようとすると、サーバーが特定できないため、その書き込みは行われません(エラー表示はなく、静かにスキップされます)。このとき値の読み取り自体はできるため、{BSVAR_変数名} での参照は以前の値のまま表示され、コマンドは続行します。サーバー内で実行したコマンドからは通常どおり更新できます。

サーバー単位の累計値などを扱う永続変数は、サーバー内で使われることを想定しています。DM でも動くコマンドで使う場合は、ユーザー単位(user)や全体(global)のスコープを選んでおくと、DM からの更新も期待どおりに保存されます。

表示されるメッセージ

変数を使ったコマンドの実行で問題が起きたとき、ユーザーに表示される主なメッセージは次のとおりです。いずれも、変数の置き換えに失敗しただけでは出ません(その場合は空文字になり、コマンドは続行します)。

状況表示されるメッセージ
コマンドのデータが見つからないこのコマンドは利用できません。
実行が 30 秒の制限時間を超えたコマンドの実行がタイムアウトしました。
ステップ数の上限(5000)を超えた⛔ コマンドが複雑すぎます (ステップ上限 5000 到達)。一部処理がスキップされました。
実行中に予期しないエラーが起きたコマンドの実行中にエラーが発生しました。

ステップ数の上限を超えたときは、上の警告が 1 回表示され、残りのノードはスキップされます。

注意点・うまくいかないとき

  • 変数を差し込んだ場所が空になる: つづり間違い・参照する順番(「変数を設定」より前で参照していないか)・式の中の型の不一致が原因のことが多いです。エラーは出ないため、表示の抜けで気づく必要があります。
  • 計算結果が想定とずれる(例: 142 のはずが 42100): 計算に使う変数が「文字列 (string)」型のままだと、+ が連結として働きます。数値計算をしたい変数は「型」を「数値 (number)」にしてください。
  • 種類の違う値を比べると結果が出ない: 数値どうし・文字どうしのように、同じ種類の値で比べてください。種類が混ざると比較結果が得られず、空文字になります。
  • DM で永続変数が保存されない: サーバー単位スコープの永続変数は DM では書き込めません。前述の「スコープと、DM での書き込み」を確認してください。
  • 0 で割っている: ${ … / 0 } は計算に失敗してその式が空になります。割る数が 0 にならないようにしてください。

「変数を削除」ノードで永続変数をリセットする

「変数を削除」ノードは、永続変数(後述のストレージで作った変数)の値を空(初期値)に戻すためのノードです。ローカル変数はコマンド終了で自動的に破棄されるため対象外です。

「変数を削除」ノードを追加する

リセットしたい場所に「変数を削除」ノードを追加し、クリックして設定パネルを開きます。

「対象変数名」を入力する

「対象変数名」欄に、リセットしたい永続変数の名前を入力します。ここでも波かっこ {} は付けず、変数名だけを入力します。

このノードを実行すると、対象の永続変数は、ストレージで設定された初期値(デフォルト値)に戻ります。

「変数を削除」が対象にできるのは、永続変数(ストレージで作った変数)だけです。コマンドの中だけで使う一時変数は、実行が終わると自動的に消えるため、このノードの対象外です(一時変数名を入れても何も起こりません)。

一時変数と永続変数の違い

BotShade の変数には、大きく分けて 2 種類あります。仕組みも使い方も違うので、混同しないように注意してください。

種類値が残る範囲作り方参照名
一時変数(ローカル変数)コマンド 1 回の実行中だけ。実行が終わると消える「変数を設定」ノードや、ユーザー入力などのノードで自動的に作られる{変数名}
永続変数(カスタム変数)コマンドの実行をまたいで保存されるストレージの画面であらかじめ作る{BSVAR_変数名}

一時変数(ローカル変数)

「変数を設定」ノードで作る変数や、ユーザーがコマンドに入力した値などは、すべて一時変数です。これらはそのコマンドが 1 回実行されている間だけ存在し、実行が終わると消えてしまいます。「今回の実行だけで使う計算用の値」に向いています。

永続変数(カスタム変数・BSVAR_)

一方、「ユーザーのコイントス勝敗」「サーバーの累計ポイント」のように、コマンドを実行し終わっても残しておきたい値は、永続変数を使います。永続変数はストレージの画面であらかじめ作っておく必要があり、その実際の名前は必ず BSVAR_ で始まります。

コマンドビルダーの中で永続変数を扱うときは、この BSVAR_ 付きの名前を使います。

  • メッセージなどで参照するとき: {BSVAR_変数名}
  • 「変数に演算を適用」「変数を削除」の「対象変数名」に入れるとき: BSVAR_変数名(波かっこなし)

ストレージに登録されていない BSVAR_ 名を「変数を設定」「変数に演算を適用」「変数を削除」で使っても、その操作は実行されません(前述の新しい永続変数はストレージでだけ作れる)。

たとえば「コインの勝利数」を増やすには、ストレージで BSVAR_coinflip_win_count を作っておき、「変数に演算を適用」ノードで対象変数名に BSVAR_coinflip_win_count、式に {BSVAR_coinflip_win_count} + 1 と入力します。リセットしたいときは「変数を削除」ノードに BSVAR_coinflip_win_count を入力すると、ストレージで決めた初期値に戻ります。

ノードタイトルの変更

「変数を設定」「変数に演算を適用」「変数を削除」のいずれのノードでも、設定パネルの一番下に「ノードタイトル」欄があります。ここに名前を入力すると、コマンドビルダー上でのそのノードの表示名を、わかりやすい名前に変更できます。

たとえば「変数に演算を適用」ノードに「勝利数を +1」のようなタイトルを付けておくと、コマンドの流れを見たときに何をするノードなのか一目でわかります。タイトルはあくまで表示用なので、変数の動き自体には影響しません。

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

  • ストレージ — 永続変数(BSVAR_)を作成・管理する画面です。
  • 永続変数BSVAR_ 変数とスコープ(全体・サーバー・ユーザー)の考え方をくわしく説明します。
  • Bot の作成 — コマンドビルダーを開くための Bot 管理の入口です。
最終更新: