Google apps script 如何使用AppScript加速将过滤数据集从一个Google电子表格传输到另一个Google电子表格
我写了一个简短的脚本,将某些行从一张纸复制到另一张纸上。初始工作表是一个较大的数据集,第二个工作表应该是一个过滤集,以便更容易地在数据集上创建自定义图形 当前代码:Google apps script 如何使用AppScript加速将过滤数据集从一个Google电子表格传输到另一个Google电子表格,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我写了一个简短的脚本,将某些行从一张纸复制到另一张纸上。初始工作表是一个较大的数据集,第二个工作表应该是一个过滤集,以便更容易地在数据集上创建自定义图形 当前代码: function updateChartRows() { var sheetOriginal = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1"); var sheetChart = SpreadsheetApp.getActiv
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++;
}
}
代码相当简单。它转到原始工作表,根据关键字查找数据。它获取与关键字匹配的单元格数组
然后我在matches数组上循环,并将该单元格整行的值复制到第二张工作表上的新行。我们只需要前三列中的值。
(我们可以假设新工作表为空,并且由于第一行和第二行中的标签,我们从第三行开始。)
我注意到代码现在的执行时间大约为30秒。我发现这相当慢,因为当前的原始数据集仍然很小。大约60条记录
我假设慢度存在于while循环中。对于每个匹配,它必须在原始工作表中进行查找,以找到正确的行和值
有没有办法改进这一点?例如,有没有更好的方法来获取所有相关数据,包括实际值而不是单元格引用,而不是创建textFinder
我还在上尝试了该函数,但仍然只得到与关键字匹配的单元格引用。因此,我仍然需要查找整行的值。我相信您的目标如下
- 您希望从“sheet1”中检索值
- 您希望使用
搜索值filterValue
- 您希望将过滤后的值放入“sheet2”
- 您希望降低脚本的处理成本
- 例如,
可以用作SpreadsheetApp.getActiveSpreadsheet()
。这样,在脚本的前两行就可以降低成本var ss=SpreadsheetApp.getActiveSpreadsheet()
- 作为降低脚本成本的方法,我想提出以下流程。
- 从“sheet1”中检索值
- 检索过滤后的值
- 将过滤后的值放入“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);
}