繁体   English   中英

将过滤后的范围从一个电子表格复制到另一个 - Google 应用脚本

[英]Copy filtered range from one spreadsheet to another - Google app script

我有一个谷歌表中有 30275 行和 133 列的大型谷歌表。 我想过滤数据并将 AZ 列复制到另一个电子表格。

电子表格链接: https://docs.google.com/spreadsheets/d/1aiuHIYzlCM7zO_5oZ0aOCKDwPo06syXhWvhQMKgJE2I/edit?usp=sharing

我一直在尝试关注此链接

我对 javascript 不太熟悉,代码旨在从过滤器中排除项目,而不是在过滤器中包含项目。 我有 500 多个要排除的项目,因此需要在达到执行限制之前在短时间内找出有效过滤大型数据集的方法。

到目前为止,这是我的代码。 任何帮助来完成这项工作将不胜感激。

注意:由于数据量大,使用 importrange 公式进行过滤/查询不起作用。 所以我需要一个高效的脚本来过滤大型数据集并在执行时间限制之前将它们移动到另一个工作表。

 function filtered() { var ss = SpreadsheetApp.openById('1u9z_8J-tvTZaW4adO6kCk7bkWeB0pwPcZQdjBazpExI'); var sheet = ss.getSheetByName('Sheet1'); var destsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('JockeyList'); var demosheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Betting data - Demo'); var jockey = demosheet.getRange('L14').getValues(); // Get full (non-filtered) data var values = sheet.getRange('A:EC').getValues(); // Apply filter criteria here //Logger.log(jockey); var hiddenValues = jockey; values = values.filter(function(v) { return hiddenValues.indexOf(v[51]) == 1; }); Logger.log(values.length); // Set filtered data on the target sheet destsheet.getRange(10, 5, values.length, 2).setValues(values); }

好的,所以您似乎只想复制“Sheet1”中 AZ 中的值,这些值等于“投注数据 - 演示”表的单元格 L14 中包含的任何字符串值。 如果是这种情况,那么这里是对您的原始代码的更改,它将实现这一目标:

function filtered() {
  var ss = SpreadsheetApp.openById('1u9z_8J-tvTZaW4adO6kCk7bkWeB0pwPcZQdjBazpExI');
  var sheet = ss.getSheetByName('Sheet1');
  // this assumes that your destsheet and demosheet are in the same spreadsheet. Keep in mind that opening spreadsheets with SpreadsheetApp is costly so you want to minimize your calls to new sheets.
  var destsheet = ss.getSheetByName('JockeyList');
  var demosheet = ss.getSheetByName('Betting data - Demo');
  var jockey = demosheet.getRange('L14').getValue();
  var searchTerm = new RegExp(jockey);
  // Get full (non-filtered) data
  var values = sheet.getRange('A:EC').getValues();
  
  // Apply filter criteria here and return ONLY THE VALUE IN COLUMN AZ
  var filteredValues = values.reduce(function(resultArray, row) {
    if (searchTerm.test(row[51])) resultArray.push([row[51]]);
    return resultArray;
  }, [])
  // Set filtered data on the target sheet
  // Note* not clear why you are starting at row 10, but as is this will overwrite all of the data in column 5 of destsheet starting from row 10 every time this function runs
  destsheet.getRange(10, 5, filteredValues.length, 1).setValues(filteredValues);
}

正如代码示例中所说,这只会复制并粘贴“sheet1”的 AZ 列中的值。 它不会以任何方式改变“sheet1”。 如果这真的是你想要做的,那么这个 function 工作,但它是矫枉过正。 由于您只是针对单个字符串值过滤 AZ 中的值,因此简单地计算该字符串在 AZ 列中出现的次数,然后将该字符串添加到目标工作表中的次数会更有效。

另请注意,您原来的 function 将值粘贴到 destsheet 到一个常量行(第 10 行)。 这意味着每次运行 function 时,第 10 行的数据将被您从“sheet1”复制的任何数据覆盖

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM