当前位置: 首页 > 知识库问答 >
问题:

优化Google脚本功能-查找最后一行

殳经略
2023-03-14

我拼凑了一个谷歌脚本脚本,用于谷歌表格,旨在找到某些行并移动它们。

当某一列中的复选框被标记时,我将从该行获取一系列单元格,然后将它们移动到另一列。我希望他们转到该列的最后一个空行。或者,如果方便的话,他们可以去第一个空行。

我已经有了这个功能,但是我担心一旦我的工作表达到一百或几百行,这个功能会运行得非常慢。

有人能帮我以更优化/高效的方式编写这段代码吗?

编辑:我需要特定列子集的最后一行,而不仅仅是整个工作表中的最后一行。

代码如下:

function moveDoneTask()
{

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = SpreadsheetApp.getActiveSheet();

 var columnNumberToWatch = 7;
 var range = sheet.getActiveCell();

 var lastRowinProgressColumns; 
 var lastRowinDoneColumns = 0;

 for (var i=1, doneRows=sheet.getRange("K:S").getNumRows(); i<=doneRows; i++) {
    if ( !sheet.getRange(i, 11, 1, 9).isBlank() ) 
    {
      lastRowinDoneColumns = i;
      Logger.log("last done row" +lastRowinDoneColumns);
    }
  }

  for (var j=1, notDoneRows=sheet.getRange("A:I").getNumRows(); j<=notDoneRows; j++) {
    if (!sheet.getRange(j, 1, 1, 9).isBlank()) 
    {
      lastRowinProgressColumns = j;
      Logger.log("last not done row" +lastRowinProgressColumns);
    }
  }

 if (range.getColumn() == columnNumberToWatch && range.isChecked()) 
 {
   Logger.log("is checked");

   targetRange = sheet.getRange(lastRowinDoneColumns + 1, 11)
   cellsToMove = sheet.getRange(range.getRow(), 1, 1, 9)
   belowCellsToMove = cellsToMove.offset(1, 0) //get the row of cells below the cells that are about to be moved
   rangeMovingUp = sheet.getRange("A"+belowCellsToMove.getRow()+":I"+lastRowinProgressColumns)

   Logger.log("row below me is row " + belowCellsToMove.getRow());

   cellsToMove.moveTo(targetRange);
   rangeMovingUp.moveTo(cellsToMove);

 }
}

谢谢你的帮助!

编辑2:采纳以下建议并对脚本进行了一些更改,现在似乎运行得更快了:

function moveDoneTask()
{
 var sheet = SpreadsheetApp.getActiveSheet(); 
 var columnNumberToWatch = 7;
 var range = sheet.getActiveCell(); 

 if (range.getColumn() == columnNumberToWatch && range.isChecked()) 
 {
   targetRow = (sheet.getRange('M11:S').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1);
   targetRange = sheet.getRange(targetRow, 11)
   notDoneRows = sheet.getRange("A:I").getNumRows()
   cellsToMove = sheet.getRange(range.getRow(), 1, 1, 9)
   belowCellsToMove = cellsToMove.offset(1, 0)
   rangeMovingUp = sheet.getRange("A"+belowCellsToMove.getRow()+":I"+notDoneRows)

   cellsToMove.moveTo(targetRange);
   rangeMovingUp.moveTo(cellsToMove);
 }
} 

共有2个答案

万俟浩
2023-03-14

新的稍微优化的代码:

{
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = SpreadsheetApp.getActiveSheet();

 var columnNumberToWatch = 7;
 var range = sheet.getActiveCell();

 var targetRow;
 var lastRowinProgressColumns = 0;

 if (range.getColumn() == columnNumberToWatch && range.isChecked()) 
 {
   targetRow = (sheet.getRange('L3:S').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1);
   targetRange = sheet.getRange(targetRow, 11)

     for (var j=1, notDoneRows=sheet.getRange("A:I").getNumRows(); j<=notDoneRows; j++) {
    if (!sheet.getRange(j, 1, 1, 9).isBlank()) 
    {
      lastRowinProgressColumns = j;
      Logger.log("last not done row" +lastRowinProgressColumns);
    }
  }
   cellsToMove = sheet.getRange(range.getRow(), 1, 1, 9)
   belowCellsToMove = cellsToMove.offset(1, 0)
   rangeMovingUp = sheet.getRange("A"+belowCellsToMove.getRow()+":I"+lastRowinProgressColumns)

   cellsToMove.moveTo(targetRange);
   rangeMovingUp.moveTo(cellsToMove);
 }
}
薛经艺
2023-03-14
  • 获取某个列的最后一行的可能性是使用getNextDataCell(方向)。这会将边缘上的下一个单元格返回到空区域(如果中间没有空白单元格,则相当于第一个空行)。请注意,有一个留档错误,正确的语法是:var lastRowinProgressColns=sheet.get范围(1,11). getNextDataCell(SpreadsheetApp.方向。#####################################################################################################################################
  • 为了使代码更有效,首先检查活动范围是否在正确的列中(if(range.get列()==列NumberToWatch

 类似资料:
  • 我有一个“数据库”表——60列宽100,000行。 在我的另一个工作表中,我有一列(V)指定该数据库工作表上的行,我需要在不同的列(T)中显示来自特定数据库列的相应值。 所以,我尝试编写一个自定义函数,它接收V中的所有值,从数据库中检索值,并用T填充它们。例如,在T3中,我将拥有=myFunction(V3: V100) 然后,我的脚本for循环遍历V中的每个单元格,并执行如下操作:(*peopl

  • 我有一张保存ID的表。现在,我偶尔需要读取这些ID,并检查表中的其他值(名称)是否仍然符合ID。我的代码是: 从我所读到的,我知道单独调用每个单元格值需要更多的时间。然而,我不知道如何应用getValue来修复这些情况。基本上相同的问题在不同的衣服我有以下代码: 那么我如何使用get值来检查我得到的每个ID呢。我想我得用一些 或者 但我不知道如何实施,有什么想法吗? 有没有其他更有效的方法

  • 本文向大家介绍PowerShell脚本性能优化技巧总结,包括了PowerShell脚本性能优化技巧总结的使用技巧和注意事项,需要的朋友参考一下 最终优化 在你写脚本时,不要老是想着去优化,因为你的部分优化代码可能最终被丢弃。而且老是想着优化也会降低你的生产效率,因为和CPU的时间相比,脚本编写者的时间可能会更宝贵。 使用过滤参数 PowerShell可能会消耗很多资源,因为许多Cmdlet本身的设

  • 问题内容: 我正在写一个不支持两阶段提交的资源适配器。我知道有一种称为“最后的资源优化”的优化技术。 在JBoss上,您的XAResource类应实现LastResource以便进行优化。 我的问题是:如何在WebLogic,WebSpehre,Glassfish等中完成此操作… 问题答案: Weblogic: AFAIK (可能是非常错误的),只有JDBC驱动程序可以与LRO一起使用,这 纯粹是

  • 设置:我有一个Google工作表,我想在其中运行一个使用脚本实现的自定义函数。此脚本用于执行相对较长的URL查找和解码过程(每次调用10毫秒,取决于带宽和ping)。自定义函数使用一列作为输入,并返回结果。 问题:当我的Google工作表打开时,使用此计算的列将刷新。这会使Google工作表停止大约10秒钟,直到重新计算列中的每个单元格。这只会变得更糟,因为我添加到我的电子表格。 问题:我可以更改

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返