tutorial sheets scripts script openbyurl macro google español ejemplos docs developer apps app active google-apps-script google-spreadsheet

google apps script - sheets - Eliminar valores de fila en más de 1 hoja si existe en otra hoja



google spreadsheet macro (2)

Aunque la otra respuesta funciona (no probé, pero creo que sí) usa muchas llamadas a la hoja de cálculo y puede ser lenta si tienes muchos datos.

Es posible obtener este resultado usando solo matrices (si no necesita mantener el formato de hoja y / o fórmulas).

El enfoque es ligeramente diferente, ya que es más fácil mantener los datos en lugar de eliminarlos.

Seguramente hay muchas soluciones posibles, a continuación se muestra la que probé: Creé una matriz especial que contiene solo la primera columna de la hoja 3 para simplificar la búsqueda duplicada.

function removeDupsInOtherSheets() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var s1 = ss.getSheetByName("Sheet1").getDataRange().getValues(); var s2 = ss.getSheetByName("Sheet2").getDataRange().getValues(); var s3 = ss.getSheetByName("Sheet3").getDataRange().getValues(); // iterate s3 and check in s1 & s2 if duplicate values exist var nS1 = []; var nS2 = []; var s3Col1 = [];// data in column1 of sheet3 for(var n in s3){ s3Col1.push(s3[n][0]); } for(var n in s1){ // iterate sheet1 and test col 1 vs col 1 in sheet3 var noDup1 = checkForDup(s1[n],s3Col1) if(noDup1){nS1.push(noDup1)};// if not present in sheet3 then keep } for(var n in s2){ // iterate sheet2 and test col 1 vs col 1 in sheet3 var noDup2 = checkForDup(s2[n],s3Col1) if(noDup2){nS2.push(noDup2)};// if not present in sheet3 then keep } Logger.log(nS1);// view result Logger.log(nS2); ss.getSheetByName("Sheet1").getDataRange().clear();// clear and update sheets ss.getSheetByName("Sheet2").getDataRange().clear(); ss.getSheetByName("Sheet1").getRange(1,1,nS1.length,nS1[0].length).setValues(nS1); ss.getSheetByName("Sheet2").getRange(1,1,nS2.length,nS2[0].length).setValues(nS2); } function checkForDup(item,s){ Logger.log(s+'' = ''+item[0]+'' ?'') if(s.indexOf(item[0])>-1){ return null; } return item; }

El código a continuación es de una respuesta de esta publicación con respecto a la copia de valores de fila a una nueva hoja si existe en otras hojas.

Ahora, ¿qué sucede si en lugar de copiar los valores duplicados en la hoja 3, quiero eliminarlos de las hojas 1 y 2 si existen en la Hoja 3. Con la misma hoja de cálculo , tengo 3 hojas. El valor único que se comparará en las primeras 2 hojas es la primera columna, "ID NÚMERO".

Dados los valores, 784 | John Steep | IT Department 784 | John Steep | IT Department 784 | John Steep | IT Department , que existe en las 3 hojas, el mismo valor de fila debe eliminarse en la Hoja 1 y 2 y conservar el mismo valor en la Hoja 3.

function copyRowtoSheet3() { var s1 = SpreadsheetApp.openById("ID").getSheetByName(''Sheet1''); var s2 = SpreadsheetApp.openById("ID").getSheetByName(''Sheet2''); var s3 = SpreadsheetApp.openById("ID").getSheetByName(''Sheet3''); var values1 = s1.getDataRange().getValues(); var values2 = s2.getDataRange().getValues(); var resultArray = []; for(var n=0; n < values1.length ; n++){ var keep = false; for(var p=0; p < values2.length ; p++){ Logger.log(values1[n][0]+'' =? ''+values2[p][0]); if( values1[n][0] == values2[p][0] && values1[n][3] == values2[p][4]){ resultArray.push(values1[n]); Logger.log(''true''); break ;// remove this if values are not unique and you want to keep all occurrences... } } } s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray); }

Parece que no puede encontrar la solución correcta. Intenté varios scripts pero no pude hacerlo funcionar.

Gracias por cualquier consejo / sugerencia.


Sheet1

ID NUMBER NAME DEPARTMENT 784 John Steep I.T. 901 Liz Green H.R.

Sheet2

ID NUMBER NAME DEPARTMENT 784 John Steep I.T. 653 Bo Gore Marketing

Sheet3

ID NUMBER NAME DEPARTMENT 784 John Steep I.T. 999 Frank White Sales 121 Abid Jones Engineering 901 Liz Green H.R.

Guión

function main() { var ss = SpreadsheetApp.openById("ID"); var s1 = ss.getSheetByName("Sheet1"); var s2 = ss.getSheetByName("Sheet2"); var s3 = ss.getSheetByName("Sheet3"); var idCol = 1; // Assuming location of ID column is same in all sheets. var s1RowCount = s1.getLastRow(); for (var i = 2; i <= s1RowCount; i++) { // Start at var i = 2 to skip the // first row containing the header. var id = s1.getRange(i, idCol, 1, 1).getValue(); deleteDuplicates(s2, id); deleteDuplicates(s3, id); } } function deleteDuplicates(sheet, id) { var idCol = 1; // Assuming location of ID column is same in all sheets. var rowCount = sheet.getLastRow(); for (var i = 2; i <= rowCount; i++) { var data = sheet.getRange(i, idCol, 1, 1).getValue(); if (data === id) { // Use this to test out the function. Logger.log("Duplicate of ID " + id + " in sheet " + sheet.getSheetName() + " at row " + i); // Uncomment the next line when ready. // sheet.deleteRow(i); } } }

Salida de registro

[14-11-04 09:16:04:551 PST] Duplicate of ID 784 in sheet Sheet2 at row 2 [14-11-04 09:16:04:587 PST] Duplicate of ID 784 in sheet Sheet3 at row 2 [14-11-04 09:16:04:727 PST] Duplicate of ID 901 in sheet Sheet3 at row 5