如何在应用程序脚本中对具有相同值的单元格应用替代颜色

How can I apply alternate color on cells with same values in app script

我有 google sheet 有 2 列,分别称为 start dateend date。而某些日期具有重复值。我想找出有多少条目具有相同的值。如果 2 个或更多单元格具有相同的值,则应用替代颜色。

所有这些我都想通过 script/java 脚本实现 google sheets.

请看两个数字

图 1 = 正常图

图 2 = 我想要的。

到目前为止,我已经通过将列值分配给 true 和 false 来尝试使用条件格式的不同方法。但还没有成功。 任何帮助将不胜感激

在你的条件格式中试试这个

=MOD(ROUND(SUMPRODUCT(1/COUNTIF($A:$A2,$A:$A2)),0),2)=1

如果你想要更低的精度(例如只有分钟),你将不得不用这种方式调整公式

=MOD(ROUND(SUMPRODUCT(1/COUNTIF(round($A:$A2*60*24),round($A:$A2*60*24))),0),2)=1

此实现假定日期完全相同,精确到秒。从我在您展示的示例中看到的,start-date 中的秒数有所不同。针对这些问题进行调整的可能修改:

  1. 将它们的评估范围从 A2:A 更改为 B2:B。这假定 end-date 在列 B 中。只需更改它以满足您的需要。
  2. 将评估从等于减法更改为不评估它们是否相等,但两者之间的差异不超过 5 秒(或您考虑的任何数量)。例如,从 crrArr[idx - 1] !== crrArr[idx] 更改为 Math.abs(crrArr(idx-1) - crrArr[idx] > 5000)
Code.gs
const sS = SpreadsheetApp.getActiveSheet()
function conditionalColors() {
  /* Filter the values to obtain true when the time changes */
  const values = sS
    /* Evaluate end-date `B2:B` */
    .getRange('A2:A')
    .getValues()
    .filter(n => n[0] !== '')
    .flat()
    .map(n => new Date(n).getTime())
    /* Math.abs(crrArr[idx-1] - crrArr[idx]) > 5000 */
    .map((n, idx, crrArr) => idx === 0 ? true : crrArr[idx-1] !== crrArr[idx])

  /* defining the colors*/
  const color1 = [204, 222, 188]
  const color2 = [238, 232, 170]
  let color = color1
  /* Loop to change the color every time we have a true */
  values.forEach((c, idx) => {
    if (c) {
      color = color === color1 ? color2 : color1
    }
    /* In the example Start Date is in A column (A===1) */
    /* And End Date in B Column */
    sS.getRange(idx + 2, 1).setBackgroundRGB(...color)
    sS.getRange(idx + 2, 2).setBackgroundRGB(...color)
  })
}

使用Math.abs的示例结果(通知A6):

文档: