You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets RPG骰子记法合并公式优化求助:精简长公式提性能

优化Google Sheets骰子记法清理公式方案

核心思路

通过提取输入文本中的唯一骰子类型数组,批量遍历处理每种骰子的正向/负向掷骰总数,替代原公式中重复编写的单骰子类型子公式,大幅缩短公式长度并提升性能。

完整优化公式

=TEXTJOIN("+", TRUE, BYROW(
  UNIQUE(REGEXEXTRACT(SPLIT(SUBSTITUTE(A1, "-", "+-"), "+"), "D(\d+)")),
  LAMBDA(d,
    LET(
      // 拆分表达式为正负独立项
      split_items, SPLIT(SUBSTITUTE(A1, "-", "+-"), "+"),
      // 计算当前骰子类型的正向掷骰总数(处理省略数量的情况,如"D6"视为1D6)
      pos_sum, SUM(IFERROR(REGEXEXTRACT(FILTER(split_items, REGEXMATCH(split_items, "^(\d*)D"&d)), "^(\d*)D"&d), 1)),
      // 计算当前骰子类型的负向掷骰总数(处理"-D6"视为-1D6)
      neg_sum, SUM(IFERROR(REGEXEXTRACT(FILTER(split_items, REGEXMATCH(split_items, "^-(\d*)D"&d)), "^-(\d*)D"&d), 1)) * -1,
      // 生成当前骰子类型的简化字符串
      pos_str, IF(pos_sum > 0, pos_sum&"d"&d, ""),
      neg_str, IF(neg_sum < 0, IF(pos_sum > 0, "+", "")&neg_sum&"d"&d, ""),
      // 返回非空结果,过滤无掷骰的类型
      IF(pos_str&neg_str = "",, pos_str&neg_str)
    )
  )
))

关键优化点说明

  1. 提取唯一骰子类型

    • 用SUBSTITUTE(A1, "-", "+-")将负号转换为+-,确保拆分时负向项独立成单独元素
    • 拆分后通过REGEXEXTRACT(..., "D(\d+)")提取所有骰子类型的数值,再用UNIQUE去重得到待处理的骰子类型数组
  2. 批量处理每种骰子类型

    • 用BYROW遍历唯一骰子类型数组,结合LAMBDA对每种骰子类型单独计算正负总数
    • 正向/负向计算时,通过FILTER筛选对应类型的项,用IFERROR(...,1)处理省略数量的掷骰(如D6自动补1)
  3. 解决D10识别问题

    • 拆分后每个掷骰项独立,配合^锚定匹配项开头,避免将D100误识别为D10,彻底解决原公式的D10匹配bug
  4. 性能提升

    • 原公式需为每种骰子类型编写重复逻辑,优化后仅需一次遍历唯一类型数组,公式长度压缩至原有的1/7左右
    • 若需应用到500行,可将公式改为数组版本(替换A1为A:A),一次性处理整列,避免下拉操作带来的重复计算开销:
      =ARRAYFORMULA(IF(A:A="",, TEXTJOIN("+", TRUE, BYROW(
        UNIQUE(REGEXEXTRACT(SPLIT(SUBSTITUTE(A:A, "-", "+-"), "+"), "D(\d+)")),
        LAMBDA(d,
          LET(
            split_items, SPLIT(SUBSTITUTE(A:A, "-", "+-"), "+"),
            pos_sum, SUM(IFERROR(REGEXEXTRACT(FILTER(split_items, REGEXMATCH(split_items, "^(\d*)D"&d)), "^(\d*)D"&d), 1)),
            neg_sum, SUM(IFERROR(REGEXEXTRACT(FILTER(split_items, REGEXMATCH(split_items, "^-(\d*)D"&d)), "^-(\d*)D"&d), 1)) * -1,
            pos_str, IF(pos_sum > 0, pos_sum&"d"&d, ""),
            neg_str, IF(neg_sum < 0, IF(pos_sum > 0, "+", "")&neg_sum&"d"&d, ""),
            IF(pos_str&neg_str = "",, pos_str&neg_str)
          )
        )
      ))))
      

测试示例

输入表达式输出结果
1D6+1D6-2D10+D102d6+-1d10
D4-D4+3D201d4+-1d4+3d20
2D100-1D10+D102d100+-1d10+1d10

内容的提问来源于stack exchange,提问作者Rogue Scientist Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:05:34