簡體   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