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”
  • 我认为在阵列中处理过滤过程可以降低成本
当上述各点反映到脚本中时,它将变成如下所示

修改脚本: 参考资料:

我提出了一个改进的脚本,以降低脚本的过程成本。你能确认一下吗?如果这不是你期望的方向,我道歉。嘿@Tanaike,谢谢你的高质量回答。今天晚些时候我会看看你的提案。但乍一看,这正是我想要的。关于“选择股票”的错误,抓住了!为了回答这个问题,我试图简化代码。因此,我重命名了一些变量,并希望删除这些参数。我猜出什么事了。将在问题中改变这一点。我迫不及待地想测试你的代码。速度从大约30秒增加到大约1秒。非常感谢@Tanaike!
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);
}