我正在尝试解决每周都会重复执行的任务。我所做的是将一列(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));
}
感谢这里的所有帮助。
用公式来完成这个并不难,所以我建议走这条路:
=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}))))