带有基于列中值的过滤器的 Google Script GetRange 并仅选择某些列

Mik*_* B. 2 javascript google-sheets google-apps-script

我有一个 35 列和 300 行的数据集。我想获取仅包含第 30 列(名称)中某些值的行的范围。过滤数据的名称基于活动报告表中的报告文件单元格 B6。到目前为止,我试过这个:

var report = SpreadsheetApp.getActiveSpreadsheet();
var tsheet = report.getSheetByName("Transactions");
var areport = SpreadsheetApp.getActiveSheet();
var agent = areport.getRange('B6').getValues();

var criteria = SpreadsheetApp.newFilterCriteria().whenTextEqualTo(agent).build();
var trange = tsheet.getRange().createFilter().setColumnFilterCriteria(30, criteria); // ERROR
var tdata = trange.getValues();
Run Code Online (Sandbox Code Playgroud)

我收到错误异常:参数 () 与 SpreadsheetApp.Sheet.getRange 的方法签名不匹配。

第二部分,我只想得到几列,5,6,7,13,15。我不能用电子表格应用程序创建另一个过滤器,所以是制作数组并从中过滤出所需数据的唯一方法那里?我只是想提前考虑并减少计算量。

soM*_*rio 6

尝试使用filter()

var report = SpreadsheetApp.getActiveSpreadsheet();
var tsheet = report.getSheetByName("Transactions");
var areport = SpreadsheetApp.getActiveSheet();
var agent = areport.getRange('B6').getValue();

var data = tsheet.getRange('A1:AI300').getValues();
var tdata = data.filter(function (row) {
    return row[29] == agent && row[5] == 'Closed' ; // starts from 0, column A is 0.
  }); 
Run Code Online (Sandbox Code Playgroud)

要从中选择特定列,tdata请执行以下操作:

var cr_data = getCols(tdata,[5,6,7, 13, 15]);
Run Code Online (Sandbox Code Playgroud)

其中getCols()定义如下:

function getCols(arr,cols) {
  return arr.map(row =>
    row.filter((_,i) => cols.includes(++i)))
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以cr_data像这样复制到特定的地方/工作表:

sheet.getRange(1,1,cr_data.length,cr_data[0].length).setValues(cr_data);
Run Code Online (Sandbox Code Playgroud)

关于您问题的第二部分,我想将您重定向到这篇文章:

从应用程序脚本中的二维数组中提取选定列的最佳方法