javascript - 循环多个条件并使用两个数组作为输入时,如何更改 Google Apps 脚本中的背景颜色?
问题描述
请帮助我了解在使用两个数组作为输入循环多个条件时,我需要如何扩展我的代码以更改 Google Apps 脚本中的背景颜色。
感谢@Cooper 的帮助,我设法编写了根据电子表格第 7 列中的值更改背景颜色的代码。
// MY CODE THAT WORKS.
function randomcolors2d() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName('Sheet4');
var rg = sh.getDataRange();
var cA = rg.getBackgrounds();
var vA = rg.getValues();
vA.forEach(function(r, i) {
r.forEach(function(c, j) {
if (vA[i][6] <= 10) {
cA[i][6] = "#f4cccc"
} if (vA[i][6] > 10) {
cA[i][6] = "#d9ead3"
}
});
});
rg.setBackgrounds(cA);
}
但是,我的问题是这个简单的规则不适合我的数据。我的数据中有不同的产品类型,因此需要执行上述操作,但要遍历不同的产品类型和键(中值)值)。就我而言,它是 4 种产品类型和 4 个中值。但是这个数字可以改变,所以我需要一个更灵活的代码来解决这个问题。
没有任何成功,我尝试只使用一个 forEach 循环,在 forEach 循环之前或 if 语句之前集成另一个 for 循环,或者使用 for 循环和 map 函数的组合。
这里只是一个例子,让我更清楚我打算做什么。我希望它有所帮助。
// CODE THAT DOES NOT WORK.
var medianResults = [11.0, 45.0, 11.0, 12.0]; // Remember, the length of these to variable can vary!
var productType = ["ProductA", "ProductB", "ProductC", "ProductD"];
// the two arrays I'd like to use for conditioning.
function randomcolors2d() {
var ss = SpreadsheetApp.getActive();
var sh = ss.getSheetByName('Sheet4');
var rg = sh.getDataRange();
var cA = rg.getBackgrounds();
var vA = rg.getValues();
for (v = 0; v < productType.length; v++) { // this does not work, but how to do it?
vA.forEach(function(r, i) {
r.forEach(function(c, j) {
if (vA[i][1] === productType[v] && vA[i][6] <= medianResults[v]) {
cA[i][6] = "#f4cccc"
} if (vA[i][1] === productType[v] && vA[i][6] > medianResults[v]) {
cA[i][6] = "#d9ead3"
}
});
});
}
rg.setBackgrounds(cA);
}
有任何想法吗?您的意见将不胜感激!
==================================================== =========================
2020 年 6 月 6 日编辑:
我尝试了@Cooper 提供的代码。这是我所做的:
function testOfYourCode() {
var medianResults=[11.0,45.0,11.0,12.0];
var productType=["ProductA","ProductB","ProductC","ProductD"];
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Copyof01Summary');
var rg=sh.getDataRange();
var cA=rg.getBackgrounds();
var vA=rg.getValues();
for(let t=0;t<productType.length;t++) {
for(let m=0;m<medianResults.length;m++) {
vA.forEach(function(r, i) {
r.forEach(function(c, j) {
if (vA[i][1]==productType[t] && vA[i][6]<=medianResults[m]) {
cA[i][6]="#d9ead3"
} if (vA[i][1]==productType[t] && vA[i][6]>medianResults[m]) {
cA[i][6]="#f4cccc"
}
});
});
}
}
rg.setBackgrounds(cA);
}
出于某种原因,我不知道为什么,ProductB 的颜色格式不正确。它适用于所有其他产品类型,但不适用于 ProductB(请参见下面的屏幕截图)。有谁知道为什么会发生这种故障?
解决方案
这个怎么样:
function randomcolors2d() {
var medianResults=[11.0,45.0,11.0,12.0];
var productType=["ProductA","ProductB","ProductC","ProductD"];
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet4');
var rg=sh.getDataRange();
var cA=rg.getBackgrounds();
var vA=rg.getValues();
for(let t=0;t<productType.length;t++) {
for(let m=0;m<medianResults.length;m++) {
vA.forEach(function(r, i) {
r.forEach(function(c, j) {
if (vA[i][1]==productType[t] && vA[i][6]<=medianResults[m]) {
cA[i][6]="#f4cccc";//red
} if (vA[i][1]==productType[t] && vA[i][6]>medianResults[m]) {
cA[i][6]="#d9ead3";//green
}
});
});
}
}
rg.setBackgrounds(cA);
}
也许这就是您所需要的:
function testOfYourCode() {
var pA=[{type:"ProductA",medianResults:11.0},{type:"ProductB",medianResults:45.0},{type:"ProductC",medianResults:11.0},{type:"ProductD",medianResults:12.0}]
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Copyof01Summary');
var rg=sh.getDataRange();
var cA=rg.getBackgrounds();
var vA=rg.getValues();
pA.forEach(function(e,m) {
vA.forEach(function(r,i) {
r.forEach(function(c,j) {
if (vA[i][1]==pA[m].type && vA[i][6]<=pA[m].medianResults) {
cA[i][6]="#d9ead3"
} if (vA[i][1]==pA[m].type && vA[i][6]>pA[m].medianResults) {
cA[i][6]="#f4cccc"
}
});
});
});
rg.setBackgrounds(cA);
}
当我意识到也许这就是你试图用这两个 4 元素数组实现的目标时,我正要放弃;
var pA=[{type:"ProductA",medianResults:11.0},{type:"ProductB",medianResults:45.0},{type:"ProductC",medianResults:11.0},{type:"ProductD",medianResults:12.0}]
如果它们与每个产品相关联,那么通过每个产品对它们进行索引就没有任何意义。这就是编程和明智的分析必须结合在一起的地方。如果您没有正确地向我们提供数据,那么我们将无能为力。
推荐阅读
- excel - Excel VBA 转大写
- c# - .NET 5.0:在多项目解决方案中构建项目
- regex - 使用正则表达式如何知道字符串的值是否为零?
- groovy - 遍历 Json 映射,创建带有嵌入链接的 html 表
- mongodb - MongoDB查找两个查询结果之间的交集
- python - 如何减去两个日期列,结果仅为正整数
- python - 调用“python3”会导致分段错误
- c# - 创建一个自定义 BindableProperty,它采用 XAML 中基础返回类型的自定义定义字符串表示形式
- c# - 在删除之前修改字典的元素
- python - 关于颜色的散点图图例 [Python3]