通过匹配相似列上的元素连接两个多维数组 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 arrarr1arr2 的转换。
  • 您不知道 arr2 sheet 中 Id 的列。

为了达到你的目的,我提出以下流程。

  1. 从 2 个来源检索值 sheets。
  2. 使用“Id”的值从“arr2”的值创建一个对象sheet。
  3. 使用“arr1”和“arr2”sheets.
  4. 的值创建一个数组用于放入结果 sheet
  5. 将值放入结果 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 名称为 arr1arr2Result。请注意这一点。
  • 并且,在这个脚本中,即使 arr2 sheet 中的 Id 列被移动,脚本仍然有效。

结果:

使用该脚本时,得到如下结果。

  • arr1 sheet

  • arr2 sheet

到:
  • Result sheet

参考文献: