Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果单元格不粗体,则对其求和_Javascript_Google Apps Script - Fatal编程技术网

Javascript 如果单元格不粗体,则对其求和

Javascript 如果单元格不粗体,则对其求和,javascript,google-apps-script,Javascript,Google Apps Script,我对我的GoogleApps脚本感到困惑,该脚本的目的是只在单元格粗体时计算单元格的总和 资料来源如下: 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.fromCharCo

我对我的GoogleApps脚本感到困惑,该脚本的目的是只在单元格粗体时计算单元格的总和

资料来源如下:

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(范围、startcol、startrow){
//从int转换为字母数字
//-感谢丹尼尔http://stackoverflow.com/a/3145054/2828136
var start\u col\u id=String.fromCharCode(64+startcol);
var end\u col\u id=String.fromCharCode(64+startcol+range[0]。长度-1);
var endrow=startrow+range.length-1
//构建范围字符串,然后获取字体权重
变量范围字符串=开始列id+startrow+:“+end列id+endrow”
var ss=SpreadsheetApp.getActiveSpreadsheet();
var getWeights=ss.getRange(range_string).getFontWeights();
var x=0;
var值;
对于(变量i=0;i
以下是公式:

=(SumIfNotBold(K2:K100,列(K2),行(K2))*1

我有三大顾虑:

  • 当我设置触发器在任何编辑中启动此脚本时,我意外地收到一封来自Google Apps的电子邮件,声明
  • TypeError:无法从未定义中读取属性“length”。(第7行,文件 “SumIfNotBold”)

    因此,我如何修复它?有没有办法忽略这些自动传递的通知

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

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


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

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

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

    大多数函数通过解析活动单元格中的公式来获取对传递范围的引用。警告:这是基于函数本身使用的假设,
    =sumifnotbold(B2:C4)
    。它不会在另一个函数中工作,如
    =max(A1,sumifnotbold(B2:C4)

    函数sumifnotbold(参考){
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sheet=SpreadsheetApp.getActiveSheet();
    var formula=SpreadsheetApp.getActiveRange().getFormula();
    var args=formula.match(/=\w+\(.*)/i)[1].split(“!”);
    试一试{
    如果(args.length==1){
    var range=sheet.getRange(args[0]);
    }
    否则{
    sheet=ss.getSheetByName(args[0]。替换(/'/g',);
    范围=sheet.getRange(args[1]);
    }
    }
    捕获(e){
    抛出新错误(args.join(“!”)+“不是有效范围”);
    }
    //以上所有内容都是从公式中提取的范围
    //现在开始实际计算
    var-weights=range.getFontWeights();
    var numbers=range.getValues();
    var x=0;
    对于(变量i=0;i
    以下是此脚本的一个版本,它解决了您提出的一些问题。如果使用另一个工作表,只需将其调用为
    =sumifnotbold(A3:C8)
    =sumifnotbold(Sheet2!A3:C8)

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

    大多数函数通过解析活动单元格中的公式来获取对传递范围的引用。警告:这是基于函数本身使用的假设,
    =sumifnotbold(B2:C4)
    。它不会在另一个函数中工作,如
    =max(A1,sumifnotbold(B2:C4)

    函数sumifnotbold(参考){
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sheet=SpreadsheetApp.getActiveSheet();
    var formula=SpreadsheetApp.getActiveRange().getFormula();
    var args=formula.match(/=\w+\(.*)/i)[1].split(“!”);
    试一试{
    如果(args.length==1){
    var range=sheet.getRange(args[0]);
    }
    否则{
    sheet=ss.getSheetByName(args[0]。替换(/'/g',);
    范围=sheet.getRange(args[1]);
    }
    }
    捕获(e){
    抛出新错误(args.join(“!”)+“不是有效范围”);
    }
    //以上所有内容都是从公式中提取的范围
    //现在开始实际计算
    var-weights=range.getFontWeights();
    var numbers=range.getValues();
    var x=0;
    对于(变量i=0;i
    当您在
    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;
    }