変数とデータ

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

コマンドビルダーの入力欄では、変数の値や計算結果を差し込めます。書き方は次の 2 種類です。

書き方役割例
{変数名}変数の値を 1 つ差し込む{playerName} / {option_user.mention}
${ … }計算した結果を差し込む。式の中では {変数名} で変数を参照する${ {price} * {quantity} }

変数は、それを作ったノードより後ろのノードでだけ参照できます。変数の種類(一時変数・永続変数)の違いは一時変数と永続変数をご覧ください。

変数名とキー名に使える文字

  • 変数名: 文字・数字・アンダースコア(_)・ドット(.)が使えます。文字には日本語・中国語・韓国語・キリル文字なども含まれるため、お金 や 用户名 のような名前も使えます。空白・記号・絵文字は使えません({🎉} のように書いても変数とは見なされず、そのまま表示されます)。
  • オブジェクト型のキー名: 英字・数字・アンダースコアだけが使え、先頭は英字またはアンダースコアにします。プロパティは 1 つの変数につき最大 50 件です。後続ノードからは {変数名.キー名} で参照します。

ノードごとの注意点

  • 「変数を設定」: 新しい永続変数(BSVAR_)は作れません。永続変数は先にストレージで作っておく必要があり、登録していない BSVAR_ 名を指定しても何も起こりません。
  • 「変数に演算を適用」「変数を削除」の「対象変数名」: 波かっこを付けずに名前だけを入力します(例: counter、BSVAR_score)。波かっこ付きの {変数名} を使うのは、値を参照する式の中だけです。カウンターを 1 増やすなら、対象変数名に counter、式に {counter} + 1 と入力します。
  • 「変数を削除」: 対象にできるのは永続変数だけで、ストレージで設定した初期値(デフォルト値)に戻します。一時変数名を入れても何も起こりません。

「変数に演算を適用」は、オブジェクト型や、ユーザー・チャンネル・ロールといった参照型の変数には使えません(計算結果は最終的に文字列として扱われます)。

計算式の書き方

${ … } と「変数に演算を適用」の「式」では、次の演算子が使えます。優先順位はふつうの算数と同じで、丸かっこ ( ) で順番を変えられます。

種類演算子説明
足し算+数値の加算。どちらかが文字列なら連結
引き算-数値の減算
掛け算*数値の乗算
割り算/結果は小数で返ります(5 / 2 は 2.5)
余り%割った余り
比較< > <= >= == !=大小や一致を比べる
  • 式の中で文字を直接書くときは、"…" か '…' で囲みます(例: ${ {firstName} + " " + {lastName} })。
  • 比較の結果は、小文字の true / false として差し込まれます。種類の違う値どうしを比べると結果が得られず、空文字になります。
  • 文字列で足し算以外の計算をしたり、種類の違う値を比べたりすると、編集画面に警告が出ることがあります(保存はできます)。

数値を丸める

書き方結果例
round(x) / round(x, n)小数 n 桁に四捨五入します(n を省くと整数)。0.5 は 0 から遠い側に丸めます。n が負の数なら十の位・百の位…で丸めますround(2.5) → 3、round(-2.5) → -3、round(1234.5, -2) → 1200
floor(x)切り捨て(x 以下で最大の整数)floor(2.7) → 2、floor(-1.5) → -2
ceil(x)切り上げ(x 以上で最小の整数)ceil(2.1) → 3、ceil(-1.5) → -1

引数が数値でない、n が整数でない、n の絶対値が 15 を超える、引数の数が合わない、のいずれかに当てはまると、その ${ … } は空文字になります。

配列を式の中で扱う

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

${ {listA} + {listB} } のように + で配列どうしをつなげることもできます。

実際の動作と既定値

解決できない参照は書いたままの文字が残る

参照先が見つからない・式の評価に失敗した、という場合でもコマンドは止まらず、ユーザーにエラーも表示されません。

  • {存在しない変数} は、空文字ではなく {存在しない変数} という文字のまま残ります。1 回の実行につき変数名ごとに 1 度だけ警告がログに記録されます。
  • ${ … } の評価に失敗したとき(構文の誤り、${ 5 / 0 } のような 0 での割り算・余り計算など)は、その ${ … } が書いたまま残ります。式の中の {変数} だけは値に置き換わります。
  • ただし、${ … } の中で参照した変数が見つからないときは、その式全体が空文字になります。
  • ${ … } の結果に { … } の形が含まれていても、変数としては展開されません。

{ … } がそのまま表示されているときは、変数名のつづり、参照する順番(作成するノードより前で参照していないか)、使えないプロパティを指定していないかを確認してください。

値の型による扱い

  • 数値: 整数として表せる値は .0 を付けずに表示されます(5.0 は 5)。
  • 文字列型は数値に変換されない: 型が「文字列 (string)」の変数は、中身が 42 でも数値として扱われません。${ {output} + 100 } は 142 ではなく 42100 になります。計算に使う変数は「数値 (number)」型にしてください。数値型への変換に失敗したときは 0 になります。
  • 真偽値: true / yes / on / 1(大文字・小文字は区別しません)が真、それ以外は偽です。計算の中では true が 1、false が 0 として扱われます。
  • オブジェクト型・配列型: {変数名} で丸ごと参照すると、JSON 形式の文字列が差し込まれます。API リクエストの応答なども {apiReq_response.status} のようにたどって取り出せます。

配列の要素を式の外で取り出す

書き方取り出すもの
{変数名.0}その位置の要素(0 から数えます)
{変数名.length}要素の数
{変数名.first} / {変数名.last}最初 / 最後の要素

角かっこの {変数名}[0] と、[-1] のような負の番号は ${ … } の中でだけ使えます。

リストをまとめて扱う

配列型の変数と、{Guild.roles} のようなリストのプロパティには、次の書き方も使えます。

書き方結果
{変数名.join} / {変数名.join[ / ]}要素を区切りでつないだ文字列。区切りは [ ] の中に書き、省略すると , になります
{変数名.each[書式]}要素ごとに書式を当ててつないだ文字列(下記)
{変数名.random}ランダムに選んだ要素 1 つ。{変数名.random.name} のように続けてキーも読めます。空のリストでは解決されません
{変数名.empty}要素が 1 つも無ければ true
{変数名.sum}数値の要素の合計。数値が 1 つも無ければ 0
{変数名.highest} / {変数名.lowest}数値の要素の最大値 / 最小値。数値が 1 つも無ければ解決されません
{変数名.has[値]}一致する要素があれば true
{変数名.count[値]}一致する要素の数
{変数名.position[値]}最初に一致した要素の位置(0 から数えます)。無ければ -1
{変数名[キー=値]}キーの値が一致する最初の要素。{shop[name=Potion].price} のように続けてキーを読みます。無ければ解決されません
  • 要素がオブジェクトのときは、{shop.sum.price} {shop.highest.price} のようにキーを指定して集計できます。has count position も [name=Potion] のように「キー=値」で探せます。
  • 集計で数えるのは、数値と、"7" のように数値として読める文字列だけです。
  • 一致は、両方が数値として読めれば数値として比べます(5 と "5" は一致)。それ以外は文字列として、大文字・小文字を区別して比べます。
  • [ ] の中には {User.id} のような単純な変数を書けます({joined.has[{User.id}]})。その変数が解決できないと、参照全体が解決されません。[ ] = $ \ を文字として書くときは前に \ を付けます。{ } は書けません。
  • each has count position は [ ] を省略できません。
  • .each と .join の結果は文字列なので、後ろに続けて書けません。

each の書式

書式は要素ごとに繰り返され、次の記号が置き換わります。\n で改行します。

記号置き換わる値
$index位置(0 から数えます)
$number番号(1 から数えます)
$value要素そのもの
$キー名要素のキーやプロパティ($name、$mention など)

{bag.each[$number. $value\n]} は 1. sword 2. shield と 1 行ずつ並べます。要素に無いキーは $キー名 のまま表示されます。

件数の上限

  • .each と .join が出力するのは先頭 1,000 件・4,000 文字までです。4,000 文字を超える要素からあとは出力されません。
  • 集計・検索・[キー=値] が調べるのは先頭 10,000 件までです。

数値の表記

数値型の変数と数値のプロパティ({Guild.memberCount} など)は、次の書き方で表記を変えられます。

書き方1234567890 の結果説明
.formatted1,234,567,8903 桁ごとに , で区切ります
.scientific1.2345×10⁹指数表記。仮数部は小数 4 桁で切り捨てます
.japanese12億3456万7890万・億・兆などの単位を付けます。10 の 72 乗以上は .scientific と同じ指数表記になります
  • 負の数は先頭に - が付きます。.formatted と .japanese は整数部だけを変換し、小数部はそのまま付けます(1234.5 → 1,234.5)。
  • 結果は文字列なので、後ろに続けて書けません。{変数名.sum.formatted} のように集計の後ろには付けられます。
  • 文字列型の変数に入った数値("1234" など)には使えず、書いたままの文字が残ります。

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

{ … } の中では、次の種類の変数を参照できます。

種類例説明
基本情報{User.name} {Guild.name} {Channel.name} {Bot.name} {Now}実行した人・サーバー・チャンネル・現在時刻など
実行の文脈{Command.*} / {Event.*}カスタムコマンドの実行中は Command、カスタムイベントの実行中は Event が使えます。イベントでは Command は登録されません
コマンドの入力{option_user.mention}オプションで受け取った値
一時変数{変数名}「変数を設定」ノードなどで作った、その実行中だけ有効な変数
永続変数{BSVAR_変数名}実行をまたいで保存される変数
ループ変数{ループ変数名.index} {ループ変数名.count}現在の回数(0 から数えます)と合計回数。「変数を設定」で上書きすることはできません
  • {Now} と {Now.unix} は協定世界時(UTC)基準で、Bot が動いているホストのタイムゾーンには左右されません。時刻での条件分岐は Bot のタイムゾーンで判定します。
  • ボタンや選択メニューの分岐の中では、{Command.*} は「そのクリック」の文脈を指します。
  • {Event.*} で使える変数はイベントの中で使える変数をご覧ください。値が用意されない参照は文字列のまま残り、その参照を使った条件は false になります。
  • ユーザー・ロール・チャンネルなどを受け取るオプションはオブジェクトとして扱われます。「オプション変数」を option_user にした場合、{option_user} はオブジェクト全体、{option_user.mention} はメンションになります。

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

ドット記法は、組み込みの型(ユーザー・サーバー・チャンネル・ロール・日時・金額・URL・絵文字・スタンプ・メッセージ)と、オブジェクト型・配列型の変数の、決められたプロパティにだけ使えます。型ごとのプロパティはデータ型をご覧ください。

  • 文字列・数値・真偽値にドットを付けても解決されません({score.real} は無効です)。数値に付けられるのは数値の表記の 3 つだけです。
  • 用意されていないプロパティや、先頭がアンダースコアの名前({User._private} など)も解決されません。
  • ボタン・選択メニューの結果は、.user・.channel・.guild・.value・.label・.style・.disabled を参照できます。

上限とクールダウン

実行時間・ステップ数・ループ回数のプラン別の上限とクールダウンは、コマンドビルダーの上限とクールダウンにまとめています。補足として次の点があります。

  • 実行時間には、ボタンやモーダルの入力待ちの時間も含まれます。ただし、入力を受け取るたびに待ち時間ぶん延長されます。
  • ループの回数に上限より大きい値を指定しても、上限の回数で止まります。
  • ステップ数の上限を超えると警告が 1 回だけ表示され、残りのノードはスキップされます。メッセージの文面はコマンドビルダーの「表示されるメッセージ」をご覧ください。

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

  • ${ … } の中に、さらに ${ … } を入れることはできません。
  • {{変数名}} のように波かっこを 2 重にすることはできません。

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

最終更新:

目次