在 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