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

Google Sheets自定义Apps Script函数求助:求和带删除线的货币值

Google Sheets自定义Apps Script函数求助:求和带删除线的货币值

兄弟,我看你在做Google Sheets自定义函数的时候踩了不少坑,正好我之前也折腾过类似的需求,来给你捋清楚怎么解决!

首先先对齐下你的需求:做一个函数,传入一个单元格范围(比如C4:C13),遍历每个单元格检查是否有删除线格式,把带删除线的货币值加总,最后返回货币格式的总和对吧?就像你举的例子,C5和C7带删除线,30+90=120,最终返回$120.00,这个需求完全没问题。

先给你拆解下你遇到的两个错误:

  • Exception: Range not found. 大概率是你在自定义函数里错误地用字符串(比如"$C$4:$C$13")去调用getRange(),或者没正确计算单元格的实际位置导致的;
  • Type: Function (like .getRange() or .getValue()) does not exist. 这是新手踩的高频坑!自定义函数的参数传入的是单元格的值/二维数组,不是Google Apps Script里的Range对象,所以你直接对参数调用Range的方法肯定报错——数组根本没这些方法啊!

下面给你一个亲测有效的完整代码,我会逐行讲清楚关键逻辑:

function SUM_STRIKETHROUGH(range) {
  // 获取当前正在编辑的工作表
  const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // 处理传入的范围:如果是单个单元格,转成二维数组格式,统一遍历逻辑
  if (!Array.isArray(range[0])) {
    range = [[range]];
  }

  let totalSum = 0;

  // 遍历传入范围的每一行每一列
  range.forEach((row, rowOffset) => {
    row.forEach((cellValue, colOffset) => {
      // 计算当前单元格的实际行列号:从函数的活动范围起始位置,加上遍历的偏移量
      const actualRow = activeSheet.getActiveRange().getRow() + rowOffset;
      const actualCol = activeSheet.getActiveRange().getColumn() + colOffset;
      // 获取对应的单元格对象
      const targetCell = activeSheet.getRange(actualRow, actualCol);
      // 获取单元格的字体线条格式(删除线对应的返回值是'line-through')
      const fontLine = targetCell.getFontLine();

      // 检查:有删除线,且单元格值是数字(避免纯文本格式的货币值被误加)
      if (fontLine === 'line-through' && typeof cellValue === 'number') {
        totalSum += cellValue;
      }
    });
  });

  // 把总和格式化成带两位小数的货币格式返回
  return Utilities.formatString("$%.2f", totalSum);
}

关键逻辑解释:

  1. 统一range参数格式:自定义函数传单个单元格时,参数是单个值;传连续范围时是二维数组,先统一成二维数组,方便后续遍历。
  2. 计算真实单元格位置:因为拿不到直接的Range对象,所以通过函数的活动范围起始行列,加上遍历的偏移量,算出每个单元格的真实位置,再获取它的格式。
  3. 检查删除线格式:用getFontLine()方法获取字体线条属性,返回line-through就说明单元格有删除线。
  4. 返回货币格式结果:用Utilities.formatString()把总和转成带$符号的两位小数格式,完全匹配你要的输出效果。

使用方法:

在Google Sheets的单元格里直接输入=SUM_STRIKETHROUGH(C4:C13),选中你要处理的范围就行,首次使用需要授权脚本(按照提示操作就行,安全的,毕竟是你自己写的脚本)。

额外注意事项:

  • 确保你的货币值是数字格式(不是纯文本),不然typeof cellValue会是string,不会被计入总和;
  • 要是遇到格式不生效的情况,检查单元格的删除线是不是应用在整个单元格上(这个函数只检查整个单元格的字体格式,不处理单元格内部分文本带删除线的情况);
  • 如果要处理不连续的多个范围,可以修改函数支持多参数,但当前版本已经满足连续范围的需求。

备注:内容来源于stack exchange,提问作者Conrad Kadelbach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:14:36