如何使用 Google Apps 脚本设置值的背景颜色从一个 Sheet 到另一个 Sheet 中具有匹配值的单元格?编辑部分添加
How To set the Background Color of Values From One Sheet To the Cells with matching Values in Another Sheet with Google Apps Script? EDIT Section add
问题:
我正在尝试执行以下操作:
将 Sheet2 中单元格的背景颜色设置为 Sheet1 中具有与 Sheet2 中相同值的单元格。
想法是比较 Sheet2 中也存在于 Sheet1 中的所有值,并从 Sheet2 中的单元格中获取预制背景并设置这些预制从 Sheet2 到 Sheet1.
中具有匹配值的单元格的背景
目标是在匹配时根据单元格值自动设置背景,而不管顺序如何(以避免必须为数百个不同的匹配值手动设置)。
插图示例:
在Sheet2中,我预设了一个范围A1:A10,有10个不同的值,每个值都有其独特的背景。
在 Sheet1 中,我有与 Sheet2 中相同的 10 个值以及其他不匹配的值。此外,Sheet1 中的 10 个匹配值在 A1:AG20 范围内 'scattered around'(与 Sheet2 不同的范围,可以是任何范围)。
我想要得到的结果是:
其他关闭问题:
我在此处找到了关闭问题:
这里:
这里:
到目前为止我的脚本:
基于其他问题,我想出了这个代码:
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);
}
}
但它没有设置背景。
样本Sheet:
这里是sample sheet
上面的代码有什么问题?
非常感谢您的帮助!
检查文档:
我已经检查并尝试了这些参考资料:
编辑:
taylor.2317 的回答让我意识到我忘了说 Sheet1 中的值会重复,并且重复的颜色也需要相同的背景(代码应该没有区别对于指定范围 A1:AG20):
这是显示重复值的新屏幕截图:
Sheet2 输入:
我试图用 Sheet1 中的重复值得到的结果是:
当前Sheet1个结果:
=Sheet1!A1=Sheet2!A1
5 个步骤:
- Select 单元格,例如
A1
- 转到格式,条件格式
- 在“格式规则”下,滚动到下拉列表的底部以找到“自定义公式是”
- 在文本输入框中,复制粘贴上面的代码
- 要更改颜色,请使用格式选项
请注意:更改单元格时,将代码A1
更改为当前单元格。
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);
}
问题:
我正在尝试执行以下操作:
将 Sheet2 中单元格的背景颜色设置为 Sheet1 中具有与 Sheet2 中相同值的单元格。
想法是比较 Sheet2 中也存在于 Sheet1 中的所有值,并从 Sheet2 中的单元格中获取预制背景并设置这些预制从 Sheet2 到 Sheet1.
中具有匹配值的单元格的背景目标是在匹配时根据单元格值自动设置背景,而不管顺序如何(以避免必须为数百个不同的匹配值手动设置)。
插图示例:
在Sheet2中,我预设了一个范围A1:A10,有10个不同的值,每个值都有其独特的背景。
在 Sheet1 中,我有与 Sheet2 中相同的 10 个值以及其他不匹配的值。此外,Sheet1 中的 10 个匹配值在 A1:AG20 范围内 'scattered around'(与 Sheet2 不同的范围,可以是任何范围)。
我想要得到的结果是:
其他关闭问题:
我在此处找到了关闭问题:
这里:
这里:
到目前为止我的脚本:
基于其他问题,我想出了这个代码:
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);
}
}
但它没有设置背景。
样本Sheet:
这里是sample sheet
上面的代码有什么问题?
非常感谢您的帮助!
检查文档:
我已经检查并尝试了这些参考资料:
编辑:
taylor.2317 的回答让我意识到我忘了说 Sheet1 中的值会重复,并且重复的颜色也需要相同的背景(代码应该没有区别对于指定范围 A1:AG20):
这是显示重复值的新屏幕截图:
Sheet2 输入:
我试图用 Sheet1 中的重复值得到的结果是:
当前Sheet1个结果:
=Sheet1!A1=Sheet2!A1
5 个步骤:
- Select 单元格,例如
A1
- 转到格式,条件格式
- 在“格式规则”下,滚动到下拉列表的底部以找到“自定义公式是”
- 在文本输入框中,复制粘贴上面的代码
- 要更改颜色,请使用格式选项
请注意:更改单元格时,将代码A1
更改为当前单元格。
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);
}