我编写了一个简短的脚本,可以将某些行从一个工作表复制到另一个工作表。初始工作表是一个更大的数据集,第二个工作表应该是一个筛选集,以便更容易地在数据集上创建自定义图形。
目前的代码:
function updateChartRows() {
var sheetOriginal = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
var sheetChart = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet2");
var filterValue = "someValue";
var matches = sheetOriginal.createTextFinder(filterValue);
var match = null;
var i = 0;
while ((match = matches.findNext()) != null) {
var search_range = sheetOriginal.getRange(match.getRowIndex(), 1,1,3);
var update_range = sheetChart.getRange(i+3,1,1,3);
update_range.setValues(search_range.getValues());
i++;
}
}
代码相当简单。它进入原始工作表,并根据关键字对数据进行查找。它获得一个与关键字匹配的单元格数组。
然后循环遍历匹配数组,并将该单元格的整个行的值复制到第二个工作表的新行中。我们只需要前三列的值。(我们可以假设te新工作表为空,并从第三行开始,因为在第一行和第二行都有标记。)
我注意到代码现在有大约30秒的执行时间。因为当前的原始数据集仍然很小,所以我发现它很慢。大概有60条记录。
我认为慢度存在于时间循环中。对于每一次匹配,它都必须在原始工作表中进行查找,以找到正确的行和值。
有什么办法可以改进吗?例如,是否有更好的方法来获取所有相关数据,包括实际值,而不是对单元格的引用,而不是创建textFinder?
我还在TextFinder上尝试了TextFinder函数,但我仍然只获得匹配关键字的引用单元格。因此,我仍然需要进行查找才能获得整行的值。
发布于 2020-09-11 16:44:09
我相信你的目标如下。
filterValue
搜索这些值。修改要点:
SpreadsheetApp.getActiveSpreadsheet()
可以用作var ss = SpreadsheetApp.getActiveSpreadsheet()
。这样,您的脚本中的前2行就可以降低成本。当以上要点反映到您的脚本中时,如下所示。
修改脚本:
function updateChartRows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetOriginal = ss.getSheetByName("sheet1");
var sheetChart = ss.getSheetByName("sheet2");
var filterValue = "someValue";
// 1. Retrieve the values from "sheet1".
var srcValues = sheetOriginal.getDataRange().getValues();
// 2. Retrieve the filtered values.
var dstValues = srcValues.reduce((ar, e) => {
if (e.some(f => f === filterValue)) ar.push(e.splice(0, 3));
return ar;
}, []);
// 3. Put the filtered values to "sheet2".
sheetChart.getRange(3, 1, dstValues.length, dstValues[0].length).setValues(dstValues);
}
参考文献:
https://stackoverflow.com/questions/63850575
复制相似问题