自定义 Google Sheets Appscripts 功能问题:

问题描述 投票:0回答:1

目前正在尝试找出如何创建自定义谷歌表格功能:

  • 采用给定范围,例如 C4:C13 等列,
  • 遍历每个单元格并检查单元格内的任何给定值(都是货币值,没有字符串)是否有删除线,
  • 返回每个带删除线的值的总和(不是带删除线的单元格总数)。

通过实验和尝试对我的脚本进行故障排除,结果抛出了不同的错误,这些错误没有意义或不能真正帮助我弄清楚如何进一步前进。

这是我到目前为止所拥有的:

function SUM_STRIKETHROUGH(range) {
    //if (!range || !range.length) {
    //  return 'Invalid range';
    //}

    var sum = 0;
    var sheet = SpreadsheetApp.getActiveSheet();
    var range2 = sheet.getRange(range)
    var value = range2.getValue();

    for (var i = 0; i < range.length; i++) {
        for (var j = 0; j < range[i].length; j++) {
            if (value.getValue.isStrikethrough()) {
                sum += value.getValue;
            }
        }
    }
    return sum;
}

// Refreshes the custom function every time the sheet is edited.

function onEdit(e) {
    var sheet = e.source.getActiveSheet();
    var range = sheet.getDataRange();
    var formulas = range.getFormulas();
    for (var i = 0; i < formulas.length; i++) {
        for (var j = 0; j < formulas[i].length; j++) {
            if (formulas[i][j].indexOf('SUM_STRIKETHROUGH') !== -1) {
                var rangeString = formulas[i][j].replace('=SUM_STRIKETHROUGH(', '').replace(')', '');
                var rangeArray = sheet.getRange(rangeString);
                var rangeValues = rangeArray.getValues(); // get the actual values
                sheet.getRange(i + 1, j + 1).setValue(SUM_STRIKETHROUGH(rangeValues));
            }
        }
    }
}

我有一些编程知识,但不足以在互联网上搜索并自己成功构建脚本。

提前谢谢您。

google-sheets google-apps-script google-sheets-formula appscript
1个回答
0
投票

改编自检测单元格是否有删除线格式

对于“线”的每个值 (

var lines = range.getFontLines()
),都有一个等效的“单元格值”(
var values = range.getValues()
)。

因此,如果行值=“line-through”(

if (lines[i][j] == 'line-through')
),则应用于“values”数组的数组参数(i&j)将返回相应的值(
values[i][j]
),该值可以添加到一个计数器(
sumofStrikethrough = sumofStrikethrough + values[i][j]
)。


/**
 * Sums strikethough values
 *
 * @param {A1 or C4:C13} input The range of cells to evaluate.
 * @return sum of values with FontLine value of 'line-through'
 * 
 * @customfunction
 */
function SUM_STRIKETHROUGH(input) {
  
  var sheet = SpreadsheetApp.getActiveSheet();
  var formula = SpreadsheetApp.getActiveRange().getFormula();
  var fParts=formula.split(')').shift()
  var rang=fParts.split('(').pop()
 

  try {
    var range = sheet.getRange(rang);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  var values = range.getValues()
  var lines = range.getFontLines();
  var sumofStrikethrough = 0  
  for (var i in lines) {
    for (var j in lines[i]) {
      Logger.log("i:"+i+", j:"+j+", line value:"+lines[i][j]+", value:"+values[i][j]);
      if (lines[i][j] == 'line-through'){
        sumofStrikethrough = sumofStrikethrough + values[i][j]
      }
    }
  }
  return sumofStrikethrough;
}

h/t:@JasonWilson。 Webapps:改编自检测单元格是否有删除线格式

© www.soinside.com 2019 - 2024. All rights reserved.