Google Apps脚本更改Google表格中特定单元格的背景颜色

时间:2017-08-25 19:34:06

标签: google-apps-script

我正在使用Google工作表上的Google App脚本,我从时间驱动的触发器运行此功能。我希望能够在工作表上定位特定单元格(如果单元格值="打开"),以便我可以更改单元格的背景颜色。我想知道如何才能完成这项工作?我能够定位单元格,但是我不知道如何更改单元格背景的属性,因为无法调用.setBackground()。

function myColorFunction() {
  var s = SpreadsheetApp.getActiveSheet();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getSheetByName("Form Responses 1").getRange(2,6,ss.getLastRow());
  var cellRange = range.getValues();
  Logger.log(cellRange);
  Logger.log(cellRange.length);
  Logger.log(cellRange.valueOf());

  for(i = 1; i<cellRange.length; i++){
     if(cellRange[i] == "Open")
     {
       Logger.log("change color here");
     } else {
       Logger.log("don't change color");
     } 
  }
}

2 个答案:

答案 0 :(得分:4)

修改

V8 runtime引入以来,人们就可以利用现代ES6功能,例如箭头功能和解构功能。此外,可以对脚本进行优化,以免在大型集合中变得缓慢。

首先,遵循最佳实践很重要。诸如getRangesetBackgroundsetValue之类的I / O(输入/输出)操作很慢。不要在循环内使用它们,而应使用getBackgroundssetBackgroundssetValuessetFontColors等批处理操作。

第二,处理值网格比每次需要移至另一行时偏移范围要快得多。链接getDataRangegetValues以从工作表中获取所有值并直接在结果数组上工作(如果工作表中有很多数据,请根据自己的喜好使用getRange遵循相同的原则。

最后,硬编码工作表名称使脚本不灵活,它应该是函数的参数,或者至少是函数可以访问的上下文中的已声明常量。


代码段

鉴于上述修改,(其他答案的)代码段可以进行如下修改:

const myColorFunction = ({
  sheetName = "Form Responses 1",
  targetValue = "Open"
} = {}) => {

  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const sheet = ss.getSheetByName(sheetName);

  const rng = sheet.getDataRange();

  const numHeaders = 1;

  const backgrounds = rng.getBackgrounds();
  const fontColors = rng.getFontColors();

  const newBckgs = backgrounds.map((row) => {
    const [firstCell] = row;

    if (firstCell === targetValue) {
      row[5] = "red";
    }

    return row;
  });

  const newColors = fontColors.map((row) => {
    const [firstCell] = row;

    if (firstCell === targetValue) {
      row[5] = "white";
    }

    return row;
  });

  rng.setBackgrounds(newBckgs);
  rng.setFontColors(newColors);
}

注释

  1. 为了节省时间,您可以同时进行两个map通话,但是 我将它们拆分为更清晰的流程,并避免突变 backgroundsfontColors数组。
  2. 您还应该从硬编码中删除"red""white"以及用于设置颜色的列索引。

答案 1 :(得分:3)

您可以将setBackground属性与getRange一起使用。请尝试以下代码段。

function myColorFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var range = ss.getSheetByName("Form Responses 1").getRange(2,6,ss.getLastRow());
  var cellRange = range.getValues();

  for(i = 0; i<cellRange.length-1; i++){
     if(cellRange[i][0] == "Open")
     {
       ss.getSheetByName("Form Responses 1").getRange(i+2,6).setBackground("red");
       ss.getSheetByName("Form Responses 1").getRange(i+2,6).setFontColor('white');
     }
  }
}