如果它们没有被删除,请求单元格

时间:2016-06-22 15:10:49

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

我有点担心我的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. 当我运行此脚本时,我面临以下错误:

  3.   

    未找到范围(第9行,文件&#34; SumIfNotStrikethrough&#34;

    因此,我该如何解决?

    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。不幸的是,这个问题与我之前的问题有所不同&#34;如果它们不是大胆的话,那就是Sum细胞&#34;。我分别尝试更改脚本,但它没有工作。是的,它将单元格相加,但它将所有单元格与穿透并且没有: - (。

    以下是我改变的内容:

    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;
    }
    

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

1 个答案:

答案 0 :(得分:0)

我已使用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)

现在它似乎在单次使用中正常工作。