使用Google Apps Script替换Google Slides形状颜色时代码不生效如何解决
问题原因
- 形状类型判断逻辑存在漏洞:Google Slides中用户常用的带文本的矩形框本质类型为
SlidesApp.ShapeType.TEXT_BOX,你当前的判断条件未包含该类型,会直接触发提前return,根本走不到读取颜色的代码行。同时你将UNSUPPORTED(不支持的形状类型)加入放行列表没有意义,该类形状无法正常读取填充属性。 - 填充颜色读取方法错误:
shape.getFill().getSolidFill()返回的是SlidesApp.Color类实例,不是十六进制颜色字符串,直接和字符串做匹配永远无法命中,且如果形状为无填充、渐变填充,调用该方法会返回null,直接操作会触发报错。 - switch语句缺失
break关键字:即便匹配到对应颜色,也会顺序执行后续所有case的赋值逻辑,最终所有匹配的形状都会被设置为最后一个case的颜色。
修复后代码
function changeColors() { const objectId = "#an-id#"; // 替换为你的演示文稿ID const slides = SlidesApp.openById(objectId).getSlides(); slides.forEach(loopSlides); } function loopSlides(slide){ const shapes = slide.getShapes(); if (shapes.length > 0) { shapes.forEach(myFunction); } } function myFunction(shape) { let st; try { st = shape.getShapeType(); } catch(err) { Logger.log("不是有效形状"); return; } // 放行矩形、圆角矩形、文本框三类常见的填充形状 if ( st !== SlidesApp.ShapeType.RECTANGLE && st !== SlidesApp.ShapeType.ROUND_RECTANGLE && st !== SlidesApp.ShapeType.TEXT_BOX ) { Logger.log("不符合形状类型要求:" + st); Logger.log(shape.getText().asString()); return; } // 先判断填充是否为纯色填充 const fill = shape.getFill(); if (!fill || fill.getType() !== SlidesApp.FillType.SOLID) { Logger.log("形状非纯色填充,跳过"); return; } // 读取十六进制颜色值 const hexColor = fill.getSolidFill().asHexString(); Logger.log("当前形状颜色:" + hexColor); // 加break修正switch逻辑 switch (hexColor){ case "#f16727": // Computer Science,若你的场景返回带透明度的8位色值,可改为#f16727ff shape.getFill().setSolidFill("#413c73"); break; case "#0b9fae": // Information technology shape.getFill().setSolidFill("#d90368"); break; case "#d71b55": // Digital Literacy shape.getFill().setSolidFill("#aa968a"); break; } }
补充说明
运行代码前需要先给脚本授予演示文稿的编辑权限,若你需要匹配带透明度的颜色值,可打印实际返回的hexColor格式调整对应case的颜色字符串即可。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

