【问题标题】:Sum cells if they are not bold对非粗体的单元格求和
【发布时间】:2016-10-24 04:54:17
【问题描述】:

我对我的 Google Apps 脚本感到困惑,该脚本旨在仅当这些单元格为粗体时才计算单元格的总和。

这里是来源:

function SumIfNotBold(range, startcol, startrow){
  // convert from int to ALPHANUMERIC 
  // - thanks to Daniel at http://stackoverflow.com/a/3145054/2828136
  var start_col_id = String.fromCharCode(64 + startcol);
  var end_col_id = String.fromCharCode(64 + startcol + range[0].length -1);
  var endrow = startrow + range.length - 1

  // build the range string, then get the font weights
  var range_string = start_col_id + startrow + ":" + end_col_id + endrow
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var getWeights = ss.getRange(range_string).getFontWeights();

  var x = 0;
  var value;
  for(var i = 0; i < range.length; i++) {
    for(var j = 0; j < range[0].length; j++) {
      if(getWeights[i][j].toString() != "bold") {
        value = range[i][j];
        if (!isNaN(value)){
          x += value;
        }
      }
    }
  }
  return x;

公式如下:

=(SumIfNotBold(K2:K100,COLUMN(K2), ROW(K2)))*1

我主要担心三个问题:

  1. 当我设置触发器以在任何编辑上启动此脚本时,我不小心收到了一封来自 Google Apps 的电子邮件,指出

TypeError:无法从未定义中读取属性“长度”。 (第 7 行,文件 "SumIfNotBold")

那么,我该如何解决呢?有什么方法可以忽略这些自动发送的通知?

  1. 如果单元格在另一个列表中,则公式不会计算单元格的总和。例如,如果我将公式放在 B 列表中,但单元格位于 A 列表中,则此脚本在推导错误计算方面无法正常工作。

  2. 当单元格值更新时,公式推导不会。在这种情况下,我正在刷新公式本身(即,将“K2:K50”更改为“K3:K50”并返回一次)以获得更新的推导。

请帮我解决这个脚本的问题。或者,如果最好使用一个新的来计算非粗体单元格中的总和,那么我很乐意接受您的新解决方案。

【问题讨论】:

  • 当您设置触发器“在任何编辑时启动此脚本”时,您希望它的总和范围是多少?它怎么知道你想要什么范围?
  • @soup,是的,这很明显,但我做到了,因为我需要更新 SumIfNotBold 的派生,因为我进行了编辑。正如我在描述中所写,它不会自动更改,这就是我设置触发器的原因。您对我如何重写以使其更“灵活”有任何假设吗?

标签: javascript google-apps-script


【解决方案1】:

这里是这个脚本的一个版本,它解决了您提出的一些问题。如果使用另一张纸,它被简单地调用为=sumifnotbold(A3:C8)=sumifnotbold(Sheet2!A3:C8)

与任何自定义函数一样,如果编辑了它所引用的范围内的条目,它会自动重新计算。 如果您将字体从粗体更改为正常或变回,它不会自动重新计算。在这种情况下,您可以通过在其求和范围内的任何非空单元格上删除-撤消来快速刷新该函数。 (即删除某个号码,然后撤消删除。)

大部分函数通过解析活动单元格中的公式来获取对传递范围的引用。 警告:这是基于函数单独使用的假设,=sumifnotbold(B2:C4)。它不适用于像=max(A1, sumifnotbold(B2:C4) 这样的另一个函数。

function sumifnotbold(reference) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i)[1].split('!');
  try {
    if (args.length == 1) {
      var range = sheet.getRange(args[0]);
    }
    else {
      sheet = ss.getSheetByName(args[0].replace(/'/g, ''));
      range = sheet.getRange(args[1]);
    }
  }
  catch(e) {
    throw new Error(args.join('!') + ' is not a valid range');
  }

  // everything above is range extraction from the formula
  // actual computation begins now

  var weights = range.getFontWeights();
  var numbers = range.getValues();  
  var x = 0;
  for (var i = 0; i < numbers.length; i++) {
    for (var j = 0; j < numbers[0].length; j++) {
      if (weights[i][j] != "bold" && typeof numbers[i][j] == 'number') {
        x += numbers[i][j];
      }
    }
  }
  return x;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多