目前正在尝试找出如何创建自定义谷歌表格功能:
通过实验和尝试对我的脚本进行故障排除,结果抛出了不同的错误,这些错误没有意义或不能真正帮助我弄清楚如何进一步前进。
这是我到目前为止所拥有的:
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));
}
}
}
}
我有一些编程知识,但不足以在互联网上搜索并自己成功构建脚本。
提前谢谢您。
对于“线”的每个值 (
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:改编自检测单元格是否有删除线格式