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) ) ) ))
关键优化点说明
提取唯一骰子类型
- 用
SUBSTITUTE(A1, "-", "+-")将负号转换为+-,确保拆分时负向项独立成单独元素 - 拆分后通过
REGEXEXTRACT(..., "D(\d+)")提取所有骰子类型的数值,再用UNIQUE去重得到待处理的骰子类型数组
- 用
批量处理每种骰子类型
- 用
BYROW遍历唯一骰子类型数组,结合LAMBDA对每种骰子类型单独计算正负总数 - 正向/负向计算时,通过
FILTER筛选对应类型的项,用IFERROR(...,1)处理省略数量的掷骰(如D6自动补1)
- 用
解决D10识别问题
- 拆分后每个掷骰项独立,配合
^锚定匹配项开头,避免将D100误识别为D10,彻底解决原公式的D10匹配bug
- 拆分后每个掷骰项独立,配合
性能提升
- 原公式需为每种骰子类型编写重复逻辑,优化后仅需一次遍历唯一类型数组,公式长度压缩至原有的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+D10 | 2d6+-1d10 |
| D4-D4+3D20 | 1d4+-1d4+3d20 |
| 2D100-1D10+D10 | 2d100+-1d10+1d10 |
内容的提问来源于stack exchange,提问作者Rogue Scientist Allen
相关产品推荐
相关产品推荐

