繁体   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