在 Google 幻灯片和 Google Apps 脚本中按颜色替换形状
Replacing shapes by colour in Google Slides & Google Apps Script
我正在尝试使用 Google Apps 脚本替换 Google 幻灯片演示中的形状颜色。
function changeColors() {
const objectId = "#an-id#"; // Please set the object ID.
const slides = SlidesApp.openById(objectId).getSlides();
slides.forEach(loopSlides);
}
function loopSlides(slide){
var shapes = slide.getShapes();
if (shapes.length > 0) {
shapes.forEach(myFunction);
}
}
function myFunction(shape) {
try{
var st = shape.getShapeType();
if (st != SlidesApp.ShapeType["RECTANGLE"] &&
st != SlidesApp.ShapeType["ROUND_RECTANGLE"] &&
st != SlidesApp.ShapeType["UNSUPPORTED"]){
Logger.log("Not a box!!");
Logger.log(st);
Logger.log(shape.getText());
return;
}
}
catch(err) {
Logger.log("Not a Shape!!");
return; // not a shape!
}
var hexColor = shape.getFill().getSolidFill();
Logger.log(hexColor);
switch (hexColor){
case "#f16727ff": // Computer Science
shape.getFill().setSolidFill("#413c73ff");
case "#0b9faeff": // Information technology
shape.getFill().setSolidFill("#d90368ff");
case "#d71b55ff": // Digital Literacy
shape.getFill().setSolidFill("#aa968aff");
}
}
以上代码永远不会运行替换代码(基本上永远不会到达Logger.log(hexColor);
指令
当我 运行 你的代码达到 Logger.log(hexColor);
时。
您的代码中的问题是您的 hexColor
变量实际上是 SolidFill object since you used getSolidFill().
如果要获取当前形状的RGB hexstring,需要先检查ColorType is RGB
using getColorType(). Then use asRgbColor() to get the RgbColor object. Lastly, use asHexString()是否可以获取rgb color hex string。
示例代码:
function myFunction(shape) {
try{
var st = shape.getShapeType();
if (st != SlidesApp.ShapeType["RECTANGLE"] &&
st != SlidesApp.ShapeType["ROUND_RECTANGLE"] &&
st != SlidesApp.ShapeType["UNSUPPORTED"]){
Logger.log("Not a box!!");
Logger.log(st);
Logger.log(shape.getText());
return;
}
}
catch(err) {
Logger.log("Not a Shape!!");
return; // not a shape!
}
var colorType = shape.getFill().getSolidFill().getColor().getColorType();
if(colorType != SlidesApp.ColorType.RGB ){
Logger.log("TYPE: "+colorType);
Logger.log("ColorType not RGB");
return;
}
var hexColor = shape.getFill().getSolidFill().getColor().asRgbColor().asHexString().toLowerCase();
Logger.log(hexColor);
switch (hexColor){
case "#f16727": // Computer Science
shape.getFill().setSolidFill("#413c73");
break;
case "#0b9fae": // Information technology
shape.getFill().setSolidFill("#d90368");
break;
case "#d71b55": // Digital Literacy
shape.getFill().setSolidFill("#aa968a");
break;
}
}
示例输出:
注:
- 我使用 String.toLowerCase() 将您的
switch
语句的 rgb 十六进制字符串更改为小写
- 您的 rgb 十六进制字符串不正确。 (我删除了尾随
ff
)。 RGB 十六进制字符串应仅包含 6 个字符。
- 您的每个开关盒都缺少
break
。如果您不包含 break
,则形状颜色将始终设置为最后一个实心填充设置,即 #aa968a
我正在尝试使用 Google Apps 脚本替换 Google 幻灯片演示中的形状颜色。
function changeColors() {
const objectId = "#an-id#"; // Please set the object ID.
const slides = SlidesApp.openById(objectId).getSlides();
slides.forEach(loopSlides);
}
function loopSlides(slide){
var shapes = slide.getShapes();
if (shapes.length > 0) {
shapes.forEach(myFunction);
}
}
function myFunction(shape) {
try{
var st = shape.getShapeType();
if (st != SlidesApp.ShapeType["RECTANGLE"] &&
st != SlidesApp.ShapeType["ROUND_RECTANGLE"] &&
st != SlidesApp.ShapeType["UNSUPPORTED"]){
Logger.log("Not a box!!");
Logger.log(st);
Logger.log(shape.getText());
return;
}
}
catch(err) {
Logger.log("Not a Shape!!");
return; // not a shape!
}
var hexColor = shape.getFill().getSolidFill();
Logger.log(hexColor);
switch (hexColor){
case "#f16727ff": // Computer Science
shape.getFill().setSolidFill("#413c73ff");
case "#0b9faeff": // Information technology
shape.getFill().setSolidFill("#d90368ff");
case "#d71b55ff": // Digital Literacy
shape.getFill().setSolidFill("#aa968aff");
}
}
以上代码永远不会运行替换代码(基本上永远不会到达Logger.log(hexColor);
指令
当我 运行 你的代码达到 Logger.log(hexColor);
时。
您的代码中的问题是您的 hexColor
变量实际上是 SolidFill object since you used getSolidFill().
如果要获取当前形状的RGB hexstring,需要先检查ColorType is RGB
using getColorType(). Then use asRgbColor() to get the RgbColor object. Lastly, use asHexString()是否可以获取rgb color hex string。
示例代码:
function myFunction(shape) {
try{
var st = shape.getShapeType();
if (st != SlidesApp.ShapeType["RECTANGLE"] &&
st != SlidesApp.ShapeType["ROUND_RECTANGLE"] &&
st != SlidesApp.ShapeType["UNSUPPORTED"]){
Logger.log("Not a box!!");
Logger.log(st);
Logger.log(shape.getText());
return;
}
}
catch(err) {
Logger.log("Not a Shape!!");
return; // not a shape!
}
var colorType = shape.getFill().getSolidFill().getColor().getColorType();
if(colorType != SlidesApp.ColorType.RGB ){
Logger.log("TYPE: "+colorType);
Logger.log("ColorType not RGB");
return;
}
var hexColor = shape.getFill().getSolidFill().getColor().asRgbColor().asHexString().toLowerCase();
Logger.log(hexColor);
switch (hexColor){
case "#f16727": // Computer Science
shape.getFill().setSolidFill("#413c73");
break;
case "#0b9fae": // Information technology
shape.getFill().setSolidFill("#d90368");
break;
case "#d71b55": // Digital Literacy
shape.getFill().setSolidFill("#aa968a");
break;
}
}
示例输出:
注:
- 我使用 String.toLowerCase() 将您的
switch
语句的 rgb 十六进制字符串更改为小写 - 您的 rgb 十六进制字符串不正确。 (我删除了尾随
ff
)。 RGB 十六进制字符串应仅包含 6 个字符。 - 您的每个开关盒都缺少
break
。如果您不包含break
,则形状颜色将始终设置为最后一个实心填充设置,即#aa968a