【问题标题】:Looping through cells in a range in Google Sheets with Google Script使用 Google Script 循环遍历 Google Sheets 中某个范围内的单元格
【发布时间】:2021-08-07 05:43:16
【问题描述】:

我想编写一个脚本,允许我仅突出显示(背景颜色)选定范围内的某些单元格,例如,即使我选择了整个表格,也只突出显示第 2 列和第 2 行中的单元格。

例如:

例如:

For each cell in selected range {
	If selected cell[i][j] is within allowed range {
		cell background color = green
	};
};

我要完成的代码:

function BackgroundColor() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var range = sheet.getActiveRange();
  var cells = range.getValues();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  
  for (var i = 0; i < numRows; i++) {
    for (var j = 0; j < numCols; j++) {
      if (range.getValues()[i][j] == '') {
        range.setBackground('#00B050').setFontColor('#ffffff')
      }
    }
  }
  range.setValues(cells);
};

我能够在 VBA 中实现它:

Sub cmdGreen()

    Dim Cel As Range
    Dim GreenArrayCount As Integer
    Dim InteriorColor As Long, FontColor As Long
    Dim GreenArray() As Variant
    Dim BodyRange As String

    InteriorColor = VBA.RGB(0, 176, 80) 'interior in green
    FontColor = VBA.RGB(255, 255, 255) 'font in white
    GreenArray = Array("COLUMN 2", "ROW 2")
    BodyRange = ActiveSheet.ListObjects(1).DataBodyRange.Address

    For Each Cel In Application.Selection.Cells
        If Not Intersect(Cel, Range(BodyRange)) Is Nothing Then
            For GreenArrayCount = LBound(GreenArray) To UBound(GreenArray)
                If (ActiveSheet.ListObjects(1).HeaderRowRange(Cel.Column).Value _
                    = GreenArray(GreenArrayCount) Or _
                    ActiveSheet.ListObjects(1).DataBodyRange(Cel.Row - 1, 1).Value _
                    = GreenArray(GreenArrayCount)) Then
                    Cel.Interior.Color = InteriorColor
                    Cel.Font.Color = FontColor
                End If
            Next GreenArrayCount
        End If
    Next Cel

End Sub

有人可以帮帮我吗?

【问题讨论】:

  • 请多谈谈“允许范围”。我们应该如何知道哪些单元格颜色为绿色?
  • 在我的示例中,如附图所示 (i.stack.imgur.com/wCJhe.png),允许的范围是 COLUMN 2 和 ROW 2。如果选择了此范围内的单元格,则只能着色。
  • “允许范围”是否总是 R2 和C2?如果是这种情况,则不需要所有代码。只需将范围设置为 R2 和 C2,然后设置背景。
  • 在这个例子中,是的。但我想阻止人们将单元格的背景设置在这个范围之外。这是一个可共享的工作表。
  • 我添加了一个等效的 VBA 代码,它在 Excel 中也是如此。这就是我想要的,但对于 Google 表格。

标签: loops google-apps-script google-sheets range highlight


【解决方案1】:

修改代码:

function BackgroundColor() {

  var okColumn = [3, 6, 7, 8, 9];
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var selection = sheet.getSelection();
  var range = sheet.getActiveRange();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  var startRow = range.getRow();
  var startCol = range.getColumn();

  for (var i = 3; i < numRows; i++) {
    for (var j = 0; j < numCols; j++) {
      for (var k = 0; k <= 4; k++) {
        if ((startRow + i == okRow) || (startCol + j == okColumn[k])) {
          range.getCell(i+1,j+1).setBackground('#00B050').setFontColor('#ffffff')
        }
      }
    }
  }
};

【讨论】:

    【解决方案2】:

    无疑有很多方法可以提高性能,但这应该可以解决问题。

    function BackgroundColor() {
      var okRow = 2;
      var okColumn = 2;
      var spreadsheet = SpreadsheetApp.getActive();
      var sheet = spreadsheet.getActiveSheet();
      var selection = sheet.getSelection();
    
      //Logger.log('Active Range: ' + selection.getActiveRange().getA1Notation());
    
      var range = selection.getActiveRange();
      var numRows = range.getNumRows();
      var numCols = range.getNumColumns();
      var startRow = range.getRow();
      var startCol = range.getColumn();
      //Logger.log('row: ' + startRow);
      //Logger.log('col: ' + startCol);
      //Logger.log('num row: ' + numRows);
      //Logger.log('num col: ' + numCols);
    
      for (var i = 0; i < numRows; i++) {
        for (var j = 0; j < numCols; j++) {
          if ((startRow+i == okRow) || (startCol+j == okColumn)){
            //Logger.log('found: ' + i+' '+j);
            range.getCell(i+1,j+1).setBackground('#00B050').setFontColor('#ffffff')
          }
        }
      }
    };
    

    请注意,范围是从 0 开始的,但 getCell 是从 1 开始的。 还要注意,我的行和列是基于实际的行和列,而不是它们的标签。在您的示例中,okRow 为 4,okColumn 为 3。

    【讨论】:

    • 非常感谢你,杰里米!它起作用了,我能够对其进行修改以满足我的需要。下面,我发布了修改后的代码。
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多