google-apps-script - 如何使用 Google Apps 脚本将一张工作表中的值的背景颜色设置为另一张工作表中具有匹配值的单元格?编辑部分添加

标签 google-apps-script google-sheets colors

问题:

我正在尝试执行以下操作:

将 Sheet2 中单元格的背景颜色设置为 Sheet1 中与 Sheet2 中具有相同值的单元格。

其想法是比较 Sheet2 中也存在于 Sheet1 中的所有值,并从 Sheet2 中的单元格中获取预制背景,并将 Sheet2 中的这些预制背景设置到 Sheet1 中具有匹配值的单元格。

目标是在匹配时根据单元格值自动设置背景,无论顺序如何(以避免必须手动对数百个不同的匹配值进行设置)。

插图示例:

在 Sheet2 中,我预设了一个范围 A1:A10,其中包含 10 个不同的值,所有值都有其独特的背景。

Sheet2: range A1:A10

在 Sheet1 中,我有与 Sheet2 中相同的 10 个值以及其他不匹配的值。此外,Sheet1 中的 10 个匹配值“分散”在范围 A1:AG20 中(与 Sheet2 的范围不同,可以是任何范围)。

Sheet1: range A1:AG20

我想要得到的结果是:

Sheet1: backgrounds match

其他密切问题:

我在这里发现了密切的问题:

Copying background color from cells on a different tab of the same sheet

这里:

Google Sheets: Change background color of cell using content of another cell

这里:

Change cell value based on the cell's background color in Google Sheets

到目前为止我的脚本:

根据其他问题,我想出了以下代码:

function myFunction() {
  const sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  const rngsh2 = sheet2.getRange("A1:A10");
  const colorssh2 = rngsh2.getBackgroundObjects();
  const valuessh2 = rngsh2.getValues();

  const sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  const rngsh1 = sheet1.getRange("A1:G20");
  const valuessh1 = rngsh1.getValues();

  if(valuessh2 == valuessh1){
    sheet1.getRange(rngsh1).setBackgroundObjects(colorssh2);
  }
  
}

但它没有设置背景。

示例表:

这里是sample sheet

上面的代码有什么问题吗?

非常感谢您的帮助!

检查文档:

我已经检查并尝试了这些引用文献:

getBackgroundObjects(color)

setBackground(color)

setBackgroundObject(color)

setBackgrounds(color)

编辑:

taylor.2317答案让我意识到我忘记说 Sheet1 中的值会重复,并且颜色也需要相同的重复背景(在指定范围 A1:AG20 的代码中应该没有区别):

以下是显示重复值的新屏幕截图:

Sheet2 输入:

Sheet2: Range A1:A10

我尝试使用 Sheet1 中的重复值获得的结果是:

Sheet1: range A1:AG20 (with repetitions of matching values)

当前Sheet1结果:

Sheet1: range A1:AG20 (with repetitions of matching values not colored)

最佳答案

function copycolors() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet0');
  const cA = sh.getRange(1,1,sh.getLastRow()).getDisplayValues().flat();//values
  const bA = sh.getRange(1,1,sh.getLastRow()).getBackgrounds().flat();//colors
  let colors = {pA:[]};
  cA.forEach((c,i) => {
    colors[c]=bA[i];
    colors.pA.push(c);
  });
  const osh = ss.getSheetByName('Sheet1');
  const vs = osh.getDataRange().getDisplayValues();
  const bs = osh.getDataRange().getBackgrounds();
  let bgA = vs.map((r,i) =>{
    r.forEach((c,j) =>{
      let idx = colors.pA.indexOf(c);
      if(~idx) {
        bs[i][j] = colors[c];
      }
    });
    return bs[i];
  });
    
  osh.getRange(1,1,bgA.length,bgA[0].length).setBackgrounds(bgA);

}

~ bitwise not

关于google-apps-script - 如何使用 Google Apps 脚本将一张工作表中的值的背景颜色设置为另一张工作表中具有匹配值的单元格?编辑部分添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70511152/

相关文章:

google-apps-script - AuthMode 对多个登录用户感到困惑

javascript - XMLHTTPRequest 没有定义?谷歌电子表格?

mysql - 如何对电子表格和相关单元格引用使用查询

colors - YIQ 转换矩阵是如何创建的?

javascript - 从 Google Sheets 连接到 Bitfinex API

google-apps-script - 如何在具有设置名称的文件夹中列出谷歌驱动器中的所有文件?

colors - 以编程方式在电子表格中设置边框颜色和样式

reference - 从上面的单元格中获取值

javascript - 跨像素的统一颜色?

ios - 当侧面菜单快速关闭时如何更改为原始 View 颜色