根据下拉菜单中的选择更改单元格颜色

Ian*_*ell 1 for-loop conditional-formatting google-sheets google-apps-script

这是我正在编写的脚本,以帮助我弄清楚如何编写更复杂的脚本。

在我的电子表格中,我有一列包含值列表(“testRange”、“testRangeValues”)。我还有一个下拉列表(“testCell”、“testCellValue”)。下拉列表包含一些在“testRange”列表中的值和一些不在的值。

我希望我的脚本以这样一种方式运行,当我从下拉列表中选择一个与 testRange 列表中的值匹配的值时,testRange 列表中相应值的背景颜色变为红色。

function onEdit3(e) {

var testRange = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A4:A8");
var testRangeValues = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("A4:A8").getValues();
var testCell = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("C4");
var testCellValue = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange("C4").getValue(); 

for(var i = 0;i<testRange.length;i++){
if(testCellValue==testRangeValues[i]){
testRange[i].setBackground("Red");
}
}



}
Run Code Online (Sandbox Code Playgroud)

目前没有发生颜色变化。我想我不太确定如何正确编写我的 for 循环/if 语句以达到预期的效果。有没有办法在我的电子表格中使用某种条件格式公式来做到这一点?在此处输入图片说明

Tan*_*ike 5

  • 您想更改“A4:A8”范围内单元格的背景颜色,即“C4”下拉列表的值相同。
  • 您想使用 Google Apps 脚本来实现这一点。
  • 从您的脚本中,您不想使用事件对象。

如果我的理解是正确的,这个答案怎么样?请将此视为几种可能的答案之一。

改装要点:

  • 工作表对象可以由 编写var sheet = SpreadsheetApp.getActiveSheet();。这样,您可以sheet用于检索范围。
  • sheet.getRange("A4:A8")并且sheet.getRange("C4")可以使用一次。
  • 在这种情况下,范围对象不能在循环中使用,因为testRange.length返回null.

当以上几点反映到你的脚本中时,它变成如下。

在此处输入图片说明

模式一:

在此模式中,仅所选值的背景颜色更改为红色。因此,例如,选择“A”时,将“A”的背景颜色更改为红色。And when "C" is selected, the background color of "C" is changed to the red color. 在这种情况下,“A”的背景颜色被重置。

修改后的脚本:

function onEdit3(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var testRange = sheet.getRange("A4:A8");
  var testRangeValues = testRange.getValues();
  var testCell = sheet.getRange("C4");
  var testCellValue = testCell.getValue();

  var backgroundColors = testRangeValues.map(function([a]) {return [a == testCellValue ? "Red" : ""]});
  testRange.setBackgrounds(backgroundColors);
}
Run Code Online (Sandbox Code Playgroud)

模式2:

在此模式中,所选值的背景颜色被保存。因此,例如,选择“A”时,将“A”的背景颜色更改为红色。And when "C" is selected, the background color of "C" is changed to the red color. 在这种情况下,“A”的背景颜色保持红色。

修改后的脚本:

function onEdit3(e) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var testRange = sheet.getRange("A4:A8");
  var testRangeValues = testRange.getValues();
  var testCell = sheet.getRange("C4");
  var testCellValue = testCell.getValue();

  for (var i = 0; i < testRangeValues.length; i++) {
    if (testRangeValues[i] == testCellValue) {
      sheet.getRange("A" + (4 + i)).setBackground("Red");
      break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现代javascript:

您可以使用现代 javascript 语法。为此,您需要启用 V8 运行时。在这之后你可以

/**
 *
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
const onEdit = e => {
  const sheet = e.range.getSheet();
  const value = e.range.getValue();
  if (sheet.getName() == 'Sheet1' && e.range.getA1Notation() === 'C2') {
    const range = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1);
    range.setBackgrounds(
      range.getValues().map(row => [row[0] === value ? 'red' : ''])
    );
  }
};
Run Code Online (Sandbox Code Playgroud)

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。