Google 应用程序脚本(电子表格)- 根据颜色计算单元格值

Google App Script (Spreadsheet) - Calculate Cell Values based on Color

我希望根据同一列但第 y 行的单元格的颜色来计算第 x 行的单元格的值。

即: 如果B3,D3和E3是蓝色的。 然后对 B4、D4 和 E4 的值求和。

我目前的尝试(很差):

function sumWhereBackgroundColorElseWhereIs(color, colorRange, valueRange) {

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var colorRange = sheet.getRange(colorRange);
  var valueRange = sheet.getRange(valueRange);

  var total = 0;

  for (var i = 1; i <= colorRange.getNumRows(); i++) {
    for (var j = 1; j <= colorRange.getNumColumns(); j++) {

      var cell = range.getCell(i, j);

      if(cell.getBackgroundColor() == color) {

      }
    }
  }
  for 
  var valueCell = range.getCell(i, j);
  total += parseFloat(cell.getValue());
  return total;
}

您无法使用自定义函数来完成您正在尝试做的事情。

自定义函数中的范围参数将值数组从范围发送到函数,而不是范围对象本身。

因此,在您的代码中,colorRange 将包含范围内的值而不是范围本身,因此无法确定背景颜色。

我就是这样完成的。

function setForegroundColor() {
  var spreadSheet = SpreadsheetApp.openByUrl(""); 
  var sheet = spreadSheet.getSheets()[0];
  var range = sheet.getRange(3, 2, 1, 10); //getRange(row, column, numRows, numColumns) (change the last value to increase the columns serviced)
  for (i = 1; i < 11; i++) {
    cell = range.getCell(1,i);
    color = cell.getBackground();
    cell.setFontColor(color);
  }
}

function calculateBLUFORManPower() {
 var spreadSheet = SpreadsheetApp.openByUrl(""); 
  var sheet = spreadSheet.getSheets()[0];
  var x = 0;
  var range = sheet.getRange(3, 2, 1, 10); //getRange(row, column, numRows, numColumns) (change the last value to increase the columns serviced)
  var cell = sheet.getRange("A17");
  var BLUFORColor = cell.getBackground();
  for (i = 1; i < 11; i++) {
    cell = range.getCell(1,i);
    color = cell.getBackground();
    if (color == BLUFORColor && cell.getValue != "") {
      x = x + cell.getValue();
    }
  }
  var cell = sheet.getRange("B19");
  cell.setValue(x);
}

function calculateBLUFORUnits() {
  var spreadSheet = SpreadsheetApp.openByUrl(""); 
  var sheet = spreadSheet.getSheets()[0];
  var x = 0;
  var range = sheet.getRange(3, 2, 1, 10); //getRange(row, column, numRows, numColumns) (change the last value to increase the columns serviced)
  var cell = sheet.getRange("A17");
  var BLUFORColor = cell.getBackground();
  for (i = 1; i < 11; i++) {
    cell = range.getCell(1,i);
    color = cell.getBackground();
    if (color == BLUFORColor) {
      x += 1;
    }
  }
  var cell = sheet.getRange("B18");
  cell.setValue(x);
}

function calculateOPFORManPower() {
  var spreadSheet = SpreadsheetApp.openByUrl(""); 
  var sheet = spreadSheet.getSheets()[0];
  var x = 0;
  var range = sheet.getRange(3, 2, 1, 10); //getRange(row, column, numRows, numColumns) (change the last value to increase the columns serviced)
  var cell = sheet.getRange("A20");
  var OPFORColor = cell.getBackground();
  for (i = 1; i < 11; i++) {
    cell = range.getCell(1,i);
    color = cell.getBackground();
    if (color == OPFORColor && cell.getValue != "") {
      x = x + cell.getValue();
    }
  }
  var cell = sheet.getRange("B22");
  cell.setValue(x);
}

function calculateOPFORUnits() {
  var spreadSheet = SpreadsheetApp.openByUrl(""); 
  var sheet = spreadSheet.getSheets()[0];
  var x = 0;
  var range = sheet.getRange(3, 2, 1, 10); //getRange(row, column, numRows, numColumns) (change the last value to increase the columns serviced)
  var cell = sheet.getRange("A20");
  var OPFORColor = cell.getBackground();
  for (i = 1; i < 11; i++) {
    cell = range.getCell(1,i);
    color = cell.getBackground();
    if (color == OPFORColor) {
      x += 1;
    }
  }
  var cell = sheet.getRange("B21");
  cell.setValue(x);
}

function OPFOR() {
  calculateOPFORUnits();
  calculateOPFORManPower();
}

function BLUFOR() {
  calculateBLUFORUnits();
  calculateBLUFORManPower();
}

function ALL(){
  setForegroundColor();
  BLUFOR();
  OPFOR();
}

Pastebin

您无法按照您的方式获取调用背景颜色的范围。

已发布解决方法 here

此外,您必须键入颜色代码而不是名称。

在您的情况下,您必须像这样输入自定义函数

=sumWhereBackgroundColorElseWhereIs("#0000ff","B3:F3","B4:F4")

或者像这样

 =sumWhereBackgroundColorElseWhereIs("#0000ff",CELL("address",B3)&":"&CELL("address",F3),CELL("address",B4)&":"&CELL("address",F4))

你的脚本看起来像这样

 function sumWhereBackgroundColorElseWhereIs(color, ColorRange, ValueRange) {

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  var colorRange = sheet.getRange(ColorRange);
  var valueRange = sheet.getRange(ValueRange);
  var firstColumn = colorRange.getColumn();
  var lastColumn = colorRange.getLastColumn();
  var valueRangeRow = valueRange.getRow();
  var backgrounds = colorRange.getBackgrounds();
  backgrounds = backgrounds.toString().split(",");

  var total = 0;

  for (var i = firstColumn; i <= lastColumn; i++) {
    var ref = i - firstColumn;
    if (backgrounds[ref] === color) {
      total = total + Number(sheet.getRange(valueRangeRow, i).getValue());
    }
  }

  return total; 
}