Javascript 如果单元格不粗体,则对其求和
我对我的GoogleApps脚本感到困惑,该脚本的目的是只在单元格粗体时计算单元格的总和 资料来源如下: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
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
我有三大顾虑:
请帮助我解决此脚本的问题。或者,如果最好使用新的脚本来计算非粗体单元格中的和,那么我很乐意接受您的新解决方案。以下是此脚本的一个版本,它解决了您提出的一些问题。它被简单地调用为
=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;
}