如何使用AppScript加速将过滤后的数据集从一个传输到另一个谷歌电子表格



我写了一个简短的脚本,将某些行从一张纸复制到另一张纸。初始工作表是一个更大的数据集,第二个工作表应该是一个过滤集,以便更容易地在数据集上创建自定义图形。

当前代码:

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()。这样,可以在脚本的前两行降低成本
  • 作为降低脚本成本的方法,我想提出以下流程。
    1. 从";sheet1">
    2. 检索筛选的值
    3. 将过滤后的值设置为"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((

相关内容

  • 没有找到相关文章

最新更新