如何在Numbers的JXA脚本中检查行背景色是否已存在?
在JXA中检查Numbers行是否有自定义背景色并获取颜色值
问题原因
直接访问row.backgroundColor会抛出Error -1700,是因为Numbers的JXA接口中,行的backgroundColor返回的是Cocoa原生的NSColor对象,而非JavaScript原生类型,JXA无法直接将其转换为可打印或比较的JS值。此外,访问属性时必须加括号(row.backgroundColor()),否则会拿到方法本身而非属性值。
判断是否有自定义背景色
Numbers中默认行背景色为“自动”(无自定义设置),可以通过对比行背景色与应用默认背景色来判断是否存在自定义设置:
function hasCustomBackgroundColor(row) { const numbers = Application('Numbers'); const rowBG = row.backgroundColor(); const defaultBG = numbers.defaultBackgroundColor(); // 如果行背景色为null,或与默认色一致,则无自定义设置 return rowBG && !rowBG.isEqual(to: defaultBG); }
获取背景色的RGB值
若要获取并打印背景色的具体RGB值,需要将NSColor转换为sRGB颜色空间,再提取各颜色组件(注意Numbers使用0-65535的范围,需将Cocoa的0-1范围值乘以65535):
function getBGColorRGB(row) { const rowBG = row.backgroundColor(); if (!rowBG) return null; // 转换到sRGB颜色空间 const sRGBColor = rowBG.usingColorSpaceName(NSColorSpace.sRGB); if (!sRGBColor) return null; // 转换为Numbers兼容的RGB范围(0-65535) return [ sRGBColor.redComponent() * 65535, sRGBColor.greenComponent() * 65535, sRGBColor.blueComponent() * 65535 ]; }
修改后的colorize函数
结合需求,只有当行满足条件且无自定义背景色时才设置蓝色:
function colorize(row) { const blue = [22085.295, 49609.995, 65535]; const rs = row.cells[2].value()?.indexOf('PRUDENTIAL'); // 满足条件且无自定义背景色时才设置颜色 if (foundAndDefined(rs) && !hasCustomBackgroundColor(row)) { row.backgroundColor = blue; } } // 辅助函数(若未定义可补充) function foundAndDefined(val) { return val !== undefined && val !== -1; }
内容的提问来源于stack exchange,提问作者hackerl33t
相关产品推荐
相关产品推荐

