首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用AppScript将过滤后的数据集从一个电子表格传输到另一个

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

Stack Overflow用户
提问于 2020-09-11 08:05:03
回答 1查看 41关注 0票数 1

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

目前的代码:

代码语言:javascript
运行
AI代码解释
复制
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函数,但我仍然只获得匹配关键字的引用单元格。因此,我仍然需要进行查找才能获得整行的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-11 16:44:09

我相信你的目标如下。

  • 您希望从"sheet1“中检索值。
  • 您希望使用filterValue搜索这些值。
  • 您希望将过滤后的值放到"sheet2“中。
  • 您希望降低脚本的进程成本。

修改要点:

  • 例如,SpreadsheetApp.getActiveSpreadsheet()可以用作var ss = SpreadsheetApp.getActiveSpreadsheet()。这样,您的脚本中的前2行就可以降低成本。
  • 作为降低脚本成本的方法,我想提出以下流程。
    1. 从"sheet1“中检索值。
    2. 检索过滤后的值。
    3. 将过滤后的值放入"sheet2“。

  • 我认为可以通过处理阵列中的过滤过程来降低成本。

当以上要点反映到您的脚本中时,如下所示。

修改脚本:

代码语言:javascript
运行
AI代码解释
复制
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);
}

参考文献:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63850575

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文