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

问题描述 投票:1回答:1

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

在电子表格中,我有一列包含值列表(“ 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");
}
}



}

目前没有颜色变化。我猜我不太确定如何正确编写for循环/ if语句以达到预期的效果。可能只有我的电子表格中使用某种条件格式公式来执行此操作吗? enter image description here

for-loop google-apps-script google-sheets conditional-formatting
1个回答
4
投票
  • 您想在“ C4”的下拉列表的值相同的“ A4:A8”范围内更改单元格的背景颜色。
  • 您想使用Google Apps脚本来实现。
  • 从您的脚本中,您不想使用事件对象。

如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。

修改点:

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

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

enter image description here

模式1:

在此图案中,仅将所选值的背景色更改为红色。因此,例如,当选择“ A”时,“ A”的背景颜色变为红色。并且当选择“ C”时,“ C”的背景色变为红色。在这种情况下,将重置背景色“ 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);
}

模式2:

在此图案中,将保存所选值的背景色。因此,例如,当选择“ A”时,“ A”的背景颜色变为红色。并且当选择“ C”时,“ C”的背景色变为红色。在这种情况下,“ 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;
    }
  }
}

现代javascript:

您可以使用现代javascript语法。为此,您需要enable V8 runtime。之后,您可以

/**
 *
 * @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' : ''])
    );
  }
};

参考:

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

© www.soinside.com 2019 - 2024. All rights reserved.