変数とデータ

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

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

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

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

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

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

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

こんにちは {playerName} さん!

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

変数名の前後の空白は、自動的に取り除かれます。

${ … } で計算する

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

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

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

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

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

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

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

「変数名」を入力する

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

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

「型」を選ぶ

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

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

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

「値」を入力する

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

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

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

オブジェクト型を選ぶと、単一の「値」欄の代わりにプロパティの編集画面に切り替わります。

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

「プロパティを追加」ボタンをクリックすると、新しいプロパティの入力欄が追加されます。プロパティは 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)」型の変数は、式の中で次のように扱えます。

やりたいこと書き方説明
特定の要素を取り出す{arr}[0]角かっこ [ … ] に番号を入れると、その位置の要素を取り出します。番号は 0 から始まり、{arr}[-1] のような負の数では末尾から数えます。番号には {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} }

実際の動作と既定値

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

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

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

差し込んだはずの場所が空になっているときは、変数名のつづり間違い、参照する順番(「変数を設定」ノードより前で参照している)、式の中の型の不一致のいずれかであることが多いです。

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

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

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

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

数値として計算したい変数は「型」を「数値 (number)」にしてください。数値型への変換に失敗した場合の既定値は 0 です。真偽値は計算の中では true1false0 として扱われます。

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

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

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

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

配列型を参照したとき

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

  • {変数名}[0] — その位置の要素(番号は 0 から始まり、{変数名}[-1] で末尾から数えます)。
  • {変数名.length} — 要素の数。
  • {変数名.first} — 最初の要素。
  • {変数名.last} — 最後の要素。

式の中での扱い方は配列を式の中で扱うを参照してください。

変数の種類と参照のしかた(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 回だけ表示され、残りのノードはスキップされます。

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

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

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

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

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

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

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

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

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

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

永続変数の実際の名前は必ず BSVAR_ で始まります。メッセージなどで参照するときは {BSVAR_変数名}、「変数に演算を適用」「変数を削除」の「対象変数名」に入れるときは BSVAR_変数名(波かっこなし)を使います。

ノードタイトルの変更

「変数を設定」「変数に演算を適用」「変数を削除」のいずれも、設定パネルの一番下にある「ノードタイトル」欄で、コマンドビルダー上の表示名(例: 「勝利数を +1」)に変更できます。

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

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

最終更新:

目次

まずは変数の書き方を覚える{変数名} で値を差し込む${ … } で計算する「変数を設定」ノードで変数を作るコマンドビルダーで「変数を設定」ノードを追加する「変数名」を入力する「型」を選ぶ「値」を入力するオブジェクト型で複数の項目をまとめる「プロパティを追加」をクリックする「キー名」を入力する「型」を選ぶ「値」を入力する「変数に演算を適用」ノードで数値を増減する「変数に演算を適用」ノードを追加する「対象変数名」を入力する「式」を入力する計算式の書き方使える演算子数値の計算文字の連結比較する配列を式の中で扱う実際の動作と既定値見つからない変数は空文字になる(フェイルオープン)数値は余分な .0 を付けずに表示される文字列型の変数は数値に変換されない真偽値(boolean)として扱われる文字オブジェクト型をそのまま参照したとき配列型を参照したとき変数の種類と参照のしかた(namespace)ドット記法で使えるプロパティは決まっているコマンド入力(オプション)変数のプロパティループ変数(進捗の取得)上限とクールダウン永続変数(BSVAR_)の実行時の挙動新しい永続変数はストレージでだけ作れるスコープと、DM での書き込み表示されるメッセージ「変数を削除」ノードで永続変数をリセットする「変数を削除」ノードを追加する「対象変数名」を入力する一時変数と永続変数の違いノードタイトルの変更次のステップ / 関連ページ