如何在应用程序脚本中对具有相同值的单元格应用替代颜色
How can I apply alternate color on cells with same values in app script
我有 google sheet 有 2 列,分别称为 start date
和 end 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
中的秒数有所不同。针对这些问题进行调整的可能修改:
- 将它们的评估范围从
A2:A
更改为 B2:B
。这假定 end-date
在列 B
中。只需更改它以满足您的需要。
- 将评估从等于减法更改为不评估它们是否相等,但两者之间的差异不超过 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):
文档:
我有 google sheet 有 2 列,分别称为 start date
和 end 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
中的秒数有所不同。针对这些问题进行调整的可能修改:
- 将它们的评估范围从
A2:A
更改为B2:B
。这假定end-date
在列B
中。只需更改它以满足您的需要。 - 将评估从等于减法更改为不评估它们是否相等,但两者之间的差异不超过 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):