Hoja de Google usando las columnas A:M. Cada día, se pega manualmente un nuevo conjunto de datos sin procesar (alrededor de 30 filas) en la siguiente fila disponible en la columna B. Estos datos sin procesar contienen filas duplicadas que tienen algunos contenidos de columna actualizados desde el día anterior. La columna C contiene el número de trabajo que se usa para determinar los duplicados, y la columna A contiene una identificación secuencial del 1 al n.
Necesito crear una función que encuentre filas duplicadas basadas en la columna C, luego use la fila con el valor más grande de la Columna A para sobrescribir los datos en el valor más bajo de la Columna A para que el orden de los números de trabajos agregados a la hoja nunca cambie una vez al el trabajo está ahí. Imagen de hoja actualmente En la imagen; el trabajo 22,484 en la fila 4 tendría una fecha de vencimiento actualizada al 5/10/22 y los datos del trabajo en la fila 5 se eliminarían. Para los datos brutos de cada día habrá 20-25 entradas duplicadas.
Las filas máximas utilizadas serán 5000, por lo que el script puede ser ineficiente si es necesario.
¡Gracias! Connor
¡Aquí hay un enlace a la hoja ficticia ! (Gracias Mike)
function myFunction() { const sheet = SpreadsheetApp.getActiveSpreadsheet() .getSheetByName(`YOUR_SHEET`) let data = sheet.getRange(`B2:M`) .getDisplayValues() .filter(row => row.every(cell => cell.length)) const duplicates = [...new Set(data.flatMap(i => i[1]))].map(i => data.filter(item => item[1] === i)) .filter(i => i.length > 1) .map(i => i[i.length-1]) duplicates.forEach(i => { const removeRow = data.splice(data.findIndex(item => item === i), 1) data[data.findIndex(item => item[1] === i[1])] = removeRow.flat() }) sheet.getRange(`B2:M`).clear() sheet.getRange(2, 2, data.length, data[0].length).setValues(data) }Esto obtendrá todas las filas no vacías de datos de la tabla, encontrará los duplicados y reemplazará las entradas anteriores (antiguas) con los nuevos datos.
¡Hazme saber si esto funciona para ti!
function myFunction() { const sheet = SpreadsheetApp.getActiveSpreadsheet() .getSheetByName(`YOUR_SHEET`) // Get the target range.. let data = sheet.getRange(`B2:M`) // As text.. (Avoids date issues) .getDisplayValues() // ...and ignore blank rows. .filter(row => row.every(cell => cell.length)) // Get all unique `Job No`'s and replace their value in this array with the relevant rows from 'data'... const duplicates = [...new Set(data.flatMap(i => i[1]))].map(i => data.filter(item => item[1] === i)) // Keep all `Job No`'s rows with more than 1 entry.. .filter(i => i.length > 1) // ...And keep only the most recent. .map(i => i[i.length-1]) // For each of these duplicates.. duplicates.forEach(i => { // Remove the 'new' row.. const removeRow = data.splice(data.findIndex(item => item === i), 1) // Replace the 'old' row.. data[data.findIndex(item => item[1] === i[1])] = removeRow.flat() }) sheet.getRange(`B2:M`).clear() sheet.getRange(2, 2, data.length, data[0].length).setValues(data) } function removeDupsOnColC() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName(`DEBUG`) let data = sh.getRange(`B2:M` + sh.getLastRow()).getDisplayValues(); let ua = []; let oA = []; data.forEach((r,i) => { if(!~ua.indexOf(r[2])) { ua.push(r[2]); oA.push(r); } }) sh.getRange(2, 2, oa.length, oa[0].length).setValues(oa) }