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

时间:2020-12-21 03:46:35

标签: javascript google-apps-script google-sheets

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

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

我一直在努力关注这个link

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

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

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

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);
  
}

1 个答案:

答案 0 :(得分:1)

好的,看来您只想复制“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”。如果这真的是你想要做的,那么这个功能就可以工作,但它太过分了。由于您只是根据单个字符串值过滤 AZ 中的值,因此简单地计算字符串在列 AZ 中出现的次数,然后将该字符串添加到目标工作表中的次数会更有效。

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