【问题标题】:Google Script GetRange with Filter based on values in a column AND select only certain columnsGoogle Script GetRange 与基于列中的值的过滤器并仅选择某些列
【发布时间】:2020-08-13 12:40:26
【问题描述】:

我有一个 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();

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    var cr_data = getCols(tdata,[5,6,7, 13, 15]);
    

    其中getCols()定义如下:

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

    最后您可以将cr_data 复制到这样的特定位置/表格:

    sheet.getRange(1,1,cr_data.length,cr_data[0].length).setValues(cr_data);
    

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

    Best method to extract selected columns from 2d array in apps script

    【讨论】:

    • 谢谢马里奥斯。它工作得很好。我最初希望 var 数据获得已经过滤的范围,以节省时间让另一个变量按列值过滤,但这会很好。
    • @Mike1-23 很高兴它有帮助!您能否通过单击我答案左侧的勾选按钮来接受我的答案?谢谢!
    • 一个后续问题。我想根据第二列条件添加另一个过滤器:row[5] == 'Closed' 如何将其添加到过滤器(函数)?
    • var tdata = data.filter(function (row) { return row[29] == agent && row[5] == 'Closed' ; });
    • 谢谢。我运行它并且 tdata 返回一个空数组。它运行时没有错误,但它不喜欢以下内容: var tdata = data.filter(function (row) { return row[29] == agent && row[5] == 'Closed' ; // 开始于0,A列为0。});
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2022-01-02
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多