Apps Script操作Slides时如何获取文本框填充色Hex色值
Google Apps Script 操作Slides获取形状填充Hex值报错解决方案
报错核心原因
你写的长链式调用代码存在未处理的边界场景,会直接触发运行时错误阻塞脚本:
- 当形状填充为无填充、渐变填充、图片填充时,
getSolidFill()会返回null,后续直接调用null的方法会抛出类型错误 - 当填充色为幻灯片主题色时,
getColor()返回的是ThemeColor类型对象,直接调用asRgbColor()会触发类型转换失败 - 额外场景:如果形状是组合元素,直接遍历顶层shape拿不到内部子元素,也会出现取值异常
可行实现代码
不要写无校验的长链式调用,按步骤分层做类型、空值判断即可,以下是可直接运行的代码:
// 替换为你自己的演示文稿ID const masterDeckID = "请输入你的Slides文件ID"; function adjustFillColor() { const deck = SlidesApp.openById(masterDeckID); const slides = deck.getSlides(); const masterSlide = slides[1]; const slide = masterSlide.duplicate(); slide.getShapes().forEach(shape => { // 处理组合形状内的子元素,不需要可删除该分支 if (shape.getPageElementType() === SlidesApp.PageElementType.GROUP) { shape.getChildren().forEach(child => { if (child.getPageElementType() === SlidesApp.PageElementType.SHAPE) { processShapeFill(child); } }) return; } // 跳过线条、表格、图片等非普通形状元素 if (shape.getPageElementType() !== SlidesApp.PageElementType.SHAPE) return; processShapeFill(shape); }); } /** * 处理单个形状的填充色读取、修改 * @param {SlidesApp.Shape} shape 目标形状对象 */ function processShapeFill(shape) { const fill = shape.getFill(); const solidFill = fill.getSolidFill(); // 非纯色填充直接跳过 if (!solidFill) return; const color = solidFill.getColor(); let hexValue = ""; // 分颜色类型处理转Hex逻辑 switch(color.getColorType()) { case SlidesApp.ColorType.RGB: // asHexString默认返回8位值:前6位为色值,后2位为透明度,不需要透明度可截取前7位 hexValue = color.asRgbColor().asHexString().slice(0,7); break; case SlidesApp.ColorType.THEME: // 主题色先转换为实际渲染的RGB色再取Hex const concreteRgb = color.asThemeColor().getConcreteColor(); hexValue = concreteRgb.asHexString().slice(0,7); break; default: // 其余继承、未支持的颜色类型直接跳过 return; } // 此处即可拿到正确的Hex十六进制色值 console.log("当前形状填充色Hex:", hexValue); // 原有修改填充色的逻辑可正常执行 shape.getFill().setSolidFill("#000000"); }
注意事项
- 禁止无分层校验的长链式属性调用,每一步获取对象后先做非空、类型判断,从根源避免空指针类错误
- 如果需要保留填充透明度,删除
.slice(0,7)截取逻辑,直接使用方法返回的8位Hex值即可 - 如果需要读取表格单元格的填充色,要单独遍历表格行、单元格,用
CellFill相关方法取值,不能直接套用形状填充的取值逻辑 - 如果不需要处理组合内的元素,直接删除代码中判断
GROUP类型的分支即可
内容的提问来源于stack exchange,提问作者gus
相关产品推荐
相关产品推荐

