【问题标题】:Sum cells if they are not strikethrough如果没有删除线,则对单元格求和
【发布时间】:2016-06-22 15:10:49
【问题描述】:

我有点卡住我的 Google Apps 脚本,该脚本旨在计算 不是 删除线的单元格的总和。

这是它的来源:

function SumIfNotStrikethrough(rangeA1Notation)
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet(); 
  var mysheet = sheet.getActiveSheet();

  var dataRange = mysheet.getDataRange();
  var mydatarange = mysheet.getRange(rangeA1Notation);
  var numRows = mydatarange.getLastRow();
  var rowindex = mydatarange.getRowIndex();
  var columnindex = mydatarange.getColumnIndex();

  var total =0;

  for(i=rowindex;i<=numRows;i++)
  {
    if(dataRange.offset(i-1, columnindex-1, 1, 1).isBlank() != true && dataRange.offset(i-1, columnindex-1, 1, 1).getFontLine() != "line-through")
    {
      var temp = dataRange.offset(i-1, columnindex-1, 1, 1).getValue();
      total = total + temp;
    }    
  }

  return total;
}

这是它的公式:=SumIfNotStrikethrough("J2")

我有两个问题:

  1. 如何添加 Google Apps 脚本以使用此公式,例如,SumIfNotStrikethrough(J2) 而不是 SumIfNotStrikethrough("J2")?引号在其他单元格上缩放公式后手动更改其范围非常烦人:-(。源代码中应该更改什么?

  2. 当我运行这个脚本时,我遇到了以下错误:

未找到范围(第 9 行,文件“SumIfNotStrikethrough”

那么,我该如何解决呢?

UPD № 1. 这是一个带有字符串引用的示例,但它只计算单元格的数量:

function countStrike(range) {
    var count = 0;
        SpreadsheetApp.getActiveSheet()
            .getRange(range)
            .getFontLines()
        .reduce(function (a, b) {
            return a.concat(b);
        })
        .forEach(function (el) {
            if (el === "line-through") {
                count++
            }
        });
    return count;
}

UPD № 2。不幸的是,这个问题与我之前的问题“如果单元格不是粗体,则求和”不同。我分别尝试更改脚本,但没有成功。是的,它对单元格求和 ,但它对所有带有删除线和没有删除线的单元格求和 :-(。

这是我改变的:

function SumIfNotStrikethrough(){
  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");
  }
  var weights = range.getFontLine();
  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] != "line-through" && typeof numbers[i][j] == "number") {
        x += numbers[i][j];
      }
    }
  }
  return x;
}

感谢您提前帮助我的所有尝试!

【问题讨论】:

  • 我在帖子更新中放了一个例子,但它只计算单元格的数量,而不是它的总和。
  • 您发布的这两个问题在概念上没有区别。
  • 是的!我尝试更改“如果单元格不是粗体则求和”的来源,但没有成功:-(。请参阅更新№2。
  • @soup,也许我应该更改源中的其他内容以使其正常工作?

标签: javascript google-apps-script google-drive-api


【解决方案1】:

我用getFontLines() 修改了建议的答案,而不是getFontLine()

function SumIfNotStrikethrough1(){
  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");
  }
  var lines = range.getFontLines();
  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 (lines[i][j] != "line-through" && typeof numbers[i][j] == "number") {
        x += numbers[i][j];
      }
    }
  }
  return x;
}

这是使用它的公式:=SumIfNotStrikethrough1(A2:B3)

现在这似乎在单次使用中可以正常工作。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多