如何在 Google Sheet 自定义函数中编写 "re-run custom function" 按钮?

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

我遇到了很多问题,我在 Gsheets 上的 Apps 脚本代码不会自动更新,除非它注册了参数更改。我使用的自定义函数计算以特定颜色突出显示的单元格的数量。更改单元格的颜色不会重新 运行 脚本。我想在单元格中添加一个复选框,每次单击它时,它都会重新运行函数。

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;
};

该函数有效,但只是没有“recalc”变量,这是我需要添加复选框以重新 运行 代码的变量。我收到错误消息:“未找到范围(第 6 行)”。关于让它工作的任何建议?

谢谢!

它对我有用:

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;
};

如果需要,您可以将 trim() 添加到每个变量。

可能是这样的:

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

或者您可以在行中添加 replace() 以去除空格:

  var [countRangeAddress,colorRefAddress] = activeformula
    .match(/\((.*)\)/).pop().replace(/\s+/g,'').split(',');

更简单的方法

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;
};

颜色参考是包含公式的单元格的背景。