xyz333
xyz333

Reputation: 768

Generalize Google Sheets script that merges duplicate rows in array to work on more then singe column

I need to merge duplicate rows in an array and concatenate cells in multiple columns.

Script to do this on a single column gotten here: google script sheet, merging rows duplicate in array

Id From To Transaction Flow Running Balance Description Date Type
conn-1 Alan Alícia Giving1 1 60 Stuff1 20/10/2022 Person
conn-2 Alan Ashish Giving2 2 62 Stuff2 26/10/2022 Person
conn-3 Alan Ashish Giving3 3 59 Stuff3 26/11/2022 Person
conn-4 Alan Deborah Giving4 15 48 Stuff4 26/10/2022 Person
conn-5 Christine Deborah Giving5 1 47 Stuff5 26/10/2022 Person
conn-6 Christine Deborah Giving6 4 61 Stuff6 26/10/2022 Person
conn-7 Christine Deborah Giving7 4 61 Stuff7 26/10/2023 Person
conn-7 Christine Gitanjali Giving8 1 54 Stuff8 26/10/2022 Person
conn-8 Christine Jacklina Giving9 7 43 Stuff9 26/10/2022 Person

If run merrgRows on the Transaction column, I get

Id From To Transaction Flow Running Balance Description Date Type
conn-1 Alan Alícia Giving1 1 60 Stuff1 20/10/2022 Person
conn-2 Alan Ashish Giving2|Giving3 2 62 Stuff2 26/10/2022 Person
conn-4 Alan Deborah Giving4 15 48 Stuff4 26/10/2022 Person
conn-5 Christine Deborah Giving5|Giving6|Giving7 1 47 Stuff5 26/10/2022 Person
conn-7 Christine Gitanjali Giving8 1 54 Stuff8 26/10/2022 Person
conn-8 Christine Jacklina Giving9 7 43 Stuff9 26/10/2022 Person

Which is what I want.

But I need to concatenate multiple columns, not just on Transaction.

Original script

function mergeRow (rows) {
    let newRows = []
    let matched = []
    
    for (var i = 0; i < rows.length; i++) {
        
        if (!matched.includes(i)) {
            let a = rows[i]
            let nextIndex = i+1
            let matches = []
            
            for (var x = nextIndex; x < rows.length; x++) {
                if (a[1] === rows[x][1] && a[2] === rows[x][2]) {
                    matches.push(x);
                }
            }
            
            let newRow = a,
                n = 3,
                lastItem = a[n];
            
            matches.forEach(index => {
                lastItem += ':' + rows[index][n]
                matched.push(index)
            })
            
            newRow[n] = lastItem
            newRows.push(newRow)
        }
    }
    return newRows 
}

My attempt to generalize mergeRow

function mergeRow2 (rows) {
    let newRows = []
    let matched = []
    
    for (var i = 0; i < rows.length; i++) {
        
        if (!matched.includes(i)) {
            let a = rows[i]      //iterating trough each row
            let nextIndex = i+1
            let matches = [] 
            for (var x = nextIndex; x < rows.length; x++) {
                if (a[1] === rows[x][1] && a[2] === rows[x][2]) {
                    matches.push(x);
                }
            }

          let cols = [3,6]; 

          cols.forEach(function(n){  
            var newRow = a
            var lastItem = a[n]  // The Input values for the first part of the concatenation
            
              matches.forEach(index => {
                  lastItem += '|' + rows[index][n] //The column values to be concatenated to lastItem
                  matched.push(index)
              })

            newRow[n] = lastItem //The OUTPUT Column
            newRows.push(newRow)
          })         
      }
    }
    return newRows
}

I get

Id From To Transaction Flow Running Balance Description Date Type
Id From To Transaction Flow Running Balance Description Date Type
conn-1 Alan Alícia Giving1 1 60 Stuff1 20/10/2022 Person
conn-1 Alan Alícia Giving1 1 60 Stuff1 20/10/2022 Person
conn-2 Alan Ashish Giving2|Giving3 2 62 Stuff2|Stuff3 26/10/2022 Person
conn-2 Alan Ashish Giving2|Giving3 2 62 Stuff2|Stuff3 26/10/2022 Person
conn-4 Alan Deborah Giving4 15 48 Stuff4 26/10/2022 Person
conn-4 Alan Deborah Giving4 15 48 Stuff4 26/10/2022 Person
conn-5 Christine Deborah Giving5|Giving6|Giving7 1 47 Stuff5|Stuff6|Stuff7 26/10/2022 Person
conn-5 Christine Deborah Giving5|Giving6|Giving7 1 47 Stuff5|Stuff6|Stuff7 26/10/2022 Person
conn-7 Christine Gitanjali Giving8 1 54 Stuff8 26/10/2022 Person
conn-7 Christine Gitanjali Giving8 1 54 Stuff8 26/10/2022 Person
conn-8 Christine Jacklina Giving9 7 43 Stuff9 26/10/2022 Person
conn-8 Christine Jacklina Giving9 7 43 Stuff9 26/10/2022 Person

What I need

Id From To Transaction Flow Running Balance Description Date Type
conn-1 Alan Alícia Giving1 1 60 Stuff1 20/10/2022 Person
conn-2 Alan Ashish Giving2|Giving3 2 62 Stuff2|Stuff3 26/10/2022 Person
conn-4 Alan Deborah Giving4 15 48 Stuff4 26/10/2022 Person
conn-5 Christine Deborah Giving5|Giving6|Giving7 1 47 Stuff5|Stuff6|Stuff7 26/10/2022 Person
conn-7 Christine Gitanjali Giving8 1 54 Stuff8 26/10/2022 Person
conn-8 Christine Jacklina Giving9 7 43 Stuff9 26/10/2022 Person

How to concatenate multiple columns?

Google sheet with data https://docs.google.com/spreadsheets/d/11GOevQJXEQAvljesu46SYWD4Yvfi-FCLl39EtCdBBa0/edit?usp=sharing

Upvotes: 0

Views: 69

Answers (1)

Einarr
Einarr

Reputation: 332

Try this (I generalized a bit more)

//mC1 1st column index to test for dups
//mC2 2nd column index to test for dups
//Array of column indices to concatenate when merging rows duplicates in array
function mergeRow2(rows,mC1,mC2, cols) {
    let newRows = [],
        matched = [];
    
    for (var i = 0; i < rows.length; i++) {
        
        if (!matched.includes(i)) {
            let a         = rows[i],
                nextIndex = i+1,
                matches   = [];
            
            for (var x = nextIndex; x < rows.length; x++) {
                if (a[mC1] === rows[x][mC1] && a[mC2] === rows[x][mC2]) {
                    matches.push(x);
                }
            }
            
            let newRow   = a,
                lastItem = [];

            for(var n=0; n<= cols.length-1; n++) {
              matches.forEach(index => {
                lastItem = a[cols[n]]
                lastItem += '|' + rows[index][cols[n]]
                matched.push(index)

                newRow[cols[n]] = lastItem
              })
            }
          
             newRows.push(newRow)  
        };
    }

    return newRows
}

Upvotes: 2

Related Questions