Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

282
Visualizações
Google Sheets JScript Row match and delete if - Take rows from Sheet A and delete if identical to rows in Sheet B, Sheet C, Sheet D... etc

My data import (Sheet A) has all information from the last known events. It only changes them when another event occurs. So if the event is from two days ago it is still in my data import (Sheet A) until that event changes. I need to have my data import (Sheet A) checked against Sheet B, Sheet C, and Sheet D for identical rows. Then delete the row if it already exists.

So far I have:

function testFilter() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetA = ss.getSheetByName("SheetA");
var sheetB = ss.getSheetByName("SheetB");
var sheetC = ss.getSheetByName("SheetC");
var sheetD = ss.getSheetByName("SheetD");
var sheetE = ss.getSheetByName("SheetE");
var sheetF = ss.getSheetByName("SheetF");

var valuesA = sheetA.getRange('A2:AC400').getValues();
var valuesB = sheetB.getRange('A2:AC400').getValues();
var valuesC = sheetC.getRange('A2:AC400').getValues();
var valuesD = sheetD.getRange('A2:AC400').getValues();
var valuesE = sheetE.getRange('A2:AC400').getValues();
var valuesF = sheetF.getRange('A2:AC400').getValues();

for (var rowa in valuesA)
{
var deleteRowa = false;
  for (var rowb in valuesB)
  {
    if(valuesA[rowa].join() == valuesB[rowb].join())
      deleteRowa = true;
  }
    if(deleteRowa == true){
      sheetA.deleteRow(rowa)
    }
SpreadsheetApp.flush();
}
for (var rowa in valuesA)
{
var deleteRowa = false;
  for (var rowc in valuesC)
  {
    if(valuesA[rowa].join() == valuesC[rowc].join())
      deleteRowa = true;
  }
    if(deleteRowa == true){
      sheetA.deleteRow(rowa)
    }
SpreadsheetApp.flush();
}
for (var rowa in valuesA)
{
var deleteRowa = false;
  for (var rowd in valuesD)
  {
    if(valuesA[rowa].join() == valuesD[rowd].join())
      deleteRowa = true;
  }
    if(deleteRowa == true){
      sheetA.deleteRow(rowa)
    }
SpreadsheetApp.flush();
}
for (var rowa in valuesA)
{
var deleteRowa = false;
  for (var rowe in valuesE)
  {
    if(valuesA[rowa].join() == valuesE[rowe].join())
      deleteRowa = true;
  }
    if(deleteRowa == true){
      sheetA.deleteRow(rowa)
    }
SpreadsheetApp.flush();
}
for (var rowa in valuesA)
{
var deleteRowa = false;
  for (var rowf in valuesF)
  {
    if(valuesA[rowa].join() == valuesF[rowf].join())
      deleteRowa = true;
  }
    if(deleteRowa == true){
      sheetA.deleteRow(rowa)
    }
SpreadsheetApp.flush();
}
}

This gives an Exception: out of bounds error on the first attempt of filtering. Does the deleterows() function work for picking out specific rows? Or am I going to have to throw it into a new list, then delete all rows from original sheet, then insert the list?

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Delete Matching Rows in SheetA

function testFilter() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const shts = ["SheetB", "SheetC", "SheetD", "SheetE", "SheetF"];
  const A1rg = "A2:AC400";
  let uA = [];//building a unique flat array of row join
  ss.getSheets().filter(sh => ~shts.indexOf(sh.getName())).forEach(sh => {
    sh.getRange(A1rg).getValues().forEach(r => {
      let j = r.join("");
      if (!~uA.indexOf(j)) {
        uA.push(j);
      }
    });
  });
  let d = 0;
  const shA = ss.getSheetByName("SheetA");
  shA.getRange(A1rg).getValues().forEach((r, i) => {
    if (~uA.indexOf(r.join(""))) {
      shA.deleteRow(i + 2 - d++);
    }
  });
}

This version runs quite a bit faster for me

function testFilter() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const shts = ["Sheet1", "Sheet2", "SheetD", "SheetE", "SheetF"];
  const A1rg = "A2:AC400";
  let uA = [];
  ss.getSheets().filter(sh => ~shts.indexOf(sh.getName())).forEach(sh => {
    sh.getRange(A1rg).getValues().forEach(r => {
      let j = r.join("");
      if (!~uA.indexOf(j)) {
        uA.push(j);
      }
    });
  });
  let d = 0;
  const shA = ss.getSheetByName("Sheet0");
  shA.getRange(2, 1, shA.getLastRow() - 1, shA.getLastColumn()).getValues().forEach((r, i) => {
    if (~uA.indexOf(r.join(""))) {
      shA.deleteRow(i + 2 - d++);
    }
  });
}
about 4 years ago · Juan Pablo Isaza Relatório

0

Here is about the same algo as Cooper's but, I hope, it's a little bit more readable.

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var names = ['SheetA', 'SheetB', 'SheetC', 'SheetD', 'SheetE' ]; // etc

  const get_array_from_sheet = sheet_name => 
    ss.getSheetByName(sheet_name).getRange('A2:AC400').getValues()
    .map(x => x.join('')).filter(String);

  var [sheetA, ...sheets_etc] = names.map(n => get_array_from_sheet(n));

  sheets_etc = sheets_etc.flat();

  var rows_to_delete = sheetA.filter(x => sheets_etc.includes(x))
    .map(x => sheetA.indexOf(x) + 2);

  rows_to_delete.reverse().forEach(x => ss.getSheetByName('SheetA').deleteRow(x));  
}
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda