我有点担心我的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")
。
我在这里有两个问题:
如何添加Google Apps脚本以使用此公式,例如SumIfNotStrikethrough(J2)
而不是SumIfNotStrikethrough("J2")
?在缩放其他单元格上的公式后,手动更改其范围非常烦人:-(。源代码中应该更改哪些内容?
当我运行此脚本时,我面临以下错误:
未找到范围(第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;
}
感谢您提前帮助我的所有尝试!
答案 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)
。
现在它似乎在单次使用中正常工作。