Google Sheets自定义函数countColoredCells接收单元格区域参数异常求助
Google Sheets自定义函数countColoredCells接收单元格区域参数异常求助
嘿,我懂你这糟心的情况——在Google Sheets里写了个自定义函数countColoredCells想统计指定颜色的单元格,结果传进去的单元格区域参数直接变成了一堆空字符串的嵌套数组,完全没法用来拿颜色信息对吧?
其实这是Google Sheets自定义函数的一个“特性”:当你直接把单元格区域(比如C105:I105)作为参数传给自定义函数时,它只会把区域里的单元格值传递给函数,而不是单元格对象本身。如果你的C105:I105里的单元格都是空值,那函数里拿到的input自然就是一个二维数组,每个元素都是空字符串,对你要统计颜色来说确实毫无用处。
那该怎么解决呢?我们得换个思路,直接通过Google Sheets的脚本API去获取单元格的背景色,而不是依赖传入的参数值。这里给你一个调整后的函数实现:
function countColoredCells(rangeRef, targetColor) { // 获取当前正在使用的工作表 const activeSheet = SpreadsheetApp.getActiveSheet(); // 拿到当前调用这个函数的单元格里的公式 const formulaText = SpreadsheetApp.getActiveCell().getFormula(); // 从公式里解析出传递的区域字符串,比如从公式里提取"C105:I105" const rangeMatch = formulaText.match(/\((.*?),/); if (!rangeMatch) { return "参数格式错误"; } const rangeStr = rangeMatch[1].trim(); // 根据解析出的区域字符串获取实际的单元格区域对象 const targetRange = activeSheet.getRange(rangeStr); // 获取这个区域里所有单元格的背景色,返回的是二维数组 const allBackgrounds = targetRange.getBackgrounds(); // 遍历颜色数组,统计和目标颜色匹配的数量 let colorCount = 0; for (const row of allBackgrounds) { for (const cellColor of row) { if (cellColor === targetColor) { colorCount++; } } } return colorCount; }
使用的时候你还是可以像原来那样调用:=countColoredCells(C105:I105, "#ff0000"),不过第一次运行的时候,Google Sheets会弹出授权请求,你得允许脚本访问你的表格数据,这样它才能获取单元格的颜色信息。
要是你需要跨工作表统计的话,只需要在区域参数里加上工作表名称,比如=countColoredCells(Sheet2!C105:I105, "#ff0000"),然后把代码里的activeSheet改成根据区域字符串解析对应的工作表就行,不过如果只是当前工作表用的话,上面的代码就足够啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

