添加边框并更改表格中空白单元格的颜色

时间:2017-04-21 01:41:08

标签: google-apps-script google-sheets

我在Google表格中有一张来自我的贝斯俱乐部的锦标赛结果表(参见https://docs.google.com/spreadsheets/d/1hPH2lKDtDqdjnghbYS3kWtXb3IGmunXao1JuWdi5SgM/edit?usp=sharing中的TX摘要标签)。该表是按成员分组并按事件编号旋转的QUERY函数的结果。当俱乐部成员没有参加特定锦标赛时,表格中的相应单元格为空白。

Click here for an image of the desired table state

我有一个我复制和修改的Google脚本(见下文),它会更改活动工作表上单元格的边框和颜色。如果QUERY结果在所有单元格中填充了值,则效果很好。我可以将表格外的空白单元格更改为#0066cc,没有边框。我能够将包含表区域内值的单元格更改为#dbdbdb,并在所有边上都有边框。

我所挣扎的是QUERY结果包含BLANK单元格的时候。对于那些情节,我想添加边框并将颜色更改为#aaaaaa。目前,该脚本正在对表#0066cc中的空白单元格进行着色,而不是添加边框(通过else语句)。我最终得到了一张桌子,看起来我一直在玩BREAKOUT(还记得那个?)。我在第二个if语句中尝试了多种比较变体(我认为==""或===""会这样做)试图改变那些细胞,但我似乎无法让它发挥作用。我知道我可能遗漏了一些非常非常简单的东西,但看着这个直到我的眼睛流血,我看不到森林里的树木了。任何帮助将不胜感激。

谢谢,

Duke Bevard

function summaryBorders() {
var doc = SpreadsheetApp.getActiveSheet()
var range = SpreadsheetApp.getActiveSheet().getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns());
var cells = doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).getBackgrounds();
range.setBorder(false, false, false, false, false, false);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
  for (var j = 0; j < values[i].length; j++) {
    if (values[i][j] !== "") {
      range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
      cells[i][j] = "#dbdbdb";
      if (values[i][j] == "" && j >=2 && j<15) {
        range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
        cells[i][j] = "#aaaaaa";
        }
    } else {
      cells[i][j] = "#0066cc";
    }
  }  
}
doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).setBackgrounds(cells);

}

3 个答案:

答案 0 :(得分:0)

这似乎有效 - 它无法工作的原因是因为空白单元格和零单元格之间存在差异。空白意味着具有“空间”的单元格,零单元格就像不活动一样。因此我将其更改为0或空白,同时我删除了小部分“&amp;&amp; j&gt; = 2&amp;&amp; j&lt; 15”进行测试 - 您将要重新添加它。

function summaryBorders() {
var doc = SpreadsheetApp.getActiveSheet()
var range = SpreadsheetApp.getActiveSheet().getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns());
var cells = doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).getBackgrounds();
range.setBorder(false, false, false, false, false, false);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
  for (var j = 0; j < values[i].length; j++) {
    if (values[i][j] !== "") {
      range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
      cells[i][j] = "#dbdbdb"; }
      if (values[i][j] = 0 || values[i][j] == "") {
        range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
        cells[i][j] = "#aaaaaa";
        }
     else {
      cells[i][j] = "#0066cc";
    }
  }  
}
doc.getRange(1, 1, doc.getMaxRows(), doc.getMaxColumns()).setBackgrounds(cells);
}

答案 1 :(得分:0)

尝试限制范围。

我用过这段代码:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];
 // Returns the active range
 var range = sheet.getRange(3,3,3,4);
  Logger.log(range.getLastRow())
 var cells = sheet.getRange(3,3,3,4).getBackgrounds();

  var values = range.getValues();
for (var i = 0; i < values.length; i++) {
  for (var j = 0; j < values[i].length; j++) {
    if (values[i][j] !== "") {
      range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
      cells[i][j] = "#dbdbdb";
      if (values[i][j] == "" && j >=2 && j<15) {
        range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
        cells[i][j] = "#aaaaaa";
        }
    } else {
      cells[i][j] = "#0066cc";
    }
  }  
}
  sheet.getRange(3,3,3,4).setBackgrounds(cells);
}

结果:

enter image description here

希望这有帮助。

答案 2 :(得分:0)

您无法将数据范围内的空白单元格变为灰色的原因是因为以下代码存在错误:

if (values[i][j] !== "") {                  // This block doesn't run when you have a blank cell
      range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
      cells[i][j] = "#dbdbdb";
      if (values[i][j] == "" && j >=2 && j<15) {            // this if statement is never called I.e. this block is skipped over when the cell is empty
        range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
        cells[i][j] = "#aaaaaa";
        }
    } else {
      cells[i][j] = "#0066cc";
    }

永远不会执行第二个if语句。因为它位于块的第一个内部,当遇到空单元时,它永远不会被执行。 为了使它正常工作,你必须做这样的事情

if (values[i][j] !== "") {
      range.getCell(i + 1, j + 1).setBorder(true, true, true, true, true, true)
      cells[i][j] = "#dbdbdb";
   } else if (values[i][j] == "" && j >=2 && j<15) {
        range.getCell(i + 1,j + 1).setBorder(true, true, true, true, true, true)
        cells[i][j] = "#aaaaaa";
    } else {
      cells[i][j] = "#0066cc";
    }

有关if else的详细信息,请查看tutorial here