在这里插入图片描述

“按单价和数量计算销售额”,模型很快给出 =B2*C2;“按部门汇总”,它也能写出 SUMIF 或 SUMIFS。

但公式能被写进单元格,只能证明语法像公式,不能证明结果符合业务。

公式错误至少有四种

第一种是语法错误,比如括号没闭合、函数名不存在。它最容易发现。

第二种是引用错误。模型本来应该引用 B2*C2,却因为表头判断偏了一行,写成了 B1*C1。

第三种是业务错误。公式计算过程完全合法,但“销售额”应该扣除退款,模型只算了单价乘数量。

第四种最隐蔽:第一行公式正确,批量填充后相对引用发生了偏移,某几行引用到了错误区域。

因此公式工具不能只是:

setFormula({ range, formula })

它还要承担验证职责。

在这里插入图片描述

写入之前先解析

SpreadJS 的计算引擎可以把公式转换成表达式。调用 formulaToExpression 时如果解析抛出异常,至少可以确定输入不是合法公式。

概念代码如下:

function validateFormula(sheet, formula, spread) {
  try {
    GC.Spread.Sheets.CalcEngine.formulaToExpression(
      sheet,
      formula,
      0,
      0,
      spread.options.referenceStyle ===
        GC.Spread.Sheets.CalcEngine.ReferenceStyle.r1c1
    );
    return { valid: true };
  } catch (error) {
    return { valid: false, message: error.message };
  }
}

这一步只能拦住语法问题,但非常值得做。模型生成的内容不能因为长得像代码,就跳过解析直接写入。

先写一个样本,再批量扩展

如果要给 3000 行填充公式,不要第一步就修改 3000 个单元格。

可以先选择 3 到 5 行有代表性的样本:

  • 第一行数据;
  • 中间一行;
  • 最后一行;
  • 包含空值的一行;
  • 包含异常值的一行。

在临时区域或预览状态中计算结果,再做规则校验:

{
  "formula": "=B2*C2",
  "samples": [
    {"row": 2, "expected": 1200, "actual": 1200},
    {"row": 57, "expected": 0, "actual": 0},
    {"row": 3001, "expected": 860, "actual": 860}
  ]
}

样本通过后再批量填充,比写完再看有没有报错可靠得多。

相对引用要交给表格引擎

模型经常会生成一整列公式数组。这不仅浪费 Token,也容易在行号上犯错。

更合理的方式是让模型只描述一个基准公式和目标范围,由确定性代码完成相对引用扩展。SpreadJS 的区域公式支持自动调整相对引用,适合把同一规则应用到多行。

模型负责说“销售额等于本行单价乘数量”,工具负责把基准公式应用到正确范围。不要让模型手写 3000 个只差行号的字符串。

计算结果也要做体检

合法公式仍然可能产生 #VALUE!、除零错误或不符合业务的结果。

执行后可以检查:

  • 错误值数量;
  • 空结果数量;
  • 是否出现循环引用;
  • 结果的最小值、最大值和分布;
  • 是否破坏已有公式;
  • 公式引用是否越过目标数据区。

SpreadJS 工作簿可以获取循环引用信息。对于财务和经营表,再加一层业务断言会更有效,例如:

销售额不得为负
毛利率应在 -100% 到 100% 之间
汇总金额应等于明细金额之和
新增公式不得引用隐藏的临时工作表

这些规则不是模型自己“想出来”的,而是产品团队和业务人员共同定义的。

让用户看到公式,不只看到答案

有些 AI 产品生成结果后,只显示“已完成”。这会让公式变成黑盒。

更好的反馈是:

已在 D2:D3001 填充销售额公式
基准公式:=B2*C2
抽样验证:5/5 通过
错误值:0
循环引用:0

如果任务涉及关键指标,还可以先预览公式和影响范围,让用户确认后再落表。

AI 可以提公式,验证必须由系统完成

生成公式是概率问题,执行公式是确定性问题,验证公式是工程问题。

真正可用的链路应该是:

理解业务意图
  -> 生成基准公式
  -> 语法解析
  -> 样本计算
  -> 业务断言
  -> 批量填充
  -> 结果体检

少了后面几步,AI 公式功能越方便,批量制造错误的速度也越快。

在这里插入图片描述

在 SpreadJS AI Agent 实战中,公式不会被当成一段字符串直接写入,而会进入结构化工具、预执行和结果回传链路。这也是把 Demo 变成业务功能的关键一步。

想把这套方案真正跑起来

公式能生成并不代表能安全落表。课程不会只演示模型输出,而会把结构化工具、知识查询、受控代码执行、预执行和失败恢复放在同一条链路中,帮助你建立“生成之后还要验证”的工程边界。

课程《从0到1掌握企业级表格 Agent 搭建》基于公开的 SpreadJS AI Agent 项目,共 7 节,每节约 20 分钟,从整体架构一路讲到安全确认、快照回滚和调试体系。

课程地址

对应源码

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务

更多推荐