问题描述
我仍然对应用程序脚本和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 Data
和All 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
存储回到工作表中。当然,这只是为了说明。随时根据您的需要调整此代码。
电子表格输入和输出:
,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图片:
顺便说一句,您的问题问如何用1D数组过滤2D数组。您应该意识到它们都是二维数组。单列仍然是2D阵列。