Как я могу изменить цвет ячейки в скрипте Google Apps для каждой ячейки отдельно внутри для l oop? - PullRequest
0 голосов
/ 27 мая 2020

Мой вопрос: * Как я могу изменить цвет ячейки в Google Apps Script для каждой ячейки отдельно внутри для l oop?

У меня есть набор данных, содержащий несколько значений, сгруппированных по переменной ID , которые я хотел бы сравнить с их общим средним или медианным значением соответственно. В приведенном ниже примере игрушки вы найдете переменную uniqueValues, которую я использую как переменную идентификатора, и переменную median, которая содержит медианное значение для каждой группы.

Написанный мной код проверяет мои данные по двум условиям и возвращает либо да, либо нет. Конечно, в Google Apps Script я хотел бы изменить эти довольно бесполезные результаты, например, на зеленый или красный цвет фона. Однако это та часть, где мне не удавалось добиться успеха бесчисленное количество раз. Может быть, вы могли бы помочь мне решить эту проблему.

Вот код, который я написал, чтобы проверить, работает ли моя идея так, как ожидалось - я думаю, что это так.

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 для форматирования. Что явно неверно. Однако я не знаю, как исправить это в моем l oop. Может мне нужна временная переменная для добавления к итерациям моего l oop? Типа row j + i of loop или что-то в этом роде?

В любом случае. Любая помощь будет оценена по достоинству!

1 Ответ

2 голосов
/ 27 мая 2020

Возможно, вам поможет этот простой пример:

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);
}

Или с небольшими настройками вы можете go двухмерный

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);
}

enter image description here

...