Tengo el problema que tienen muchos cuando mi código Apps Script en Gsheets no se actualiza automáticamente a menos que registre un cambio en los parámetros. La función personalizada que estoy usando cuenta la cantidad de celdas que están resaltadas en un color específico. Cambiar el color de una celda no vuelve a ejecutar el script. Quería agregar una casilla de verificación en una celda y cada vez que hago clic en ella, vuelve a ejecutar la función.
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; };La función funciona, pero solo sin la variable "recalc", que es la variable que necesito para agregar una casilla de verificación para volver a ejecutar el código. Aparece un error: "Rango no encontrado (línea 6)". ¿Algún consejo para hacer que esto funcione?
¡Gracias!
Una manera más simple
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; };La referencia de color es el fondo de la celda que contiene la fórmula.
Funciona para mí de esta manera:
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; }; Puede agregar trim() a cada variable si lo desea.
Podría ser algo como esto:
var variables = activeformula.match(/\((.*)\)/).pop().split(','); var countRangeAddress = variables[0].trim(); var colorRefAddress = variables[1].trim(); O puede agregar replace() en la línea para deshacerse de los espacios:
var [countRangeAddress,colorRefAddress] = activeformula .match(/\((.*)\)/).pop().replace(/\s+/g,'').split(',');