我一直在研究如何使用 countif 函数对单元格进行计数,以及如何对使用脚本和自定义函数着色的单元格进行计数(例如: http://pastebin.com/4Yr095hV ),但是我如何对具有特定值的单元格进行计数字符串和颜色?
例如,我想计算每个包含单词“one”且填充颜色为白色的单元格。
编辑:我被告知添加到目前为止我所拥有的内容,但我不确定这是什么意思。为了对具有特定字符串的单元格进行计数,我使用了:
=COUNTIF(A1:A247,"字符串")
为了计算彩色细胞,我使用了本页上的内容: https://webapps.stackexchange.com/questions/23881/google-spreadsheet-calculating-shaded-cells
但我仍然不知道如何将这两者结合在一起。
编辑:对于那些寻找这个答案的人,我找到了一种利用汤姆发布的脚本的方法,并调整了其中的一行。
为了使 Tom 的脚本能够使用“通配符”,我使用了名为 .indexOf 的东西来始终查找包含该字符串的任何单元格(有效地将其视为字符串前后始终有一个星号)。在他的脚本的第 32 行,我将其更改为:
.map (function(e,i,a) { if (e.toString().toUpperCase().indexOf(this.toString().toUpperCase()) >= 0){ return 1 } else { return 0 } },str))
所以现在每当我想查找包含字符串“Apple1”的白色单元格时,它都会对其进行计数,无论它是否写为“OrangeApple1B”或其他。而且大小写并不重要,因为这个脚本似乎总是将给定的字符串转换为大写。
我仍在尝试找出如何将其合并到一个完全不同的电子表格中(使用 IMPORTRANGE 之类的东西来使用此脚本对完全不同的工作表上的单元格进行计数)...
最佳答案
function countIfStringAndColor(r, str, color) {
var COLORS = {
"BLACK":"#000000",
"DARK GRAY 4":"#434343",
"DARK GRAY 3":"#666666",
"DARK GRAY 2":"#999999",
"DARK GRAY 1":"#B7B7B7",
"GRAY":"#CCCCCC"
};
var range = SpreadsheetApp
.getActive()
.getActiveSheet()
.getRange(r.toString());
color = color.indexOf("#") == 0 ? color : COLORS[color.toString().toUpperCase()];
return range
.getBackgrounds()
.reduce(function(a,b) { return a.concat(b) })
.map (function(e,i,a) { return e.toString().toUpperCase() === this.toString().toUpperCase(); },color)
.map(function(e,i,a) { return [e, this[i]] },
range
.getValues()
.reduce(function(a,b) { return a.concat(b) })
.map (function(e,i,a) { return e.toString().toUpperCase() === this.toString().toUpperCase() },str))
.filter(function(e,i,a) {return a[i][0] && a[i][1] })
.length;
}
操作方法
- 该函数采用三个参数:Range(字符串)、String、String
- 关联数组“COLORS”用于将颜色的通用名称转换为十六进制格式。列表中还有大约 90 种颜色,由于空间原因我没有提供。如果您愿意,我可以给您提供完整的 list 。
- 捕获范围。
- 检查颜色是否已采用十六进制格式。如果没有,它会尝试在 COLORS 中查找通用名称键并返回十六进制值。从这里开始,一切都是 toString() 和 toUpperCase() 来帮助防止错误。
- 这里的代码是一系列数组操作,它将生成函数返回的解决方案。
- 获取所需的背景颜色。
- .reduce 与 .concat(都是数组方法)结合使用,用于展平背景颜色数组。它将数组的矩形数组更改为一维列表。
- .map 遍历数组的每个元素并应用给定的函数。在本例中,我们要查看数组元素 (e) 是否与提供的颜色相同。请注意在右大括号之外如何调用“颜色”。它就是“thisArg”,函数内部的“this”是它的图像。该数组现在减少为一系列 true/false 元素。
- 该映射用于组合两个数组“color”和“str”。下面的缩进部分与我们用于为一系列真/假元素获取“颜色”的步骤相同,但现在应用于“str”。所有这些操作都是在将“str”作为当前映射函数的 thisArg 调用时执行的。然后,map 函数返回 [color,str] 形式的单个数组,该数组由 [true,false] [true,true] [false,false] 对的许多元素组成。
- 我们只对“color”和“str”都为 true 的解决方案感兴趣,因此我们可以使用 .filter 删除所有其他元素,仅使用 [true, true] 对的数组。里>
- 每个 [true, true] 对都是方程的唯一解。我们可以获取数组的长度来看看我们找到了多少个解决方案!这是一开始传递给返回的值。
关于google-apps-script - 如何计算特定字符串和颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877380/