跳到主要内容

计算字段使用说明

计算字段用于在数据集里补充业务分析需要的派生字段。它可以直接用表达式从当前数据集字段计算,也可以先在数据集中定义字段,再由图表绑定 Studio 脚本把结果写入。

计算字段常见于这些场景:

场景说明
行内计算根据当前记录或关联记录计算金额、时长、状态、分组标签
业务口径统一把经常重复使用的计算逻辑沉淀在数据集里,图表直接使用字段
外部指标补充图表先查询 Soln 表单聚合结果,再由脚本补充第三方系统、成员目录、审批或其他服务中的指标
图表后处理基于图表已聚合的数据计算目标值、完成率、预测值、告警值等

使用链路​

计算字段分两步使用:

  1. 在 数据集 中添加计算字段,确定字段名称、数据类型和值来源
  2. 在 字段与元数据 中设置字段身份和聚合方式
  3. 在 图表 中把计算字段放入字段槽位
  4. 如果值来源是 自定义脚本,还需要在图表的 绑定脚本 中选择 Studio 脚本,并配置匹配字段和赋值字段
  5. 点击 执行脚本,确认预览结果后保存图表

表达式型计算字段在数据集预览和图表查询中直接计算。脚本型计算字段在数据集里只定义字段结构,实际数值由图表查询后的绑定脚本回填。

在数据集中添加计算字段​

进入 数据集 配置页后:

  1. 选择左侧 数据集属性
  2. 在中间配置区点击 自定义列 图标
  3. 填写 字段名称
  4. 选择 数据类型
  5. 选择 值来源
  6. 按值来源配置表达式,或保存为脚本型字段
  7. 点击保存
配置项说明
字段名称图表中展示的字段名称,建议使用业务人员能理解的名称
数据类型计算结果的数据类型,支持文本、数字、日期、日期时间和布尔值
值来源决定字段值由表达式直接计算,还是由图表绑定脚本写入

保存后,计算字段会出现在数据集字段列表中。你可以在 字段与元数据 中继续调整语义名称、身份、聚合方式和启用状态。

值来源​

表达式​

表达式适合从当前数据集行直接推导结果。它可以使用主表单字段、关联表单字段和常用函数,适合规则固定、依赖当前行数据的计算。

常见用法:

场景示例
金额计算实际金额 = 订单金额 - 优惠金额
时间计算处理时长 = 完成时间 - 创建时间
状态判断是否逾期 = 截止时间早于当前时间
分组标签客户等级 = 根据累计金额判断 A/B/C

表达式字段可以在数据集预览中直接检查结果。配置后建议先预览数据,再保存数据集。

自定义脚本​

自定义脚本适合结果不能只靠当前行表达式得到的场景。选择 自定义脚本 后,数据集保存的是一个脚本型计算字段;这个字段不会在数据集预览中直接计算,而是在图表查询时由 绑定脚本 写入结果。

脚本型计算字段适合:

场景说明
第三方指标根据图表分类去外部系统查询目标值、预算、汇率、库存、广告消耗等
Soln 内部补充使用 Studio SDK 查询表单记录、成员、部门、组织、审批或权限信息后补充指标
多步骤规则需要多次查询、条件分支、映射表、复杂权重或算法时使用脚本
聚合后计算图表已经按地区、月份、负责人聚合后,再计算完成率、目标差额、预测值
指标卡补值指标卡只需要一个全局结果,例如目标金额、外部余额、实时汇率

如果计算只依赖当前行字段,优先使用表达式;如果计算依赖图表聚合结果、其他系统或复杂运行时逻辑,再使用自定义脚本。

字段身份和聚合方式​

计算字段保存后,需要在 字段与元数据 中设置字段身份。

身份用途
维度用于分类、分组、横轴、颜色或筛选
指标用于数值统计、纵轴、大小、指标卡或目标值

脚本型计算字段通常作为 指标 使用,并且数据类型应选择 数字。图表绑定脚本目前只会把脚本结果写入数字型计算指标。

聚合方式决定同一个图表点匹配到多条脚本结果时如何合并:

聚合方式脚本回填规则
无只允许一条结果;匹配到多条结果会报重复结果错误
求和把多条结果相加
平均计算多条结果的平均值
最大值取最大值
最小值取最小值
计数统计可转换为数字的结果数量
去重计数对可转换为数字的结果去重后计数

无 只适合值来源为自定义脚本的计算字段,用于要求脚本结果和图表点一一对应的场景。普通字段和表达式字段不会使用 无 作为聚合方式。

在图表中绑定脚本​

当图表使用了脚本型计算字段时,需要在图表编辑器里配置 绑定脚本。

操作步骤:

  1. 打开图表编辑器
  2. 把脚本型计算字段放入指标槽位,例如 Y 轴指标、指标卡指标或目标指标
  3. 进入左侧 绑定脚本 配置区
  4. 选择一个 Studio 脚本
  5. 按需要配置 匹配字段
  6. 在 赋值字段 中选择计算字段,并填写脚本返回结果中的字段名
  7. 点击 执行脚本
  8. 查看右侧预览,确认结果正确后保存图表

绑定脚本执行顺序是:

  1. 图表先按维度、指标、筛选条件、基础记录数查询 Soln 数据集
  2. 查询结果会整理成 chartData 传给 Studio 脚本
  3. Studio 脚本返回数组或 { rows: [...] }
  4. 系统按匹配字段找到对应图表点
  5. 系统把脚本结果字段写入对应的脚本型计算字段
  6. 图表使用回填后的数据重新渲染预览

脚本入参​

绑定脚本是 Studio 脚本,入口函数和 Soln SDK 文档中的脚本写法一致:

export default async function main(
_payload: StudioScriptRuntimeContextPayload,
_context: StudioScriptContext
) {
return { rows: [] };
}

图表绑定脚本始终接收 soln.runtime-context/v1。数据集身份位于 payload.source,查询选项和图表数据位于 payload.input:

路径说明
payload.source.datasetId当前图表使用的数据集 ID
payload.source.dimensions当前图表查询使用的维度字段 key
payload.source.measures当前图表查询使用的指标字段 key
payload.input.condition当前图表筛选条件
payload.input.timeGrain时间粒度,例如 day、week、month
payload.input.baseRecordTimeField基础记录取数使用的时间字段,通常是 updatedAt 或 createdAt
payload.input.chartData图表聚合后的数据,包括分类、字段信息、系列和行数据

chartData 的常用结构:

type BindingChartData = {
categories: string[];
dimensions: Array<{
key: string;
name: string;
apiName: string;
dataType: string;
}>;
measures: Array<{
key: string;
name: string;
apiName: string;
dataType: string;
aggregationType: string;
valueSource: string | null;
}>;
series: Array<{
fieldKey: string;
fieldName: string;
aggregationType: string;
groupFieldKey?: string | null;
groupValue?: string | null;
data: Array<number | null>;
}>;
rows: Array<Record<string, unknown>>;
};

chartData.rows 是脚本最常用的数据。每一行代表一个图表点或一个“分类 + 分组”组合,并带有这些系统字段:

字段说明
__rowIndex图表点行号;脚本直接按行号回填时使用
__categoryIndex当前分类在 categories 中的位置
__category当前分类名称

除此之外,行里还会包含当前图表维度字段和指标字段,key 使用数据集字段 key。

脚本返回格式​

脚本需要返回行数组,支持三种写法:

return [
{ __rowIndex: 0, targetAmount: 1000 },
{ __rowIndex: 1, targetAmount: 2000 },
];
return {
rows: [
{ province: '广东省', targetAmount: 1000 },
{ province: '浙江省', targetAmount: 2000 },
],
};
return {
data: [
{ month: '2026-01', targetAmount: 5000 },
],
};

返回对象中的数组字段可以是 rows、items 或 data。数组里的每一项都应该是普通对象。

匹配字段和赋值字段​

匹配字段 决定脚本结果写入哪一个图表点。

配置说明
数据集字段当前图表数据中的字段,例如省份、月份、负责人
脚本结果字段脚本返回行中用于匹配的字段,例如 province、month、ownerName

如果配置了匹配字段,系统会把 chartData.rows 中的数据集字段值和脚本返回行中的结果字段值进行匹配。匹配成功后,脚本结果才会写入对应图表点。

赋值字段 决定脚本结果里的哪个字段写入哪个计算字段。

配置说明
计算字段数据集中值来源为自定义脚本的数字型计算指标
脚本结果字段脚本返回行中要写入的字段,例如 targetAmount、budget、rate

如果没有配置赋值字段,系统会尝试使用计算字段 key 或 API Name 从脚本返回行中读取同名字段。为了让配置更清晰,建议在图表中显式配置赋值字段。

无匹配字段的单行结果​

如果不配置匹配字段,并且脚本只返回一行结果,系统会默认把这一行写入第 0 个图表点。这适合指标卡或单行总计。

示例:

export default async function main(_payload: StudioScriptRuntimeContextPayload) {
return {
rows: [
{ targetAmount: 100000 },
],
};
}

如果图表有多个分类,通常应该配置匹配字段,或者在返回行中显式带上 __rowIndex。

示例:按图表行计算目标值​

这个示例直接读取 chartData.rows,按每个图表点当前销售额计算目标值。

type BindingInput = {
chartData: {
rows: Array<Record<string, unknown>>;
};
};

export default async function main(payload: StudioScriptRuntimeContextPayload) {
const input = payload.input as BindingInput;
return {
rows: input.chartData.rows.map((row) => {
const sales = Number(row['t0.amount'] || 0);

return {
__rowIndex: row.__rowIndex,
targetAmount: Math.round(sales * 1.2),
};
}),
};
}

图表中配置:

配置项值
赋值字段计算字段:目标金额;脚本结果字段:targetAmount
匹配字段不需要,因为脚本返回了 __rowIndex

示例:按省份匹配外部结果​

这个示例适合图表按省份展示,脚本返回每个省的目标金额。

type BindingInput = {
chartData: {
rows: Array<Record<string, unknown>>;
};
};

export default async function main(payload: StudioScriptRuntimeContextPayload) {
const input = payload.input as BindingInput;
const provinces = input.chartData.rows.map((row) => String(row['t0.province'] || ''));

const targetByProvince: Record<string, number> = {
广东省: 120000,
浙江省: 90000,
江苏省: 85000,
};

return {
rows: provinces.map((province) => ({
province,
targetAmount: targetByProvince[province] || 0,
})),
};
}

图表中配置:

配置项值
匹配字段数据集字段:省份;脚本结果字段:province
赋值字段计算字段:目标金额;脚本结果字段:targetAmount

如果脚本返回的粒度比图表更细,例如一个省返回多条城市目标,系统会按计算字段的聚合方式处理多条结果。目标金额一般选择 求和。

示例:使用 Soln SDK 查询表单数据​

脚本可以使用 studioScriptContext 调用 Soln SDK。SDK 详细能力请查看 Soln SDK。

下面示例从一个目标表单中读取省份目标,然后回填到图表。

type BindingInput = {
chartData: {
rows: Array<Record<string, unknown>>;
};
};

export default async function main(
payload: StudioScriptRuntimeContextPayload,
context: StudioScriptContext
) {
const input = payload.input as BindingInput;
const provinceNames = Array.from(
new Set(input.chartData.rows.map((row) => String(row['t0.province'] || '')))
).filter(Boolean);

const targetRecords = await context.form.list({
formApiName: 'sales_targets',
limit: 100,
condition: {
logic: 'and',
children: [
{
field: 'province',
operator: 'in',
value: provinceNames,
},
],
},
});

return {
rows: targetRecords.items.map((record) => ({
province: record.data.province,
targetAmount: record.data.targetAmount,
})),
};
}

图表中配置省份匹配字段,并把 targetAmount 写入目标金额计算字段。

示例:调用第三方数据​

如果当前 Studio 脚本运行环境允许外部请求,可以在脚本中使用运行时支持的 HTTP 能力调用第三方系统。常见做法是先从 chartData.rows 取出当前图表分类,再批量请求外部服务。

type BindingInput = {
chartData: {
rows: Array<Record<string, unknown>>;
};
};

export default async function main(
payload: StudioScriptRuntimeContextPayload,
context: StudioScriptContext
) {
const input = payload.input as BindingInput;
const months = input.chartData.rows.map((row) => String(row['t0.month'] || ''));

const response = await context.http.requestJson({
url: 'https://example.com/api/monthly-targets',
method: 'POST',
json: { months },
});

if (!response.ok) {
throw new Error('MONTHLY_TARGET_REQUEST_FAILED');
}

const result = response.data as {
rows: Array<{ month: string; targetAmount: number }>;
};

return {
rows: result.rows,
};
}

外部请求失败时,可以抛出错误让图表预览显示失败,也可以用 try/catch 转成空结果或默认值。错误处理方式可参考 Soln SDK 中关于脚本错误的说明。

常见问题​

数据集预览里看不到脚本字段结果​

这是正常现象。脚本型计算字段由图表绑定脚本回填,数据集预览不会执行图表绑定脚本。请在图表编辑器中点击 执行脚本 查看结果。

图表里脚本字段没有值​

可以按顺序检查:

  1. 图表是否选择了包含脚本型计算字段的数据集
  2. 计算字段是否是数字类型,并作为指标放入图表槽位
  3. 图表是否选择了 Studio 脚本
  4. 赋值字段中的脚本结果字段名是否和脚本返回一致
  5. 匹配字段是否能在 chartData.rows 和脚本返回行中找到相同值
  6. 脚本返回是否是数组、{ rows: [...] }、{ items: [...] } 或 { data: [...] }

匹配到多条脚本结果时报错​

如果聚合方式是 无,同一个图表点只能匹配一条脚本结果。需要一对多合并时,把计算字段聚合方式改为 求和、平均、最大值、最小值、计数 或 去重计数。

应该用表达式还是自定义脚本​

优先判断数据来源:

判断建议
只依赖当前行字段使用表达式
需要主表和关联表字段做固定计算使用表达式
需要图表聚合后的分类、分组或指标使用自定义脚本
需要查询其他 Soln 数据、成员、部门、审批或权限信息使用自定义脚本,并参考 Soln SDK
需要第三方系统数据使用自定义脚本

最佳实践​

  • 字段名称使用业务语言,例如“目标金额”“完成率”“外部库存”
  • 脚本型指标的数据类型选择 数字
  • 能用表达式解决的计算,不要改成脚本
  • 脚本返回字段名保持稳定,例如 targetAmount、budgetAmount、completionRate
  • 图表里显式配置赋值字段,避免依赖同名字段自动匹配
  • 多行结果需要合并时,提前设置好计算字段聚合方式
  • 脚本中优先批量查询,避免按每个图表点单独请求
  • 涉及外部系统时,处理请求失败、空值和超时,避免图表预览不可用