Google Apps 脚本占用太多时间,有没有办法减少运行时间?
Google Apps Script is taking too much time, is there a way to reduce the runtime?
function dataManp() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("My-Sheet-1");
var pasteSheet = ss.getSheetByName("My-Sheet-2");
var clearContentRange = pasteSheet.getRange("A1:Z100");
clearContentRange.clearContent();
var source = copySheet.getRange("a1:f100");
var destination = pasteSheet.getRange("a1:f100");
source.copyTo(destination, {formatOnly:true , contentsOnly:true});
source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);
var rows = pasteSheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[3] == '') {
var deleteRowNum = (parseInt(i)+1) - rowsDeleted
pasteSheet.deleteRow(deleteRowNum);
// temp_array[i] = i
rowsDeleted++;
}
}
pasteSheet.deleteColumn(2)
}
嗨,
我写了下面的脚本来执行下面的操作,
- 从
My-Sheet-1
复制数据并粘贴到 My-Sheet-2
- 删除与第 3 列中的空单元格对应的行。
- 删除第 2 列后
现在,My-Sheet-1
仅包含 60 行和 20 行,脚本大约需要 7 秒才能完成。然而,将来行数可能会增加到 1000 左右。有没有办法优化上面的代码,以便花费更少的时间完成。
我的观察是,复制和粘贴数据只需要几毫秒。主要耗时的部分是操作,我粘贴后在pasteSheet
执行。如果我们可以将 My-Sheet-1
复制到临时变量(复制所有内容,包括公式、格式规范、值、文本等)并在临时变量中执行所有操作,然后将所有内容粘贴到临时变量中,这可能会有所帮助变量到所需的目标 sheet。但是,我不知道如何将 sheet 中的所有内容复制到临时变量中,而且我不确定这是否会减少时间。 如果我也能得到一些帮助,我会很高兴(即将 sheet 中的所有内容复制到临时变量,对变量执行操作,然后将变量中的数据粘贴到新 sheet)
谢谢
编辑 - 1
想补充一点,My-Sheet-1
包含混合数据(即数字、颜色格式的文本、某些单元格中的公式等)
解释:
deleteRow()
每次执行需要一些时间,所以不建议在循环中使用数百行。
简单的答案是:
- 使用
getValues()
为 Sheet1 创建一个二维数组。
- 根据行2是否为空删除/过滤掉数组元素。
- 使用
setValues()
将筛选后的数组写入Sheet2。
示例代码:
function dataManp() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("My-Sheet-1");
var pasteSheet = ss.getSheetByName("My-Sheet-2");
var lr = copySheet.getLastRow();
var clearContentRange = pasteSheet.getRange(1,1,lr,26);
clearContentRange.clearContent();
var source = copySheet.getRange(1,1,lr,6);
var destination = pasteSheet.getRange(1,1,lr,6);
source.copyTo(destination, {formatOnly:true , contentsOnly:true});
source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);
destination.clearContent();
var values = source.getValues();
var temp_array = [];
for (var i = 0; i < lr; i++) {
var rowValue = values[i];
if (rowValue[2] != '') {
temp_array.push(rowValue);
}
}
var newDest = pasteSheet.getRange(1,1,temp_array.length,6)
newDest.setValues(temp_array);
pasteSheet.deleteColumn(2);
}
需要注意的是,您需要对一列中的所有行使用相同的格式。
示例输入:
示例输出:
function dataManp() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("My-Sheet-1");
var pasteSheet = ss.getSheetByName("My-Sheet-2");
var clearContentRange = pasteSheet.getRange("A1:Z100");
clearContentRange.clearContent();
var source = copySheet.getRange("a1:f100");
var destination = pasteSheet.getRange("a1:f100");
source.copyTo(destination, {formatOnly:true , contentsOnly:true});
source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);
var rows = pasteSheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[3] == '') {
var deleteRowNum = (parseInt(i)+1) - rowsDeleted
pasteSheet.deleteRow(deleteRowNum);
// temp_array[i] = i
rowsDeleted++;
}
}
pasteSheet.deleteColumn(2)
}
嗨,
我写了下面的脚本来执行下面的操作,
- 从
My-Sheet-1
复制数据并粘贴到My-Sheet-2
- 删除与第 3 列中的空单元格对应的行。
- 删除第 2 列后
现在,My-Sheet-1
仅包含 60 行和 20 行,脚本大约需要 7 秒才能完成。然而,将来行数可能会增加到 1000 左右。有没有办法优化上面的代码,以便花费更少的时间完成。
我的观察是,复制和粘贴数据只需要几毫秒。主要耗时的部分是操作,我粘贴后在pasteSheet
执行。如果我们可以将 My-Sheet-1
复制到临时变量(复制所有内容,包括公式、格式规范、值、文本等)并在临时变量中执行所有操作,然后将所有内容粘贴到临时变量中,这可能会有所帮助变量到所需的目标 sheet。但是,我不知道如何将 sheet 中的所有内容复制到临时变量中,而且我不确定这是否会减少时间。 如果我也能得到一些帮助,我会很高兴(即将 sheet 中的所有内容复制到临时变量,对变量执行操作,然后将变量中的数据粘贴到新 sheet)
谢谢
编辑 - 1
想补充一点,My-Sheet-1
包含混合数据(即数字、颜色格式的文本、某些单元格中的公式等)
解释:
deleteRow()
每次执行需要一些时间,所以不建议在循环中使用数百行。
简单的答案是:
- 使用
getValues()
为 Sheet1 创建一个二维数组。 - 根据行2是否为空删除/过滤掉数组元素。
- 使用
setValues()
将筛选后的数组写入Sheet2。
示例代码:
function dataManp() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var copySheet = ss.getSheetByName("My-Sheet-1");
var pasteSheet = ss.getSheetByName("My-Sheet-2");
var lr = copySheet.getLastRow();
var clearContentRange = pasteSheet.getRange(1,1,lr,26);
clearContentRange.clearContent();
var source = copySheet.getRange(1,1,lr,6);
var destination = pasteSheet.getRange(1,1,lr,6);
source.copyTo(destination, {formatOnly:true , contentsOnly:true});
source.copyTo(destination,SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS,false);
destination.clearContent();
var values = source.getValues();
var temp_array = [];
for (var i = 0; i < lr; i++) {
var rowValue = values[i];
if (rowValue[2] != '') {
temp_array.push(rowValue);
}
}
var newDest = pasteSheet.getRange(1,1,temp_array.length,6)
newDest.setValues(temp_array);
pasteSheet.deleteColumn(2);
}
需要注意的是,您需要对一列中的所有行使用相同的格式。
示例输入:
示例输出: