【问题标题】:How can I change the cell colour in Google Apps Script for each cell individually inside a for loop?如何在 for 循环中为每个单元格单独更改 Google Apps 脚本中的单元格颜色?
【发布时间】:2020-05-26 22:06:27
【问题描述】:

我的问题是:*如何在 Google Apps 脚本中为 for 循环内的每个单元格单独更改单元格颜色?

我有一个包含多个值的数据集,这些值按 ID 变量分组,我想分别与它们的总体平均值或中位数进行比较。在下面的玩具示例中,您会发现变量 uniqueValues 用作 ID 变量,变量 median 包含每个组的中位数。

我编写的代码在两个条件下检查我的数据并返回是或否。当然,在 Google Apps 脚本中,我想将这些相当无用的结果更改为例如绿色或红色背景颜色。然而,这是我无数次未能成功的部分。也许你可以帮我解决这个问题。

这是我编写的代码,用于查看我的想法是否按预期工作 - 我认为可以。

var uniqueValues = ["a", "b", "c", "d"];
var median = [10, 12, 13, 18];

var data = [["a", "ab", 1, 2, 1, 8],
        ["a", "ab", 1, 4, 5, 9],
        ["a", "ab", 1, 4, 3, 10],
        ["a", "ab", 8, 2, 4, 11],
        ["a", "ab", 3, 3, 1, 12],
        ["b", "bb", 1, 2, 1, 9],
        ["b", "bb", 1, 8, 3, 11],
        ["b", "bb", 10, 2, 1, 12],
        ["b", "bb", 1, 6, 2, 13],
        ["b", "bb", 11, 21, 1, 16],
        ["c", "cb", 1, 6, 11, 9],
        ["c", "cb", 3, 5, 1, 12],
        ["c", "cb", 1, 6, 11, 13],
        ["c", "cb", 7, 8, 1, 14],
        ["c", "cb", 3, 8, 11, 20],
        ["d", "dd", 4, 4, 11, 16],
        ["d", "dd", 1, 1, 2, 17],
        ["d", "dd", 9, 4, 22, 18],
        ["d", "dd", 2, 6, 5, 19],
        ["d", "dd", 4, 3, 1, 29]];

var temp = [];
for (let i = 0; i < uniqueValues.length; i++) {

  data.map(function (outerArray) {
if (outerArray[i] == uniqueValues[i] && outerArray[5] > median[i]) {
  temp.push("yes");
} else if (outerArray[i] == uniqueValues[i] && outerArray[5] <= median[i]) {
  temp.push("no");
}
  });
}
console.log(temp);

但是,我在 Google Apps 脚本中未能成功。我得到的是一张完全绿色的纸。这是我迄今为止尝试过的。

var summarySheet = workbook.getSheetByName("01Summary");
// this next line is the cause of my trouble I guess!
var rangeToFormat = summarySheet.getRange(3, 1, summarySheet.getLastRow(), summarySheet.getLastColumn());
var dataForFormat = summarySheet.getRange(3, 1, summarySheet.getLastRow(), summarySheet.getLastColumn()).getValues();

for (let i = 0; i < uniqueValues.length; i++) {

  dataForFormat.map(function (outerArray) {
    if (outerArray[i] == uniqueValues[i] && outerArray[6] > medianResults[i]) {
      rangeToFormat.setBackground("red");
    } else if (outerArray[i] == uniqueValues[i] && outerArray[6] <= medianResults[i]) {
      rangeToFormat.setBackground("green");
    }
  });
};

我认为我的错误是我使用变量rangeToFormat 中的整个工作表进行格式化。这显然是不正确的。但是,我不知道如何在我的循环中解决这个问题。也许我需要一个临时变量来添加到循环的迭代中?像row j + i of loop 之类的?

无论如何。任何帮助将不胜感激!

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


    【解决方案1】:

    也许这个简单的例子会对你有所帮助:

    function randomColors() {
      var colors=['red','orange','yellow','green','blue'];//could be strings like '#ffffff'
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('Sheet1');  
      var rg=sh.getRange(1,1,25,1);
      var cA=rg.getBackgrounds();
      var vA=rg.getValues();
      vA.forEach(function(r,i){cA[i][0]=colors[Math.floor(Math.random()*colors.length)]});
      rg.setBackgrounds(cA);
    }
    

    或者通过一些小的调整,你可以去二维

    function randomcolors2d() {
      var colors=['red','orange','yellow','green','blue'];
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('Sheet1');  
      var rg=sh.getRange(1,1,25,10);
      var cA=rg.getBackgrounds();
      var vA=rg.getValues();
      vA.forEach(function(r,i){
        r.forEach(function(c,j){
          cA[i][j]=colors[Math.floor(Math.random()*colors.length)]
        });
      });
      rg.setBackgrounds(cA);
    }
    

    【讨论】:

    • 感谢您对库珀的意见。明天我会检查你的方法。希望我能利用您的宝贵见解为我的问题找到解决方案。如果是这样,我会立即接受您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2022-01-10
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多