通过匹配相似列上的元素连接两个多维数组 javascript es6
Join two multidimensional arrays by matching elements on similar columns javascript es6
我在 Google sheets 运行 chrome V8
工作
我有两个数组,由两个不同 sheets
上的范围数据组成
在现实生活中,我确实事先知道 arr1 或 arr2 的宽度或长度。我只知道它们的尺寸不一样
两个数组都有一个 Id
列。 arr1 始终将 Id
列作为第一列。事先不知道arr2
中Id
列的列位置
arr1 如果打印到 sheet 看起来像
Id |Label |SAH1 |SAH2 |SAH3
---------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19
aa2 |Eggbert|stuff2 |stuff11 |stuff20
aa3 |Juan |stuff3 |stuff12 |stuff21
aa4 |Alice |stuff4 |stuff13 |stuff22
aa5 |Fraya |stuff5 |stuff14 |stuff23
aa6 |Ted |stuff6 |stuff15 |stuff24
aa7 |Velma |stuff7 |stuff16 |stuff25
aa8 |Carol |stuff8 |stuff17 |stuff26
aa9 |LeRoy |stuff9 |stuff18 |stuff27
arr2 如果打印到 sheet 看起来像
Name |SXH1 |Id |SXH2
--------------------------------------------
Maya Townsend |thing1 |mm1 |thing20
David Collste |thing2 |mm2 |thing21
Bob |thing3 |aa1 |thing22
Jennifer Menke |thing4 |mm4 |thing23
Aissata Camara |thing5 |mm5 |thing24
Marta Arranz |thing6 |mm6 |thing25
Michael Lennon |thing7 |mm7 |thing26
Jonny Norton |thing8 |mm8 |thing27
Carol |thing9 |aa8 |thing28
Ted |thing10 |aa6 |thing29
Katie Boone |thing11 |mm11 |thing30
Adeline Sibanda |thing12 |mm12 |thing31
Brian Blankinship|thing13 |mm13 |thing32
Christine Lai |thing14 |mm14 |thing33
Jennifer Pierce |thing15 |mm15 |thing34
Federico Bellone |thing16 |mm16 |thing35
Jeffrey Su |thing17 |mm17 |thing36
Alice |thing18 |aa4 |thing37
Sarah Ditton |thing19 |mm19 |thing38
结果 arr 如果打印到 sheet 需要看起来像
Id |Label |SAH1 |SAH2 |SAH3 |Name |SXH1 |SXH2
------------------------------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19 |Bob |thing3 |thing22
aa2 |Eggbert|stuff2 |stuff11 |stuff20 |"" |"" |""
aa3 |Juan |stuff3 |stuff12 |stuff21 |"" |"" |""
aa4 |Alice |stuff4 |stuff13 |stuff22 |Alice|thing18|thing37
aa5 |Fraya |stuff5 |stuff14 |stuff23 |"" |"" |""
aa6 |Ted |stuff6 |stuff15 |stuff24 |Ted |thing10|thing29
aa7 |Velma |stuff7 |stuff16 |stuff25 |"" |"" |""
aa8 |Carol |stuff8 |stuff17 |stuff26 |Carol|thing9 |thing28
aa9 |LeRoy |stuff9 |stuff18 |stuff27 |"" |"" |""
我已经搜索了一种方法来执行此操作,但找不到任何我有能力改变的东西
这里有一个Googlesheet有测试数据
https://docs.google.com/spreadsheets/d/1y0CFUEdpZ77IgKGVYXUinepg7we2F0311U4D5fAP17Y/edit?usp=sharing
谢谢
合并匹配行
function combineMatchingRows() {
const ss=SpreadsheetApp.getActive();
const sh1=ss.getSheetByName('Sheet1');
const sh2=ss.getSheetByName('Sheet2');
const osh=ss.getSheetByName('Sheet3');//output sheet
const vA1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn()).getDisplayValues();
const hA1=sh1.getRange(1,1,1,sh1.getLastColumn()).getDisplayValues()[0];
var hObj1={};//columns in sheet1
hA1.forEach((h,i)=>{hObj1[h]=i+1;});
const vA2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn()).getDisplayValues();
const hA2=sh2.getRange(1,1,1,sh2.getLastColumn()).getDisplayValues()[0];
var hObj2={};//columns in sheet2
hA2.forEach((h,i)=>{hObj2[h]=i+1;});
const id2A=sh2.getRange(2,hObj2['Id'],sh2.getLastRow()-1,1).getValues().flat();//array of ids in sheet2
var vO=[];
vA1.forEach((r,i)=>{
let idx=id2A.indexOf(r[hObj1['Id']-1]);
if(idx!=-1) {
vA2[idx].splice(hObj2['Id']-1,1);//remove second Id column
var row=r.concat(vA2[idx]);
vO.push(row);
}
});
osh.clearContents();
osh.getRange(1,1,vO.length,vO[0].length).setValues(vO);
}
工作表 1:
Id,Label,SAH1,SAH2,SAH3
aa1,Bob,stuff1,stuff10,stuff19
aa2,Eggbert,stuff2,stuff11,stuff20
aa3,Juan,stuff3,stuff12,stuff21
aa4,Alice,stuff4,stuff13,stuff22
aa5,Fraya,stuff5,stuff14,stuff23
aa6,Ted,stuff6,stuff15,stuff24
aa7,Velma,stuff7,stuff16,stuff25
aa8,Carol,stuff8,stuff17,stuff26
aa9,LeRoy,stuff9,stuff18,stuff27
工作表 2:
Name,SXH1,Id,SXH2
Maya Townsend,thing1,mm1,thing20
David Collste,thing2,mm2,thing21
Bob,thing3,aa1,thing22
Jennifer Menke,thing4,mm4,thing23
Aissata Camara,thing5,mm5,thing24
Marta Arranz,thing6,mm6,thing25
Michael Lennon,thing7,mm7,thing26
Jonny Norton,thing8,mm8,thing27
Carol,thing9,aa8,thing28
Ted,thing10,aa6,thing29
Katie Boone,thing11,mm11,thing30
Adeline Sibanda,thing12,mm12,thing31
Brian Blankinship,thing13,mm13,thing32
Christine Lai,thing14,mm14,thing33
Jennifer Pierce,thing15,mm15,thing34
Federico Bellone,thing16,mm16,thing35
Jeffrey Su,thing17,mm17,thing36
Alice,thing18,aa4,thing37
Sarah Ditton,thing19,mm19,thing38
Sheet3(输出):
aa1,Bob,stuff1,stuff10,stuff19,Bob,thing3,thing22
aa4,Alice,stuff4,stuff13,stuff22,Alice,thing18,thing37
aa6,Ted,stuff6,stuff15,stuff24,Ted,thing10,thing29
aa8,Carol,stuff8,stuff17,stuff26,Carol,thing9,thing28
我相信你的目标和情况如下。
- 您想使用 Google Apps 脚本在您的问题中实现
result arr
从 arr1
和 arr2
的转换。
- 您不知道
arr2
sheet 中 Id
的列。
为了达到你的目的,我提出以下流程。
- 从 2 个来源检索值 sheets。
- 使用“Id”的值从“arr2”的值创建一个对象sheet。
- 使用“arr1”和“arr2”sheets.
的值创建一个数组用于放入结果 sheet
- 将值放入结果 sheet 到“结果”sheet。
当上面的流程反映到脚本中,就变成了下面的样子。
示例脚本:
请设置每个 sheet 名称。
function myFunction() {
const arr1SheetName = "arr1";
const arr2SheetName = "arr2";
const resultSheetName = "Result";
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 1. Retrieve values from 2 source sheets.
const [[header1, ...values1], [header2, ...values2]] = [arr1SheetName, arr2SheetName].map(s => ss.getSheetByName(s).getDataRange().getValues());
// 2. Create an object from the values of "arr2" sheet using the values of "Id".
const indexId = header2.indexOf("Id");
const obj = values2.reduce((o, r) => {
const id = r[indexId];
r.splice(indexId, 1);
return Object.assign(o, {[id]: r});
}, {});
// 3. Create an array for putting to the result sheet using the values of "arr1" and "arr2" sheets.
const array = values1.map(r => obj[r[0]] ? r.concat(obj[r[0]]) : r.concat(Array(3).fill("")));
header2.splice(indexId, 1);
array.unshift([...header1, ...header2]);
// 4. Put values to the result sheet to "Result" sheet.
const sheet = ss.getSheetByName(resultSheetName);
sheet.clearContents();
sheet.getRange(1, 1, array.length, array[0].length).setValues(array);
}
- 在这种情况下,根据您共享的 Spreadsheet,sheet 名称为
arr1
、arr2
和 Result
。请注意这一点。
- 并且,在这个脚本中,即使
arr2
sheet 中的 Id
列被移动,脚本仍然有效。
结果:
使用该脚本时,得到如下结果。
从
arr1
sheet
arr2
sheet
到:
Result
sheet
参考文献:
我在 Google sheets 运行 chrome V8
我有两个数组,由两个不同 sheets
上的范围数据组成在现实生活中,我确实事先知道 arr1 或 arr2 的宽度或长度。我只知道它们的尺寸不一样
两个数组都有一个 Id
列。 arr1 始终将 Id
列作为第一列。事先不知道arr2
Id
列的列位置
arr1 如果打印到 sheet 看起来像
Id |Label |SAH1 |SAH2 |SAH3
---------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19
aa2 |Eggbert|stuff2 |stuff11 |stuff20
aa3 |Juan |stuff3 |stuff12 |stuff21
aa4 |Alice |stuff4 |stuff13 |stuff22
aa5 |Fraya |stuff5 |stuff14 |stuff23
aa6 |Ted |stuff6 |stuff15 |stuff24
aa7 |Velma |stuff7 |stuff16 |stuff25
aa8 |Carol |stuff8 |stuff17 |stuff26
aa9 |LeRoy |stuff9 |stuff18 |stuff27
arr2 如果打印到 sheet 看起来像
Name |SXH1 |Id |SXH2
--------------------------------------------
Maya Townsend |thing1 |mm1 |thing20
David Collste |thing2 |mm2 |thing21
Bob |thing3 |aa1 |thing22
Jennifer Menke |thing4 |mm4 |thing23
Aissata Camara |thing5 |mm5 |thing24
Marta Arranz |thing6 |mm6 |thing25
Michael Lennon |thing7 |mm7 |thing26
Jonny Norton |thing8 |mm8 |thing27
Carol |thing9 |aa8 |thing28
Ted |thing10 |aa6 |thing29
Katie Boone |thing11 |mm11 |thing30
Adeline Sibanda |thing12 |mm12 |thing31
Brian Blankinship|thing13 |mm13 |thing32
Christine Lai |thing14 |mm14 |thing33
Jennifer Pierce |thing15 |mm15 |thing34
Federico Bellone |thing16 |mm16 |thing35
Jeffrey Su |thing17 |mm17 |thing36
Alice |thing18 |aa4 |thing37
Sarah Ditton |thing19 |mm19 |thing38
结果 arr 如果打印到 sheet 需要看起来像
Id |Label |SAH1 |SAH2 |SAH3 |Name |SXH1 |SXH2
------------------------------------------------------------
aa1 |Bob |stuff1 |stuff10 |stuff19 |Bob |thing3 |thing22
aa2 |Eggbert|stuff2 |stuff11 |stuff20 |"" |"" |""
aa3 |Juan |stuff3 |stuff12 |stuff21 |"" |"" |""
aa4 |Alice |stuff4 |stuff13 |stuff22 |Alice|thing18|thing37
aa5 |Fraya |stuff5 |stuff14 |stuff23 |"" |"" |""
aa6 |Ted |stuff6 |stuff15 |stuff24 |Ted |thing10|thing29
aa7 |Velma |stuff7 |stuff16 |stuff25 |"" |"" |""
aa8 |Carol |stuff8 |stuff17 |stuff26 |Carol|thing9 |thing28
aa9 |LeRoy |stuff9 |stuff18 |stuff27 |"" |"" |""
我已经搜索了一种方法来执行此操作,但找不到任何我有能力改变的东西
这里有一个Googlesheet有测试数据 https://docs.google.com/spreadsheets/d/1y0CFUEdpZ77IgKGVYXUinepg7we2F0311U4D5fAP17Y/edit?usp=sharing
谢谢
合并匹配行
function combineMatchingRows() {
const ss=SpreadsheetApp.getActive();
const sh1=ss.getSheetByName('Sheet1');
const sh2=ss.getSheetByName('Sheet2');
const osh=ss.getSheetByName('Sheet3');//output sheet
const vA1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn()).getDisplayValues();
const hA1=sh1.getRange(1,1,1,sh1.getLastColumn()).getDisplayValues()[0];
var hObj1={};//columns in sheet1
hA1.forEach((h,i)=>{hObj1[h]=i+1;});
const vA2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn()).getDisplayValues();
const hA2=sh2.getRange(1,1,1,sh2.getLastColumn()).getDisplayValues()[0];
var hObj2={};//columns in sheet2
hA2.forEach((h,i)=>{hObj2[h]=i+1;});
const id2A=sh2.getRange(2,hObj2['Id'],sh2.getLastRow()-1,1).getValues().flat();//array of ids in sheet2
var vO=[];
vA1.forEach((r,i)=>{
let idx=id2A.indexOf(r[hObj1['Id']-1]);
if(idx!=-1) {
vA2[idx].splice(hObj2['Id']-1,1);//remove second Id column
var row=r.concat(vA2[idx]);
vO.push(row);
}
});
osh.clearContents();
osh.getRange(1,1,vO.length,vO[0].length).setValues(vO);
}
工作表 1:
Id,Label,SAH1,SAH2,SAH3
aa1,Bob,stuff1,stuff10,stuff19
aa2,Eggbert,stuff2,stuff11,stuff20
aa3,Juan,stuff3,stuff12,stuff21
aa4,Alice,stuff4,stuff13,stuff22
aa5,Fraya,stuff5,stuff14,stuff23
aa6,Ted,stuff6,stuff15,stuff24
aa7,Velma,stuff7,stuff16,stuff25
aa8,Carol,stuff8,stuff17,stuff26
aa9,LeRoy,stuff9,stuff18,stuff27
工作表 2:
Name,SXH1,Id,SXH2
Maya Townsend,thing1,mm1,thing20
David Collste,thing2,mm2,thing21
Bob,thing3,aa1,thing22
Jennifer Menke,thing4,mm4,thing23
Aissata Camara,thing5,mm5,thing24
Marta Arranz,thing6,mm6,thing25
Michael Lennon,thing7,mm7,thing26
Jonny Norton,thing8,mm8,thing27
Carol,thing9,aa8,thing28
Ted,thing10,aa6,thing29
Katie Boone,thing11,mm11,thing30
Adeline Sibanda,thing12,mm12,thing31
Brian Blankinship,thing13,mm13,thing32
Christine Lai,thing14,mm14,thing33
Jennifer Pierce,thing15,mm15,thing34
Federico Bellone,thing16,mm16,thing35
Jeffrey Su,thing17,mm17,thing36
Alice,thing18,aa4,thing37
Sarah Ditton,thing19,mm19,thing38
Sheet3(输出):
aa1,Bob,stuff1,stuff10,stuff19,Bob,thing3,thing22
aa4,Alice,stuff4,stuff13,stuff22,Alice,thing18,thing37
aa6,Ted,stuff6,stuff15,stuff24,Ted,thing10,thing29
aa8,Carol,stuff8,stuff17,stuff26,Carol,thing9,thing28
我相信你的目标和情况如下。
- 您想使用 Google Apps 脚本在您的问题中实现
result arr
从arr1
和arr2
的转换。 - 您不知道
arr2
sheet 中Id
的列。
为了达到你的目的,我提出以下流程。
- 从 2 个来源检索值 sheets。
- 使用“Id”的值从“arr2”的值创建一个对象sheet。
- 使用“arr1”和“arr2”sheets. 的值创建一个数组用于放入结果 sheet
- 将值放入结果 sheet 到“结果”sheet。
当上面的流程反映到脚本中,就变成了下面的样子。
示例脚本:
请设置每个 sheet 名称。
function myFunction() {
const arr1SheetName = "arr1";
const arr2SheetName = "arr2";
const resultSheetName = "Result";
const ss = SpreadsheetApp.getActiveSpreadsheet();
// 1. Retrieve values from 2 source sheets.
const [[header1, ...values1], [header2, ...values2]] = [arr1SheetName, arr2SheetName].map(s => ss.getSheetByName(s).getDataRange().getValues());
// 2. Create an object from the values of "arr2" sheet using the values of "Id".
const indexId = header2.indexOf("Id");
const obj = values2.reduce((o, r) => {
const id = r[indexId];
r.splice(indexId, 1);
return Object.assign(o, {[id]: r});
}, {});
// 3. Create an array for putting to the result sheet using the values of "arr1" and "arr2" sheets.
const array = values1.map(r => obj[r[0]] ? r.concat(obj[r[0]]) : r.concat(Array(3).fill("")));
header2.splice(indexId, 1);
array.unshift([...header1, ...header2]);
// 4. Put values to the result sheet to "Result" sheet.
const sheet = ss.getSheetByName(resultSheetName);
sheet.clearContents();
sheet.getRange(1, 1, array.length, array[0].length).setValues(array);
}
- 在这种情况下,根据您共享的 Spreadsheet,sheet 名称为
arr1
、arr2
和Result
。请注意这一点。 - 并且,在这个脚本中,即使
arr2
sheet 中的Id
列被移动,脚本仍然有效。
结果:
使用该脚本时,得到如下结果。
从arr1
sheetarr2
sheet
Result
sheet