首页 > 解决方案 > 循环多个条件并使用两个数组作为输入时,如何更改 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(请参见下面的屏幕截图)。有谁知道为什么会发生这种故障?

在此处输入图像描述

标签: javascriptarraysloopsgoogle-apps-scriptgoogle-sheets

解决方案


这个怎么样:

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}]

在此处输入图像描述

如果它们与每个产品相关联,那么通过每个产品对它们进行索引就没有任何意义。这就是编程和明智的分析必须结合在一起的地方。如果您没有正确地向我们提供数据,那么我们将无能为力。


推荐阅读