使用自定义主题颜色的getBackgrounds()中的BUG。

我有一个电子表格,里面的颜色来自一个自定义的主题,我使用getBackgrounds()读取颜色时,返回的颜色都是#000000。

当我使用getBackgrounds()读取颜色时,返回的颜色都是#000000如果我使用getBackground()逐个单元格读取颜色,返回的颜色是正确的。

如果我使用标准颜色(即不是我的主题中的颜色),颜色也会正确返回。

测试表(可在以下网站查看 https:/docs.google.comspreadsheetsd1nCZeUbCjs_5p6_52v8ggqVgrgnJ-Pd6x-gzXUFfV8G0edit?usp=分享。

A1:D1单元格中包含了四位甲壳虫乐队的名字,背景色均为#b70906。

测试代码

/** @OnlyCurrentDoc */
    
    
    function getbackgroundstwoways(){
    var  fullrange= SpreadsheetApp.getActiveSpreadsheet().getRange("A1:D1");

    // Read all cells using getBackgrounds
    var arBack = fullrange.getBackgrounds();
    var arValues=fullrange.getValues()  
      
    Logger.log("Full array " +arBack + arValues);  
    
    //Now do the cells individually with getBackground
    for (var i=0; i<fullrange.getLastRow();i++){
        for (var j=0; j<fullrange.getLastColumn();j++){
        
        Logger.log("Single cell " + i + " " + j + "  " + fullrange.offset(i,j).getBackground() + " " + fullrange.offset(i,j).getValue() ) ;
        
        }}}

记录器输出

 Full array #000000,#000000,#000000,#000000John,Paul,George,Ringo
 Single cell 0 0  #b70906 John
 Single cell 0 1  #b70906 Paul
 Single cell 0 2  #b70906 George
 Single cell 0 3  #b70906 Ringo

解决方案:

这个答案怎么样?

问题和解决方案。

当我看到你的共享电子表格时,”A1:D1 “单元格的背景色的颜色类型为 “THEME”。我想这就是您问题的原因。

在现阶段看来 getBackground() 可以直接从 “THEME “的颜色类型中获取背景色作为十六进制字符串。但是,似乎 getBackgrounds() 不能直接检索它们。使用它检索的值就变成了 #000000. 我不知道这是bug还是现在的规范。但在现阶段,颜色类型为 “THEME “的背景色可以通过Spreadsheet服务中的方法来获取。

几种解决方案之一是使用 getBackground() 作为您的脚本。这在你的脚本中已经实现了。

在这个答案中,作为另一种模式,颜色是由下面的函数所获取的值来检索的。getThemeColors. 本脚本的流程如下。

  1. 创建一个对象,用于从主题颜色类型中搜索颜色。
  2. 检索背景对象。
  3. 从backgroundObjects中检索背景色。

脚本示例。

function getbackgroundstwoways() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const fullrange = ss.getActiveSheet().getRange("A1:D1");  // Range from your script.

  // 1. Create an object for searching the colors from the theme color type.
  const theme = ss.getSpreadsheetTheme();
  const themeColorObj = theme.getThemeColors().reduce((o, e) => Object.assign(o, {[e]: theme.getConcreteColor(SpreadsheetApp.ThemeColorType[e]).asRgbColor().asHexString()}), {});
//  const fullrange = SpreadsheetApp.getActiveSpreadsheet().getDataRange();

  // 2. Retrieve background objects.
  const backgroundObjects = fullrange.getBackgroundObjects();

  // 3. Retrieve the background colors from backgroundObjects.
  const backgroundColors = backgroundObjects.map(r => {
    return r.map(c => {
      if (c.getColorType() == SpreadsheetApp.ColorType.RGB) {
        return c.asRgbColor().asHexString();
      } else if (c.getColorType() == SpreadsheetApp.ColorType.THEME) {
        return themeColorObj[c.asThemeColor().getThemeColorType()];
      } else {
        return null;
      }
    });
  });

  console.log(backgroundColors);
}
  • 这个脚本可以用于 “RGB “和 “THEME “两种颜色类型。当这个脚本在您的共享电子表格中运行时。[ [ '#b70906', '#b70906', '#b70906', '#b70906' ] ] 可以在日志中看到。
    • 即使在RGB类型和THEME类型混合的情况下,该脚本也可以将背景色作为十六进制字符串来检索。

请注意,背景色是从主题色中提取的。

  • 在这种情况下,背景色是从主题色中提取的。但是,当你把背景色涂抹成RGB类型的时候,就会出现以下情况 #b70906,您可以使用 getBackgrounds().
  • 当我搜索了一下这个 getBackgrounds() 不能用于THEME颜色类型在问题跟踪器,我找不到这个。那么如何报告这个问题呢?参考文献
  • 请将此脚本与V8一起使用。

参考文献

给TA打赏
共{{data.count}}人
人已打赏
未分类

Java错误:-"没有找到合适的方法来排序(Student[],j)"

2022-11-13 21:05:22

未分类

添加复选框,然后点击按钮录入firebase。

2022-11-13 21:05:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索