如何使用来自其他一维数组-Javascript / Google Apps脚本中的数据来过滤二维数组?

问题描述

我仍然对应用程序脚本和JavaScript还是很新手,但是我学到的越多,我的工作就越容易。

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

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

谢谢您的建议!

埃里克

解决方法

Ciao,假设您使用function getProductOrItem(list) { return list.reduce((accumulator,obj) => { if (obj.PRODUCT) { accumulator.push(obj.PRODUCT); } else if (obj.ITEM) { accumulator.push(obj.ITEM); } return accumulator; },[]) } 作为字符串的字符串,而shippingID是2D数组,使用javascript,您可以通过以下方式使用shipDetailsArr函数:

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",["20-05-01-SHEN-US","CE-12-SLOT-WOOD-WATCH-DARK"]]; let result = shipDetailsArr.filter(det => shippingID.includes(det[0])); console.log(result);过滤了shipDetailsArr。这样只会返回shippingID.includes(det[0])数组中存在shipDetailsArr的{​​{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,f_data[0].length).setValues(f_data);
}

说明:

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

电子表格输入和输出:

Example

,
function getDetailsForAnId(id='1') {//default used for testing
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('All Data');
  const vs=sh.getRange(2,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).getValues();
  ids.forEach(function(id){
    let rows=getDetailsForAnId(id);
    if(rows) {
      osh.getRange(osh.getLastRow()+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,14,6,19,24,22,4,17,7,15,3,16,5,9,8,20,2,12
2,23,12,13,18,13
3,10,11,10
1,21,9
2,24
3,21
1,11
2,11
3,18
1,5
2,17
3,9
1,7
2,20
3,6
1,6
3,11
1,9
3,19
1,21
2,8
1,22

过滤数据(csv):

HDR1
1
2
3

OutputSheet(csv):

1,22
2,8|

OutputSheet图片:

enter image description here

顺便说一句,您的问题问如何用1D数组过滤2D数组。您应该意识到它们都是二维数组。单列仍然是2D阵列。