Javascript 试图在Google应用程序脚本中基于关键字设置BackgroundColor

Javascript 试图在Google应用程序脚本中基于关键字设置BackgroundColor,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正试图根据相关关键字突出显示表中的一行。然而,我试图设置我的单元格区域的背景色,却没有得到任何颜色。我在if/else语句中使用了记录器,它们都工作正常,所以我认为我在某种程度上做错了setBackgroundColor function statusHighlighter(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheetName = ss.getActiveSheet(); var sheetValue

我正试图根据相关关键字突出显示表中的一行。然而,我试图设置我的单元格区域的背景色,却没有得到任何颜色。我在if/else语句中使用了记录器,它们都工作正常,所以我认为我在某种程度上做错了
setBackgroundColor

function statusHighlighter(){
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = ss.getActiveSheet();
  var sheetValues = ss.getDataRange().getValues();

  sheetValues.forEach(function(row, index) {
    var acctStatus = row[7];
    var highlightRange = sheetName.getRange(index+1, 1, 1, sheetName.getLastColumn());

    if(acctStatus === "Kept"){
      highlightRange.setBackgroundColor('##fffec4');
      Logger.log(acctStatus + " " + index);
    } else if(acctStatus === "Suspended"){
      highlightRange.setBackground('##cf4a4a');
    } else if(acctStatus === "Deleted"){
      highlightRange.setBackground('##6c75ad');
    }
  });
} 
解释/问题: 您的代码中有一个问题,我想建议您进行一些优化

  • 十六进制颜色代码只能包含一个,但您使用的是两个

  • 您可以使用迭代,但您可以在
    forEach
    循环中创建一个带有颜色的数组,然后使用来一次性设置颜色。看看为什么

  • >P>因为您有一个特定的兴趣栏,只考虑<强> > <强>列,而不是完整的<代码> DATARANGE>代码>是有意义的。在下面的脚本中,
    acctStatusVals
    只考虑列
    8
    。我之所以选择
    8
    ,是因为在代码中使用了
    7
    的数组索引,这相当于列
    8
    。小心点。在我的代码中,
    8
    表示列
    H
    。根据你的需要调整这个。要将2D数组转换为1D,因为我们使用的是单个列,您可以使用

  • 我使用以下表达式:
    Array(lastCol).fill(“#6c75ad”)
    创建一个包含
    lastCol
    元素数()的数组,并使用相同的值,因为目标是使用相同的颜色值为整行着色

优化解决方案: 小心使用激活的工作表。在运行此代码之前,请确保选择了正确的工作表。我建议您使用
ss.getSheetByName('Sheet1')但我将其保留为注释,因为此步骤是可选的

function statusHighlighter(){ 
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheetName = ss.getActiveSheet();
//  const sheetName = ss.getSheetByName('Sheet1'); // change to the name of your sheet
  const lastRow = sheetName.getLastRow();
  const lastCol = sheetName.getLastColumn();
  const acctStatusVals = sheetName.getRange(1,8,lastRow).getValues().flat();
  const colors = [];
  acctStatusVals.forEach(acctStatus=>{
   if(acctStatus === "Kept"){
      colors.push(Array(lastCol).fill('#fffec4'));
    } else if(acctStatus === "Suspended"){
      colors.push(Array(lastCol).fill('#cf4a4a'));
    } else if(acctStatus === "Deleted"){
      colors.push(Array(lastCol).fill('#6c75ad'));
    }                   
  });
  sheetName.getRange(1, 1, lastRow, lastCol).setBackgrounds(colors);
}
用于上述脚本的工作表:


感谢您的回答,看到编码的最佳实践非常有帮助。我所做的唯一更改是将lastRow调整为sheetName.getLastRow()-1,并轻推sheetName.getRange(2,1,lastRow,lastCol)以调整标题行。再次感谢您的帮助!