2017-01-23 50 views
1

我是Google新手,但卡住了。Google腳本:清除具有特定背景的單元格的內容(要慢)

下面的代碼完美的作品,但它在所有指定範圍的時間超過10分鐘循環。 它清除單元格的內容,但不是綠色背景的內容。

function deletNoGreenCells() { 
var namedRange = ['HaM','BeM','LoM'] 
for (var k=0; k<namedRange.length; ++k) { 
    var range=SpreadsheetApp.getActiveSpreadsheet().getRangeByName(namedRange[k]) 

for(var i = 1; i < range.getNumRows()+1; ++i){ 
for(var j = 1; j<range.getNumColumns()+1;++j){ 
    if (range.getCell(i, j).getBackground()!= "#93c47d") { 
range.getCell(i, j).clearContent() 
}}}}} 

我該如何得到這個更快?

乾杯!

回答

0

我還沒有嘗試過這一點,但如果你只是清除來自非綠色細胞的數據,你也許可以做到這一點:

  1. 呼叫getData的範圍內獲得包含數組所有的範圍值
  2. 呼叫getBackgrounds得到的背景顏色相應的數組
  3. 使用背景陣列更新數據陣列,消隱要清除
  4. 呼叫的要素setDataØ返回修改後的陣列

看起來像這樣在大塊中讀寫數據可能會更快。

1

謝謝馬修的鏈接調用getBackgrounds,至極利茲我此解決方案:

function deletNoGreenCells() { 
    var namedRange = ['HaM','BeM','LoM'] 
    for (var k = 0; k < namedRange.length; ++k) { 
    var range =SpreadsheetApp.getActiveSpreadsheet().getRangeByName(namedRange[k]) 
    var backgrounds = range.getBackgrounds(); 
    for(var i = 0; i < range.getNumRows(); ++i) { 
     for(var j = 0; j<range.getNumColumns(); ++j) { 
     if (backgrounds[i][j] != "#93c47d") { 
      range.getCell(i+1, j+1).clearContent() 
     }  
     } 
    } 
    } 
} 

現在它只能運行5秒鐘。謝謝!

+0

太好了。通過將不會改變的內容(SpreadsheetApp.getActiveSpreadsheet(),Range.getNumRows()和Range.getNumColumns())緩存到變量中,不需要每次計算它們各自的循環。 –

+0

謝謝。再快一點。 – Supenk

相關問題