簡體   English   中英

使用 Google Script 循環瀏覽 Google Sheets 中某個范圍內的單元格

[英]Looping through cells in a range in Google Sheets with Google Script

我想編寫一個腳本,允許我僅突出顯示(背景顏色)選定范圍內的某些單元格,例如,僅在 COLUMN 2 和 ROW 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

任何人都可以幫助我嗎?

修改后的代碼:

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')
        }
      }
    }
  }
};

毫無疑問,有一些方法可以提高性能,但這應該可以解決問題。

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 的。 還要注意,我這里的 ok 行和列是基於實際的行和列,而不是它們的標簽。 在您的示例中,okRow 為 4,而 okColumn 為 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM