Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

282
Views
How to code "re-run custom function" button in Google Sheet custom function?

I'm having the problem lots are having where my Apps Script code on Gsheets doesn't automatically update unless it registers a change in the parameters. The custom function I'm using counts the number of cells that are highlighted a specific color. Changing the color of a cell doesn't re-run the script. I wanted to add a check box in a cell and every time I click it, it reruns the function.

function COUNTCOLOR(countRange,colorRef,recalc) {
  var activeRg = SpreadsheetApp.getActiveRange();
  var activeSht = SpreadsheetApp.getActiveSheet();
  var activeformula = activeRg.getFormula();
  var countRangeAddress = activeformula.match(/\((.*)\,/).pop().trim();
  var backGrounds = activeSht.getRange(countRangeAddress).getBackgrounds();
  var colorRefAddress = activeformula.match(/\,(.*)\)/).pop().trim();
  var BackGround = activeSht.getRange(colorRefAddress).getBackground();
  var countCells = 0;
  for (var i = 0; i < backGrounds.length; i++)
    for (var k = 0; k < backGrounds[i].length; k++)
      if ( backGrounds[i][k] == BackGround )
        countCells = countCells + 1;
  return countCells;
};

The function works, but only without the "recalc" variable, which is the variable I need to add a check box to re-run the code. I get an error: "Range not found (line 6)". Any advice on getting this to work?

Thanks!

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

A simplier way

function COUNTCOLOR(countRange,recalc) {
  var activeRg = SpreadsheetApp.getActiveRange();
  var activeSht = SpreadsheetApp.getActiveSheet();
  var activeformula = activeRg.getFormula();
  var countRangeAddress = activeformula.match(/\((.*),/).pop().trim();
  var backGrounds = activeSht.getRange(countRangeAddress).getBackgrounds();
  var backGround = activeRg.getBackground();
  var countCells = 0;
  for (var i = 0; i < backGrounds.length; i++)
    for (var k = 0; k < backGrounds[i].length; k++)
      if ( backGrounds[i][k] == backGround )
        countCells = countCells + 1;
  return countCells;
};

The color reference is the backgrund of the cell that contains the formula.

enter image description here

about 4 years ago · Juan Pablo Isaza Report

0

It works for me this way:

function COUNTCOLOR(countRange,colorRef,recalc) {
  var activeRg = SpreadsheetApp.getActiveRange();
  var activeSht = SpreadsheetApp.getActiveSheet();
  var activeformula = activeRg.getFormula();
  var [countRangeAddress,colorRefAddress] = activeformula.match(/\((.*)\)/).pop().split(',');
  var backGrounds = activeSht.getRange(countRangeAddress).getBackgrounds();
  var BackGround = activeSht.getRange(colorRefAddress).getBackground();
  var countCells = 0;
  for (var i = 0; i < backGrounds.length; i++)
    for (var k = 0; k < backGrounds[i].length; k++)
      if ( backGrounds[i][k] == BackGround )
        countCells = countCells + 1;
  return countCells;
};

You can add trim() to every variable if you want.

It could be something like this:

  var variables = activeformula.match(/\((.*)\)/).pop().split(',');
  var countRangeAddress = variables[0].trim();
  var colorRefAddress   = variables[1].trim();

Or you can add replace() in the line to get rid of spaces:

  var [countRangeAddress,colorRefAddress] = activeformula
    .match(/\((.*)\)/).pop().replace(/\s+/g,'').split(',');
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!