如何在 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;
};
颜色参考是包含公式的单元格的背景。
我遇到了很多问题,我在 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;
};
颜色参考是包含公式的单元格的背景。