当我有 200 行时,这个 appscript 运行 faster/be 可以更快地重写为 运行 吗?

Can this appscript run faster/be rewritten to run faster when I have 200 rows?

1.代码描述: 我写了这个应用程序脚本,对于每一行,A 列中的单元格的颜色与该行中最后一个包含文本的单元格的颜色相同。此外,我使用 onEdit 触发器,所以每当我编辑一行时,脚本 运行s。当我有大约 20 行和 20 列(2-3 秒)时,这工作正常。

2。问题: 我现在有一个 sheet,大约有 200 行 和 20 列,而且代码非常慢(3-4 分钟或更长时间)。

3。问题: 如何让它 运行 更快,或者,根据我的需要,我应该用另一种方式编写这个任务吗?

4.我考虑过但不喜欢的解决方案:

5.代码:

 function colorFirstCell() {

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheetByName('courseX');
 var lastRow = sheet.getLastRow();
 var lastColumn = sheet.getLastColumn();
 var columnFirstCells = 1; // column of cell to be colored
 var dataRange = sheet.getRange(1,1, lastRow, lastColumn + 1).getValues(); 

for(var i = 0; i < lastRow; i++) 
  {   
  for(var j = 0; j < lastColumn; j++) { 
      if(dataRange[i][j] != '' && dataRange[i][j+1] == '') { // cell not empty and cell to the right is empty
         var backgroundColor = sheet.getRange(i + 1, j + 1).getBackground(); // get color
         sheet.getRange(i + 1, columnFirstCells).setBackground(backgroundColor); // set color 
         of first col cell
          } 
       } 
     } 
  } 

我相信你的目标如下。

  • 您想减少脚本的处理成本。

这样的话,下面的修改怎么样?

修改后的脚本:

function colorFirstCell2() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('courseX');
  var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
  var backgrounds = range.getBackgrounds();
  var colors = range.getDisplayValues().map((r, i) => {
    for (var j = r.length - 1; j >= 0; j--) {
      if (r[j] != "") {
        return [backgrounds[i][j]];
      }
    }
    return [null];
  });
  sheet.getRange(1, 1, colors.length).setBackgrounds(colors);
}
  • 在这种情况下,首先从数据范围中检索值和背景颜色。然后,创建一个包含背景颜色的数组。并且,将创建的数组放入“A”列。

参考文献: