簡體   English   中英

Google 應用程序腳本 - 為什么我的 for 循環沒有執行?

[英]Google apps script - Why isn't my for-loop executing?

如果單元格的背景顏色 = #ffff00,我正在嘗試編寫一個簡單的腳本來清除特定 Google 表格范圍 [H29:H] 中的值。 雖然腳本不會返回任何錯誤,但它不會對符合這些條件的單元格(或工作表中的任何其他位置)進行任何更改。 關於我哪里出錯的任何指導?

    function resetCells() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getSheetByName('Test Sheet');
    var rangeData = sheet.getDataRange();
    var lastRow = rangeData.getLastRow();
    var searchRange = sheet.getRange('H29:H');
    var rangeColors = searchRange.getBackgrounds();

        for ( i = 29 ; i < lastRow - 1; i++){
          if(rangeColors[i][8] === '#ffff00'){
            sheet.getRange(i,8).clearContent();
          }; 
        };

    }

當我看到你的腳本時,我認為rangeColors的索引可能與 for 循環中的i不對應。 我認為這可能是您的問題的原因。 在這種情況下,如何進行以下修改?

修改后的腳本:

從:

for ( i = 29 ; i < lastRow - 1; i++){
  if(rangeColors[i][8] === '#ffff00'){
    sheet.getRange(i,8).clearContent();
  }; 
};

至:

for (i = 0; i < rangeColors.length; i++) {
  if (rangeColors[i][0] === '#ffff00') {
    sheet.getRange(i + 29, 8).clearContent();
  }
}

或者,在您的情況下,當sheet.getRange(i + 29, 8).clearContent()在循環外使用時,處理成本可能會降低一點。 在這種情況下,請進行如下修改。

var rangeList = rangeColors.reduce((ar, [h], i) => {
  if (h === '#ffff00') ar.push("H" + (i + 29));
  return ar;
}, []);
sheet.getRangeList(rangeList).clearContent();
  • 在本修改中,當“H”列單元格的背景顏色為#ffff00時,單元格內容清晰。

參考:

你做錯了什么

rangeColors[i][8]中,您假設rangeColors與電子表格中的單元格相關。 但它們實際上與您所做的searchRange相關。 所以rangeColors[i][8]應該是rangeColors[i][0] i0開始。

為了讓你“額外有趣” rangeColors是一個從零開始索引的數組。 當您使用范圍時,您可以使用range.getCell(1, 1)檢索第一個單元格,而不是range.getCell(0, 0)

因為我有點忘乎所以我寫了這個解決方案(可能是一個有趣的額外閱讀)

我不認為將 arrays ( rangeColors )數組映射到一個范圍是一個很好的方法。 很難跟蹤您的代碼在做什么。

我所做的是:

  1. 創建要檢查的范圍
  2. 為范圍內的所有單元格生成列號和行號。 請注意,這些是相對於范圍,而不是樣式表。 所以range.getCell(1, 1)range 中左上角的單元格。 這是您在代碼中犯的(主要)錯誤。
  3. 對范圍內的每個單元格做任何你想做的事情。

代碼:

resetCells( '#ffff00' );

function resetCells( color ) {
  const app= SpreadsheetApp.getActiveSpreadsheet();
  const sheet = app.getSheetByName('Sheet1');
  const range = sheet.getRange('F4:F50');

  for( let row = 1; row < range.getNumRows() + 1; row++ ) {
    for( let column = 1; column < range.getNumColumns() + 1; column++ ) {

      const cell = range.getCell( row, column );
      if( cell.getBackground() === color )
        cell.clearContent();
        
    }
  }

}

免責聲明:我以前從未使用過這個 google-app-script。 所以我可能在性能方面做錯了什么; 迭代大量單元格需要一點時間;

暫無
暫無

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

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