簡體   English   中英

如何使用應用程序腳本獲取范圍內所有單元格的背景顏色並將背景設置為相同大小的不同范圍?

[英]How to get background color of all cells in a range and set background to a different range of the same size using apps script?

我正在嘗試從一系列單元格中復制背景顏色並將其粘貼到不同的范圍內。 就我而言,我想要的顏色是第 3 行到第 53 行以及從 E 到 BC 的每隔一列的范圍。 在 A1 格式中,它將是 (['E3:E53','G3:G53','I3:I53', ... 'BA3:BA53','BC3:BC53'])。 我想獲得這個范圍的背景顏色,然后將它粘貼到我的目標范圍,在第 3 行到第 53 行之間以及從 D 到 BB 的每隔一列。 A1 表示法中的這個范圍是 (['D3:D53','F3:F53','H3:H53' ... 'AZ3:AZ53','BB3:BB53'])。

換句話說,我希望目標范圍內的每個單元格都與其右側的相鄰單元格顏色相同。

這就是我目前所擁有的。

這是我使用應用程序腳本想要的結果。

我知道我可以手動更改顏色,但是我的工作表中的值經常更改,並且我要復制的單元格的顏色基於條件格式規則,這意味着我必須定期手動更改所有單元格的顏色. 這就是我想使用應用程序腳本的原因,所以我所要做的就是運行一個函數,它會為我創造我想要的效果。

我對編碼世界很陌生,但這是我嘗試過的。

 setColor(){ var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Coach"); var targetArea = ss.getRangeList(['D3:D53','F3:F53','H3:H53','J3:J53','L3:L53','N3:N53','P3:P53','R3:R53','T3:T53','V3:V53','X3:X53','Z3:Z53', 'AB3:AB53','AD3:AD53','AF3:AF53','AH3:AH53','AJ3:AJ53','AL3:AL53','AN3:AN53','AP3:AP53','AR3:AR53','AT3:AT53','AV3:AV53','AX3:AX53','AZ3:AZ53', 'BB3:BB53']); var desiredColor = ss.getRangeList(['E3:E53','G3:G53','I3:I53','K3:K53','M3:M53','O3:O53','Q3:Q53','S3:S53','U3:U53','W3:W53','Y3:Y53', 'AA3:AA53','AC3:AC53','AE3:AE53','AG3:AG53','AI3:AI53','AK3:AK53','AM3:AM53','AO3:AO53','AQ3:AQ53','AS3:AS53','AU3:AU53','AW3:AW53','AY3:AY53', 'BA3:BA53','BC3:BC53']); var background = desiredColor.getBackgrounds; targetArea.setBackgrounds(background) }

我運行了代碼,但它告訴我“targetArea.setBackgrounds 不是函數”。 如果我從 .setBackground 中刪除“s”,它根本不會做任何事情。 沒有錯誤或任何東西。

任何幫助將不勝感激! 謝謝!

RangeList 對象上的setBackground()方法允許您只提供一種顏色。 相反,您希望在各個范圍內調用setBackgrounds() (或setBackgroundObjects() )。 您可以通過調用getRanges()來獲取它們,然后遍歷它們以應用您想要的任何更改。

function setColor() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Coach");
  var targetRangeList = ss.getRangeList(['D3:D53','F3:F53','H3:H53','J3:J53','L3:L53','N3:N53','P3:P53','R3:R53','T3:T53','V3:V53','X3:X53','Z3:Z53',
                               'AB3:AB53','AD3:AD53','AF3:AF53','AH3:AH53','AJ3:AJ53','AL3:AL53','AN3:AN53','AP3:AP53','AR3:AR53','AT3:AT53','AV3:AV53','AX3:AX53','AZ3:AZ53',
                               'BB3:BB53']);
  var sourceRangeList = ss.getRangeList(['E3:E53','G3:G53','I3:I53','K3:K53','M3:M53','O3:O53','Q3:Q53','S3:S53','U3:U53','W3:W53','Y3:Y53',
                               'AA3:AA53','AC3:AC53','AE3:AE53','AG3:AG53','AI3:AI53','AK3:AK53','AM3:AM53','AO3:AO53','AQ3:AQ53','AS3:AS53','AU3:AU53','AW3:AW53','AY3:AY53',
                               'BA3:BA53','BC3:BC53']);
  
  var sourceRanges = sourceRangeList.getRanges();
  var targetRanges = targetRangeList.getRanges();
  for (var i = 0; i < sourceRanges.length; i++) {
    targetRanges[i].setBackgrounds(sourceRanges[i].getBackgrounds());
  }
}

順便說一下,您可能可以通過更編程的方式獲得這些范圍,因為目標范圍似乎是奇數列,而源范圍是偶數列,並且它們的高度都相同。

問題:

  • var background = desiredColor.getBackgrounds; 實際上不會執行getBackgrounds()因為您忘記了括號。
  • 但是,即使您沒有忘記它, getBackgrounds()setBackgrounds()都是范圍對象的方法,而不是您在方法中使用的rangeList對象。

解決方案:

由於范圍是非連續的,您不能只使用getRange() 相反,您可以創建一個范圍列表並迭代它們以獲得所需的結果。

function setColor(){
  const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Coach");
  const targetArea = ['D3:D53','F3:F53','H3:H53','J3:J53','L3:L53','N3:N53','P3:P53','R3:R53','T3:T53','V3:V53','X3:X53','Z3:Z53',
                               'AB3:AB53','AD3:AD53','AF3:AF53','AH3:AH53','AJ3:AJ53','AL3:AL53','AN3:AN53','AP3:AP53','AR3:AR53','AT3:AT53','AV3:AV53','AX3:AX53','AZ3:AZ53',
                               'BB3:BB53'];
                               
  const desiredColor = ['E3:E53','G3:G53','I3:I53','K3:K53','M3:M53','O3:O53','Q3:Q53','S3:S53','U3:U53','W3:W53','Y3:Y53',
                               'AA3:AA53','AC3:AC53','AE3:AE53','AG3:AG53','AI3:AI53','AK3:AK53','AM3:AM53','AO3:AO53','AQ3:AQ53','AS3:AS53','AU3:AU53','AW3:AW53','AY3:AY53',
                               'BA3:BA53','BC3:BC53'];
                               
  
  const targetArea_Ranges = targetArea.map(ta=>ss.getRange(ta))
  const desiredColor_Ranges = desiredColor.map(dr=>ss.getRange(dr))
  
  targetArea_Ranges.forEach((tr,index)=>{
  tr.setBackground(desiredColor_Ranges[index].getBackground())
  });

}

前面的答案是對的。 您正在調用Rangelist類中不可用的方法。 在這個答案中,我想添加一種替代方法,基於這樣一個事實,即您的所有范圍都是連續的並遵循 ​​1 到 1 的模式:

  • 在 1 次擺動中獲得所有范圍: D3:BC53
  • getBackgrounds並在數組中復制內存中的粘貼顏色
  • setBackgrounds修改后的數組。
function setColors() {
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Coach');
  const allArea = sh.getRange('D3:BC53');
  const backgrounds = allArea.getBackgrounds();
  for (const row of backgrounds) {
    for (let i = 0; i < row.length - 1; row[i++] = row[i++]);
  }
  allArea.setBackgrounds(backgrounds);
}

暫無
暫無

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

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