google-apps-script - 如何计算特定字符串和颜色?

标签 google-apps-script google-sheets

我一直在研究如何使用 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;
}

操作方法

  1. 该函数采用三个参数:Range(字符串)、String、String
  2. 关联数组“COLORS”用于将颜色的通用名称转换为十六进制格式。列表中还有大约 90 种颜色,由于空间原因我没有提供。如果您愿意,我可以给您提供完整的 list 。
  3. 捕获范围。
  4. 检查颜色是否已采用十六进制格式。如果没有,它会尝试在 COLORS 中查找通用名称键并返回十六进制值。从这里开始,一切都是 toString() 和 toUpperCase() 来帮助防止错误。
  5. 这里的代码是一系列数组操作,它将生成函数返回的解决方案。
  6. 获取所需的背景颜色。
  7. .reduce 与 .concat(都是数组方法)结合使用,用于展平背景颜色数组。它将数组的矩形数组更改为一维列表。
  8. .map 遍历数组的每个元素并应用给定的函数。在本例中,我们要查看数组元素 (e) 是否与提供的颜色相同。请注意在右大括号之外如何调用“颜色”。它就是“thisArg”,函数内部的“this”是它的图像。该数组现在减少为一系列 true/false 元素。
  9. 该映射用于组合两个数组“color”和“str”。下面的缩进部分与我们用于为一系列真/假元素获取“颜色”的步骤相同,但现在应用于“str”。所有这些操作都是在将“str”作为当前映射函数的 thisArg 调用时执行的。然后,map 函数返回 [color,str] 形式的单个数组,该数组由 [true,false] [true,true] [false,false] 对的许多元素组成。
  10. 我们只对“color”和“str”都为 true 的解决方案感兴趣,因此我们可以使用 .filter 删除所有其他元素,仅使用 [true, true] 对的数组。
  11. 每个 [true, true] 对都是方程的唯一解。我们可以获取数组的长度来看看我们找到了多少个解决方案!这是一开始传递给返回的值。

关于google-apps-script - 如何计算特定字符串和颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32877380/

相关文章:

google-apps-script - Utilities.formatDate 返回错误的周数

javascript - 谷歌脚本语法

google-sheets - 如何按公式在电子表格中自动递增?

Google 表格中的日期格式无法按照说明工作

google-apps-script - Google Apps 脚本中的 "Allow this application to run when you are not present"

javascript - 有没有办法将谷歌脚本代码打包为谷歌表格的附加组件?

javascript - 从 JS 数组中删除非 0 假值的最简单方法是什么?

javascript - Google 电子表格中月份的滚动方案(从当前日期自动更新)

javascript - 解析 Apps 脚本中的字节数组

javascript - Google 脚本自定义函数 - 范围数组作为参数