【问题标题】:How to filter a two dimensional array using data from a different one dimensional array - Javascript/Google Apps Script?如何使用来自不同一维数组的数据过滤二维数组 - Javascript/Google Apps 脚本?
【发布时间】:2020-12-04 03:02:00
【问题描述】:

我在应用脚本和 javascript 方面还是个新手,但我学得越多,我的工作就越轻松。

我有一个一维数组 (var shippingID) 和一个二维数组 (var shipDetailsArr)。 ShippingID 充当shipDetailsArr 第一列的过滤器。我想返回所有列 shipDetailsArr,其中第一列仅等于 ShippingID 中的任何单元格。如何在应用脚本中的脚本编辑器上执行此操作?

这是两个数组的示例。第一个数组是带有几个shipments 的Shipment ID。第二个是更大的一组data,其第一列是Shipment ID。我想创建一个新数组,该数组返回第二组数据,其中仅包含第一组中的运输 ID。希望这是有道理的,感谢您的帮助

感谢您的任何建议!

埃里克

【问题讨论】:

  • Ciao Eric,您能否提供一个数组示例以及您想要实现的目标?会非常感激。
  • Ciao Giovanni,这里是两个数组的一个例子 第一个数组是一个 Shipment ID,有几个发货 ibb.co/9vs385R 第二个是一个更大的数据集,第一列是 Shipment ID @987654324 @ 我想创建一个新数组,该数组仅返回第二组数据,其中仅包含第一组中的运输 ID。希望这是有道理的,并感谢您的帮助。埃里克
  • @GiovanniEsposito 不要认为您的答案无效。对于 OP 的要求来说,这已经绰绰有余了
  • @EricJohnson 提供您当前的代码

标签: javascript arrays google-apps-script filtering


【解决方案1】:

解决方案:

使用以下代码:

function filter2D() {
  
  const ss = SpreadsheetApp.getActive();
  
  const dsh = ss.getSheetByName('All Data');
  const data = dsh.getRange('A1:G20').getValues();
  const fsh = ss.getSheetByName('Filter Data');
  const filterList = fsh.getRange('A2:A13').getValues().flat([1]);
  const osh = ss.getSheetByName('Output Data');
  
  const f_data = data.filter(function (row) {
    return filterList.includes(row[0]);
  }); 
  osh.getRange(1,1,f_data.length,f_data[0].length).setValues(f_data);
}

请注意,您可以根据需要修改Filter DataAll Data 的范围。我还使用名为 Output Data 的第三张表来存储过滤后的数据。


其他示例:

这是一个示例,说明如何根据一维数组的值过滤二维数组:

function filter2D() {
  
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const data = sh.getRange('A1:D18').getValues();
  const filterList = sh.getRange('F1:F2').getValues().flat([1]);
  
  const f_data = data.filter(function (row) {
    return filterList.includes(row[0]);
  }); 
  sh.getRange(24,1,f_data.length,f_data[0].length).setValues(f_data);
}

解释:

您将使用filter() 函数在二维数组data 中查找满足特定条件的行。也就是说,第一列 (row[0]) 应该包含来自 filterList 的值。为了检查是否发生这种情况,您可以使用includes()。然后,我将过滤后的数据f_data 存储回工作表。当然,这只是为了说明。随意调整此代码以满足您的需要。

电子表格输入和输出:

【讨论】:

    【解决方案2】:
    function getDetailsForAnId(id='1') {//default used for testing
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getSheetByName('All Data');
      const vs=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn()).getValues();
      var oA=[];
      oA.push([id].concat(new Array(sh.getLastColumn()-1)));//display id only on first line of each section
      vs.forEach(function(r){
        if(r[0]==id) {
          let t=r.slice();
          t[0]='';//remove unnecessary id in output only for clarity
          oA.push(t);
        }
      });
      if(oA) {
        //console.log(oA);
        return oA;
      };
    }
    
    function loopThruIdsAndDisplayOnOutputSheet() {
      const ss=SpreadsheetApp.getActive();
      const osh=ss.getSheetByName('OutputSheet');
      osh.clearContents();//clear output sheet when starting
      const sh=ss.getSheetByName('Filter Data');
      const ids=sh.getRange(2,1,sh.getLastRow()-1,1).getValues();
      ids.forEach(function(id){
        let rows=getDetailsForAnId(id);
        if(rows) {
          osh.getRange(osh.getLastRow()+1,1,rows.length,rows[0].length).setValues(rows);
        }
      });
    }
    

    所有数据(csv):

    COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10,COL11,COL12,COL13,COL14,COL15,COL16,COL17,COL18,COL19,COL20,COL21,COL22,COL23,COL24,COL25,COL26
    1,0,14,6,0,19,6,24,22,6,4,17,7,15,4,3,16,5,9,8,20,2,9,15,24,12
    2,22,15,3,19,22,23,12,9,14,15,7,0,13,8,20,12,20,4,19,18,9,3,3,2,13
    3,23,8,20,9,13,19,10,18,24,23,0,17,16,9,9,12,1,24,1,23,6,11,13,3,10
    1,11,6,17,0,17,12,12,4,5,6,10,24,22,21,17,11,17,20,18,1,20,7,18,21,9
    2,17,12,5,8,24,10,14,13,15,23,21,20,17,9,20,3,16,11,21,23,1,6,23,18,24
    3,22,8,24,2,12,22,6,1,5,1,6,2,20,22,1,7,24,23,6,15,19,15,16,19,21
    1,3,21,18,24,9,19,3,23,3,10,23,7,14,16,10,7,0,9,14,20,20,15,16,11,11
    2,15,13,23,2,11,14,2,6,24,3,16,18,10,10,8,4,1,4,11,7,10,18,17,7,11
    3,22,17,19,8,2,13,3,3,21,19,19,3,14,2,11,5,8,22,6,5,1,13,3,4,18
    1,13,13,8,22,6,18,14,8,10,1,24,23,12,21,8,19,11,0,4,23,3,22,20,5,5
    2,16,16,18,13,9,15,18,12,23,20,17,13,17,8,1,5,5,11,23,12,12,11,21,21,17
    3,2,4,17,10,5,18,4,11,7,4,15,1,0,2,11,15,13,20,10,14,22,12,16,12,9
    1,12,0,21,2,17,5,1,17,1,12,9,5,9,8,5,18,20,19,14,22,23,11,6,23,7
    2,16,2,16,1,9,15,4,20,22,2,19,9,14,10,2,8,6,12,6,15,7,17,21,20,20
    3,22,9,16,9,22,10,1,18,16,19,21,13,16,16,18,20,15,5,2,9,16,21,14,7,6
    1,20,19,23,18,13,10,13,16,9,23,11,15,20,0,8,18,1,19,2,1,7,7,16,16,11
    2,3,12,7,5,6,5,24,19,12,5,20,5,11,10,13,8,1,22,12,16,16,10,8,1,6
    3,6,18,18,23,13,22,8,22,4,8,24,2,2,20,13,12,21,12,19,0,1,21,0,24,11
    1,15,23,9,1,15,14,5,2,7,0,8,5,6,15,15,10,20,17,9,17,23,17,10,10,11
    2,18,22,17,8,9,23,24,0,23,10,10,9,18,10,10,24,16,22,11,11,3,14,9,3,9
    3,15,15,17,20,13,12,5,4,21,2,10,10,16,13,19,12,7,2,6,14,13,8,10,16,19
    1,12,2,8,11,1,8,24,4,11,19,4,20,20,1,10,22,17,15,7,15,18,24,14,1,21
    2,9,9,23,9,11,9,12,15,13,17,14,15,16,13,3,3,15,15,6,2,2,1,18,13,24
    3,24,4,23,8,15,1,10,8,7,13,4,19,15,13,23,23,4,20,3,5,11,5,10,7,8
    1,3,20,12,4,19,0,20,12,18,1,1,1,10,8,21,18,6,20,15,0,2,4,23,5,22
    

    过滤数据(csv):

    HDR1
    1
    2
    3
    

    输出表(csv):

    1,,,,,,,,,,,,,,,,,,,,,,,,,
    ,0,14,6,0,19,6,24,22,6,4,17,7,15,4,3,16,5,9,8,20,2,9,15,24,12
    ,11,6,17,0,17,12,12,4,5,6,10,24,22,21,17,11,17,20,18,1,20,7,18,21,9
    ,3,21,18,24,9,19,3,23,3,10,23,7,14,16,10,7,0,9,14,20,20,15,16,11,11
    ,13,13,8,22,6,18,14,8,10,1,24,23,12,21,8,19,11,0,4,23,3,22,20,5,5
    ,12,0,21,2,17,5,1,17,1,12,9,5,9,8,5,18,20,19,14,22,23,11,6,23,7
    ,20,19,23,18,13,10,13,16,9,23,11,15,20,0,8,18,1,19,2,1,7,7,16,16,11
    ,15,23,9,1,15,14,5,2,7,0,8,5,6,15,15,10,20,17,9,17,23,17,10,10,11
    ,12,2,8,11,1,8,24,4,11,19,4,20,20,1,10,22,17,15,7,15,18,24,14,1,21
    ,3,20,12,4,19,0,20,12,18,1,1,1,10,8,21,18,6,20,15,0,2,4,23,5,22
    2,,,,,,,,,,,,,,,,,,,,,,,,,
    ,22,15,3,19,22,23,12,9,14,15,7,0,13,8,20,12,20,4,19,18,9,3,3,2,13
    ,17,12,5,8,24,10,14,13,15,23,21,20,17,9,20,3,16,11,21,23,1,6,23,18,24
    ,15,13,23,2,11,14,2,6,24,3,16,18,10,10,8,4,1,4,11,7,10,18,17,7,11
    ,16,16,18,13,9,15,18,12,23,20,17,13,17,8,1,5,5,11,23,12,12,11,21,21,17
    ,16,2,16,1,9,15,4,20,22,2,19,9,14,10,2,8,6,12,6,15,7,17,21,20,20
    ,3,12,7,5,6,5,24,19,12,5,20,5,11,10,13,8,1,22,12,16,16,10,8,1,6
    ,18,22,17,8,9,23,24,0,23,10,10,9,18,10,10,24,16,22,11,11,3,14,9,3,9
    ,9,9,23,9,11,9,12,15,13,17,14,15,16,13,3,3,15,15,6,2,2,1,18,13,24
    3,,,,,,,,,,,,,,,,,,,,,,,,,
    ,23,8,20,9,13,19,10,18,24,23,0,17,16,9,9,12,1,24,1,23,6,11,13,3,10
    ,22,8,24,2,12,22,6,1,5,1,6,2,20,22,1,7,24,23,6,15,19,15,16,19,21
    ,22,17,19,8,2,13,3,3,21,19,19,3,14,2,11,5,8,22,6,5,1,13,3,4,18
    ,2,4,17,10,5,18,4,11,7,4,15,1,0,2,11,15,13,20,10,14,22,12,16,12,9
    ,22,9,16,9,22,10,1,18,16,19,21,13,16,16,18,20,15,5,2,9,16,21,14,7,6
    ,6,18,18,23,13,22,8,22,4,8,24,2,2,20,13,12,21,12,19,0,1,21,0,24,11
    ,15,15,17,20,13,12,5,4,21,2,10,10,16,13,19,12,7,2,6,14,13,8,10,16,19
    ,24,4,23,8,15,1,10,8,7,13,4,19,15,13,23,23,4,20,3,5,11,5,10,7,8|
    

    输出表图像:

    顺便说一句,您的问题是如何用一维数组过滤二维数组。您应该知道它们都是二维数组。单列仍然是二维数组。

    【讨论】:

      【解决方案3】:

      Ciao,假设你有shippingID 作为一个字符串数组,shipDetailsArr 是一个二维数组,用javascript你可以这样使用filter 函数:

      let shippingID = ["20-05-01-SHEN-EU", "20-05-01-SHEN-CAN"];
              let shipDetailsArr = [["20-05-01-SHEN-EU", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"],
              ["20-05-01-SHEN-CAN", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"], 
              ["20-05-01-SHEN-US", "PJ0201", "CE-12-SLOT-WOOD-WATCH-DARK"]];
      
              let result = shipDetailsArr.filter(det => shippingID.includes(det[0]));
      
              console.log(result);

      从结果中可以看出,我使用shippingID.includes(det[0]) 过滤了shipDetailsArr。这仅返回 shipDetailsArrshipmentID 存在于 shippingID 数组中。

      【讨论】:

      • 虽然这可能是一个 javascript 解决方案,但我认为它不是一个有效的解决方案。该操作指定他具有来自特定电子表格文件的过滤器列表。也就是说,他想从那里检索此列表并使用电子表格文件。
      • 如果您查看问题标签,我找不到“电子表格”。但我可以看到“javascript”...
      • shipDetailsArr 是帖子中所写的二维数组。片段和 JavaScript 解决方案都可以。但 op 没有提到 json 对象数组。它只是一个二维数组。 [[rowdata],[rowdata]]...喜欢[[a1,b1,c1],[a2,b2,c2]]
      • @TheMaster 现在应该是正确的 :) 没问题,你的观察是正确的
      • 仍然认为 op 不会接受你的。由于工作表中的所有数组都是二维的:我有一个一维数组 (var shippingID) 可能是错误的,除非他在第一个数组上使用了 flat()。答案对所述问题有效。避免回答无代码问题会更好。
      猜你喜欢
      • 2021-10-29
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多