我写了一个简短的脚本,将某些行从一张纸复制到另一张纸。初始工作表是一个更大的数据集,第二个工作表应该是一个过滤集,以便更容易地在数据集上创建自定义图形。
当前代码:
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++;
}
}
代码相当简单。它转到原始工作表,并根据关键字查找数据。它得到一个与关键字匹配的单元格数组。
然后,我循环遍历匹配数组,并将该单元格整行的值复制到第二张表上的新行。我们只需要前三列中的值。(我们可以假设新的纸张是空的,由于第一行和第二行的标签,我们从第三行开始。(
我注意到代码现在的执行时间大约为30秒。我发现这相当慢,因为当前的原始数据集仍然很小。大约有60条记录。
我认为慢存在于while循环中。对于每一个匹配,它都必须在原始工作表中进行查找,以找到正确的行和值。
有什么方法可以改进吗?例如,有没有更好的方法来获取所有相关数据,包括实际值,而不是对单元格的引用,而不是创建textFinder?
我还在TextFinder上尝试了findAll((函数,但仍然只得到与关键字匹配的引用单元格。因此,我仍然需要进行查找以从整行中获取值。
我相信你的目标如下。
- 您想要从";sheet1">
- 您希望使用
filterValue
搜索值 - 您希望将过滤后的值设置为"0";sheet2">
- 您希望降低脚本的处理成本
修改点:
- 例如,
SpreadsheetApp.getActiveSpreadsheet()
可以用作var ss = SpreadsheetApp.getActiveSpreadsheet()
。这样,可以在脚本的前两行降低成本 - 作为降低脚本成本的方法,我想提出以下流程。
- 从";sheet1">
- 检索筛选的值
- 将过滤后的值设置为"0";sheet2">
- 我认为可以通过处理阵列中的滤波器过程来降低成本
当以上几点反映到您的脚本中时,它变成如下。
修改的脚本:
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);
}
参考文献:
- getValues((
- setValues(值(
- reduce((