我拼凑了一个谷歌脚本脚本,用于谷歌表格,旨在找到某些行并移动它们。
当某一列中的复选框被标记时,我将从该行获取一系列单元格,然后将它们移动到另一列。我希望他们转到该列的最后一个空行。或者,如果方便的话,他们可以去第一个空行。
我已经有了这个功能,但是我担心一旦我的工作表达到一百或几百行,这个功能会运行得非常慢。
有人能帮我以更优化/高效的方式编写这段代码吗?
编辑:我需要特定列子集的最后一行,而不仅仅是整个工作表中的最后一行。
代码如下:
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);
}
}
新的稍微优化的代码:
{
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);
}
}
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缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返