对同一张纸上两个不同列上的值进行匹配/排序

问题描述 投票:0回答:1

我正在尝试解决每周都会重复执行的任务。我所做的是将一列(A 列)与另一列(E 列)中的 ID 集进行比较,反之亦然。 如果在第二列中找到第一列中的值,则该值将移动到值匹配的位置。如果两列中都没有匹配的数据,则该列将为空白。 所有匹配的值都会下移,所有不匹配的值都会上移进行检查。

这是下面的示例数据,可在“示例”选项卡中找到:

A 栏 B 栏
399381935 375634552
407932943 399381935
409046041 407932943
448734453 409046041
452821913 431446526
459673358 448734453
463178020 448879624
485888087 452821913
498826033 458359366
498826520 459673358
503189964 463178020
509536058 485888087
509542349 497540933
510595029 498826033
510595505 498826520
510601532 502416642
511701201 502433066
512763252 503189964
515003633 506534952
515008102 509536058
520097636 509542349
510307762
510312887
510320772
510595029
510601532
511701201
512763252
515003633

希望运行脚本后,完成的数据应该具有如下所示的结果,其中所有匹配的数据都分组在下面,这些唯一值被推到上面,这样更容易检查:

A 栏 B 栏
375634552
431446526
448879624
458359366
497540933
502416642
502433066
506534952
510307762
510312887
510320772
510595505
515008102
520097636
399381935 399381935
407932943 407932943
409046041 409046041
448734453 448734453
452821913 452821913
459673358 459673358
463178020 463178020
485888087 485888087
498826033 498826033
498826520 498826520
503189964 503189964
509536058 509536058
509542349 509542349
510595029 510595029
510601532 510601532
511701201 511701201
512763252 512763252
515003633 515003633

下面是我使用的脚本,是@Cooper 建议的。如果只有少量数据,该脚本可以正常工作,但如果要比较大量数据,则脚本无法 100% 执行。

function sortof() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName("sample");
  const vs = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getDisplayValues();
  vs.sort((a, b) => {
    if (a[0] > b[0]) return 1;
    if (b[0] > a[0]) return -1;
    if (a[0] == b[0]) return 0;
  })
  sh.getRange(2, 1, vs.length, vs[0].length).setValues(vs)
  let ob = vs.reduce((a, r, i, A) => {
    let idx = a["col1"].indexOf(r[4]);
    if (~idx) {
      let t = A[idx][4]
      a["col5"][idx] = [r[4]];
      a["col5"][i] = [t];
    } else {
      if (!a["col5"][i]) {
        a["col5"][i] = [r[4]];
      }
    }
    return a;
  }, { col1: vs.map(r => r[0]), col5: [] })
  sh.getRange(2, 5, ob["col5"].length).setValues(ob["col5"]);
  Logger.log(JSON.stringify(ob));
}

感谢这里的所有帮助。

google-apps-script google-sheets matching
1个回答
0
投票

用公式来完成这个并不难,所以我建议走这条路:

=ARRAYFORMULA(
   LET(a,A2:A,
       b,B2:B,
       matching,TOCOL(VLOOKUP(a,b,1,0),3),
       unique1,FILTER(a,a<>"",0=COUNTIF(matching,a)),
       unique2,FILTER(b,b<>"",0=COUNTIF(matching,b)),
       s_unique,SORT({unique1;unique2}),
       IFNA(VSTACK(
              {VLOOKUP(s_unique,unique1,1,0),VLOOKUP(s_unique,unique2,1,0)},
              {matching,matching}))))  

© www.soinside.com 2019 - 2024. All rights reserved.