Google Sheets脚本优化:两列ID匹配排序问题求助
重复执行的ID匹配与整理任务
任务需求
每周需重复执行以下操作:对比同一工作表中Column A与Column E的ID集合(双向匹配)。若某列中的ID在另一列存在匹配项,需将该ID移至匹配项所在行;无匹配项的位置留空。最终需将所有匹配项集中在下方,无匹配项移至上方以便核查。
示例数据(「sample」工作表)
| Column A | Column 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 |
期望运行结果
| Column A | Column 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%完成匹配。按照@TheMaster的建议修改vs部分后,结果仍存在问题:红色标记为未匹配项,橙色和蓝色标记为匹配项却被移至上方,导致重复值。
当前使用的脚本
function sortof() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName("sample"); const vs = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues(); 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)); }
内容的提问来源于stack exchange,提问作者KamenRider1989
相关产品推荐
相关产品推荐

