変数変換ノードの使い方
「変数変換(ベータ版)」ノードでは、CallFlowで取得した変数を使って計算や文字列の組み立てを行い、結果を別のフロー変数へ保存できます。たとえば、単価と数量から合計金額を計算したり、購入回数から顧客区分を決めたりできます。
CEL(Common Expression Language)は、値の計算や比較に使う式の言語です。JavaScriptのような汎用プログラミング言語ではなく、CallFlowに渡された変数を使った計算や判定に用途を限定しています。外部通信、ファイル操作、任意のライブラリの読み込みはできません。
変数変換では、次の関数と演算子だけを使えます。括弧内は有効なextensionのversionです。
contains、startsWith、endsWith、matches、size、int、double、string、四則演算・比較・論理演算、および map / filter / all / exists マクロが使えます。
Bindings (v0)
Section titled “Bindings (v0)”cel.bindで式の途中の値に一時的な名前を付け、同じ式の中で再利用できます。
Strings (v4)
Section titled “Strings (v4)”trim、replace、split、join、lowerAscii、upperAscii、substring、indexOf、lastIndexOf、charAt、format、strings.quote、reverseが使えます。
Regex (v0)
Section titled “Regex (v0)”regex.replace、regex.extract、regex.extractAllが使えます。
Optional (v2)
Section titled “Optional (v2)”optional値のindex/access、orValue、optMap、optFlatMap、first、lastなどが使えます。
Lists (v2)
Section titled “Lists (v2)”distinct、sort、sortBy、slice、flatten、reverse、lists.rangeが使えます。
Math (v2)
Section titled “Math (v2)”math.least、math.greatest、math.abs、math.sign、math.ceil、math.floor、math.round、math.trunc、有限性チェック、math.sqrt、bitwise操作が使えます。
Sets (v0)
Section titled “Sets (v0)”sets.contains、sets.intersects、sets.equivalentが使えます。
json.decode(string)はstrict JSONのobject、array、string、number、boolean、nullをdynとして読み取ります。読み取った値は、そのままMapや配列の値として参照できます。
{"顧客名": json.decode(input["顧客情報"]).name}json.encode(dyn)はJSON互換の値を、object keyを昇順に並べた空白なしの決定的なJSON文字列へ変換します。Unicodeはそのまま出力されます。
{"JSON": json.encode({"z": "日本", "a": [1, true]})}この式の結果は {"a":[1,true],"z":"日本"} です。json.decodeはmalformed JSON、コメント、trailing comma、重複key、__proto__ / prototype / constructor、NaN / Infinity、有限でない指数、CEL int64範囲外の整数を受け付けません。値の深さは10(rootを0とする)、各配列・Mapは100要素、文字列は10,000文字までです。1回の変換では選択した入力全体と宣言した出力全体に、それぞれ総値数1,000を適用し、json.decode / json.encodeの各呼び出しでは対象値ごとに同じ上限を独立して適用します。Decode入力とEncode出力も10,000文字以内である必要があり、違反時は変数を更新せず失敗時の遷移先へ進みます。
date.parse(string, format)は、日付文字列をCELのtimestampへ変換します。一引数のoverloadはありません。formatで使えるtokenはyyyy、MM、ddと、時刻を指定する場合のHH(00〜23)およびmm(00〜59)だけです。yyyy / MM / ddは必須、各tokenは1回まで、HHとmmは指定するなら両方必須です。token以外はそのまま一致する区切り文字で、未知のASCII英数字、重複・不足token、引用符やバックスラッシュのliteral escapingは使えません。tokenの並べ替えと連結は使えますが、入力はゼロ埋めされたASCII数字による完全一致です。
日付だけの場合はAsia/Tokyo(JST)の00:00:00、時刻付きの場合は同じタイムゾーンの24時間制として解釈します。形式不正、桁不一致、実在しない日付、時刻範囲外は失敗時の遷移先へ進み、入力値や形式はエラーへ表示されません。
{ "曜日": date.parse("2026/08/29", "yyyy/MM/dd").getDayOfWeek("Asia/Tokyo"), "受付時刻": date.parse("2026/08/29 14:30", "yyyy/MM/dd HH:mm").getHours("Asia/Tokyo")}返り値のtimestampは式内の比較や標準timestamp操作に使う中間値です。出力MapはJSON-onlyのため、timestampを直接保存するとinvalid_outputになり、自動RFC3339変換もされません。string型のFlow変数へ時刻を出力する場合は、標準のstring(...)変換を明示的に使います。
{"受付日時": string(date.parse("2026/08/29 14:30", "yyyy/MM/dd HH:mm"))}この式は{"受付日時":"2026-08-29T05:30:00Z"}を返します。これ以外の暗黙変換や任意のtimestamp formattingは提供しません。
- CallFlowに「変数変換(ベータ版)」ノードを追加します。
- 「入力変数」で、CEL式から参照する変数を選択します。
- 「出力変数」で、計算結果を保存する変数を選択します。
- 「CEL式」に、出力変数をキーとしたMapを記述します。
- 成功時と失敗時の遷移先を設定します。
Mapは、変数名と値を組み合わせたデータです。CEL式が返すMapのキーは、選択した出力変数と完全に一致させてください。
次の3項目を1セットで設定します。
| 項目 | 設定例 |
|---|---|
| 入力変数 | 単価、数量 |
| 出力変数 | 合計金額 |
| CEL式 | {"合計金額": int(input["単価"]) * int(input["数量"])} |
通話中に収集した値は文字列として保存されます。整数として計算や比較に使う場合はint(input["変数名"])、小数を含む数値として扱う場合はdouble(input["変数名"])の形式で変換してください。たとえば"12.5"はintでは変換できないため、doubleを使います。
保存時に、通話実行時と同じCELの仕組みで式を確認し、CEL式の出力Mapと選択した出力変数を照合します。式に構文エラーがある場合、選択した出力変数がMapにない場合、未選択のキーや重複するキーがMapにある場合、または出力Mapを確認できない式の場合は保存できません。検証処理が一時的に利用できない場合も、未検証の式は保存されません。
変数を参照する
Section titled “変数を参照する”入力変数は、input["変数名"]の形式で参照します。日本語の変数名にも対応しています。
input["単価"]変数名を変更した場合、CEL式の記述は自動では変更されません。入力変数の選択とCEL式を手動で更新してください。
| 用途 | 記述例 |
|---|---|
| 足し算 | int(input["金額"]) + int(input["送料"]) |
| 掛け算 | int(input["単価"]) * int(input["数量"]) |
| 小数の掛け算 | double(input["単価"]) * double(input["数量"]) |
| 比較 | int(input["購入回数"]) >= 10 |
| 複数条件 | input["会員"] && int(input["購入回数"]) >= 10 |
| 条件で値を変える | int(input["購入回数"]) >= 10 ? "リピーター" : "通常" |
| 文字列をつなぐ | input["姓"] + " " + input["名"] |
| 文字数や件数 | size(input["商品名"]) |
| 候補に含まれるか | input["都道府県"] in ["東京都", "神奈川県"] |
合計金額を計算する
Section titled “合計金額を計算する”入力変数として「単価」と「数量」、出力変数として「合計金額」を選択します。
{"合計金額": int(input["単価"]) * int(input["数量"])}条件によって文字列を変える
Section titled “条件によって文字列を変える”入力変数として「購入回数」、出力変数として「顧客区分」を選択します。
{"顧客区分": int(input["購入回数"]) >= 10 ? "リピーター" : "通常"}途中の計算結果を再利用する
Section titled “途中の計算結果を再利用する”cel.bindを使うと、途中の計算結果に一時的な名前を付け、同じ式の中で再利用できます。次の例では、小計を一度だけ計算し、「小計」と「送料無料」の2つの出力に使用しています。
cel.bind( subtotal, int(input["単価"]) * int(input["数量"]), { "小計": subtotal, "送料無料": subtotal >= 5000 })この場合、出力変数として「小計」と「送料無料」の両方を選択してください。
成功時と失敗時の動作
Section titled “成功時と失敗時の動作”式の実行と出力の確認が完了すると、すべての出力変数がまとめて更新され、成功時の遷移先へ進みます。
式に誤りがある場合や、出力のキー・型が設定と一致しない場合は、変数を更新せずに失敗時の遷移先へ進みます。更新した値によって次の処理を変える場合は、後続に条件分岐ノードを接続してください。
設定できる上限
Section titled “設定できる上限”| 項目 | 上限 |
|---|---|
| ノード名 | 1〜100文字 |
| CEL式 | 1〜4,000文字 |
| 入力変数 | 50件 |
| 出力変数 | 1〜50件 |
