My goal is to have Google Sheets detect when a cell's contents has a strikethrough added, and to change the font color of that cell in response. I learned that this is not possible without an Apps Script integration.
First, I needed a function that identifies whether a cell has strikethrough text. I found this code on Stack Exchange, and it works as a formula when used in a sheet:
function has_strikethrough(reference) { 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 lines = range.getFontLines(); // return lines.length; var output = []; for (var i = 0; i < lines.length; i++) { output.push(lines[i].map(function(a) {return a == 'line-through';})); } return output;}It allows me to derive a boolean result if I use this formula:
=has_strikethrough(A1)=TRUEThis cannot be integrated into a conditional rule within Google Sheets, however, and for that, I learned that I need to create a conditional directly in Apps Script. I found some simple default code that is supposed to do this, but I don't seem to know how to integrate my strikethrough function into it properly. When I add the following code, and include the "whenFormulaSatisfied" boolean, the function breaks and the conditional does not work:
var sheet = SpreadsheetApp.getActiveSheet();var range = sheet.getRange("C3:D");var rule = SpreadsheetApp.newConditionalFormatRule() .whenFormulaSatisfied("=has_strikethrough(C3)=TRUE") .setFontColor("#666") .setRanges([range]) .build();var rules = sheet.getConditionalFormatRules();rules.push(rule);sheet.setConditionalFormatRules(rules);Running in the console gives this error:
ReferenceError: args is not definedIs there a simple step I'm missing? Any help would be appreciated. Thanks!