web-dev-qa-db-fra.com

Supprimer une ligne dans Google Spreadsheets si la valeur de la cellule dans cette ligne est vide ou vide

J'aimerais pouvoir supprimer une ligne entière dans un tableur Google si la valeur entrée pour la colonne "C", par exemple, est 0 ou vide. Y at-il un script simple que je pourrais écrire pour accomplir ceci? Merci!

19
Zack
function onEdit(e) {
  //Logger.log(JSON.stringify(e)); 
  //{"source":{},"range":{"rowStart":1,"rowEnd":1,"columnEnd":1,"columnStart":1},"value":"1","user":{"email":"","nickname":""},"authMode":{}}
  try {
    var ss = e.source; // Just pull the spreadsheet object from the one already being passed to onEdit
    var s = ss.getActiveSheet();

    // Conditions are by sheet and a single cell in a certain column
    if (s.getName() == 'Sheet1' &&  // change to your own 
        e.range.columnStart == 3 && e.range.columnEnd == 3 &&  // only look at edits happening in col C which is 3
        e.range.rowStart == e.range.rowEnd ) {  // only look at single row edits which will equal a single cell
      checkCellValue(e); 
    }
  } catch (error) { Logger.log(error); }
};

function checkCellValue(e) {
  if ( !e.value || e.value == 0) {  // Delete if value is zero or empty
    e.source.getActiveSheet().deleteRow(e.range.rowStart);
  }
}

Cela ne concerne que la valeur d'une cellule unique modifiée maintenant et non les valeurs de la feuille entière.

21
Bryan P

J'ai écrit ce script pour faire la même chose pour l'une de mes feuilles de calcul Google. Je voulais pouvoir exécuter le script une fois que toutes les données étaient dans la feuille de calcul. J'ai donc ajouté une option de menu pour exécuter le script.

/**
 * Deletes rows in the active spreadsheet that contain 0 or
 * a blank valuein column "C". 
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function readRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[2] == 0 || row[2] == '') {
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

/**
 * Adds a custom menu to the active spreadsheet, containing a single menu item
 * for invoking the readRows() function specified above.
 * The onOpen() function, when defined, is automatically invoked whenever the
 * spreadsheet is opened.
 * For more information on using the Spreadsheet API, see
 * https://developers.google.com/apps-script/service_spreadsheet
 */
function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "Remove rows where column C is 0 or blank",
    functionName : "readRows"
  }];
  sheet.addMenu("Script Center Menu", entries);
};

Tester le tableur avant:

enter image description here

Exécution du script à partir du menu:

enter image description here

Après avoir exécuté le script:

enter image description here

16
Mike Grace

Je peux suggérer une solution simple sans utiliser de script !! 

Supposons que vous souhaitiez supprimer les lignes contenant du texte vide dans la colonne C . Triez les données (Menu Données -> Trier la feuille par colonne C, A-> Z) dans la feuille de la colonne C afin que toutes les lignes de texte vides être disponible ensemble.

Il suffit de sélectionner toutes ces lignes ensemble et de cliquer avec le bouton droit de la souris sur -> supprimer les lignes . Vous pouvez alors trier à nouveau vos données en fonction de la colonne dont vous avez besoin . Terminé.

12
roneo

J'avais quelques problèmes avec les scripts et ma solution de contournement consistait à utiliser l'outil "Filtre".

  1. Sélectionner toutes les données de la feuille de calcul
  2. Cliquez sur l'icône de l'outil de filtrage (qui ressemble à un verre de vin)
  3. Cliquez sur la nouvelle icône de filtre disponible dans la première cellule de la colonne que vous souhaitez rechercher.
  4. Sélectionnez "Filtrer par condition"> Définir les conditions (j'utilisais "Le texte contient"> "Word")

Cela laissera les lignes contenant le mot recherché et vous pourrez les supprimer en les sélectionnant en bloc tout en maintenant la touche Maj enfoncée> clic droit> supprimer les lignes.

5
Adam

C'est ce que j'ai réussi à faire fonctionner. Vous pouvez voir que j'ai parcouru la feuille en arrière, de sorte qu'une ligne supprimée ne soit pas ignorée. J'espère que cela aide quelqu'un.

  function UpdateLog() {

  var returnSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('RetLog');
  var rowCount = returnSheet.getLastRow();

  for (i = rowCount; i > 0; i--) {
    var rrCell = 'G' + i;
    var cell = returnSheet.getRange(rrCell).getValue();
    if (cell > 0 ){
      logSheet.
      returnSheet.deleteRow(i);
    }
  }
}
3
MikeD

demande assez simple. Essaye ça :

 function try_It(){
 deleteRow(2); //// choose col = 2 for column C
 }

 function deleteRow(col){ // col is the index of the column to check for 0 or empty
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!='' && data[n][col]!=0){ targetData.Push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

EDIT: relisant la question, je ne suis pas sûr si la question demande une fonction «en direct» sur la fonction Edit ou une fonction (comme celle ci-dessus) à appliquer après la saisie des données. Ce n’est pas très clair pour moi ... alors n'hésitez pas à être plus précis si nécessaire;)

1
Serge insas

Ce code simple a fait le travail pour moi!

    function myFunction() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();  // get active spreadsheet

      var activeRow = ss.getActiveRange().getRowIndex();  // get active/selected row

var start=1;
var end=650;
var match='';
var match2=0;   //Edit this according to your choice.

     for (var i = start; i <= end; i++) {
      var columnC = ss.getRange("C"+i).getValue();
      if (columnC ==match  || columnC ==match2){ ss.deleteRow(i); }
     }
    }
0
Udayraj Deshmukh

Il y a un moyen plus simple:

  1. Utilisez filtering pour afficher uniquement les lignes que vous souhaitez supprimer. Par exemple, ma colonne en fonction de laquelle je veux supprimer des lignes avait des catégories, A, B, C. Par l’interface de filtrage, je sélectionnais seulement A et B, que je voulais supprimer.
  2. Sélectionnez toutes les lignes et supprimez-les. Ce faisant, dans mon exemple, toutes les lignes A et B ont été effectivement sélectionnées et supprimées. maintenant, ma feuille de calcul ne montre aucune ligne.
  3. Éteignez le filtre. Cela affiche mes lignes C. Terminé!
0

en lisant attentivement votre question, j'ai proposé cette solution:

function onOpen() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // create menu
  var menu = [{name: "Evaluate Column C", functionName: "deleteRow"}];

  // add to menu
  ss.addMenu("Check", menu);
}

function deleteRow() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get active/selected row
  var activeRow = ss.getActiveRange().getRowIndex();

  // get content column C
  var columnC = ss.getRange("C"+activeRow).getValue();

  // evaluate whether content is blank or 0 (null)
  if (columnC == '' || columnC == 0) {
    ss.deleteRow(parseInt(activeRow));
  }
}

Ce script créera un menu lors du chargement du fichier et vous permettra de supprimer une ligne en fonction des critères définis dans la colonne C ou pas .

0
Jacob Jan Tuinstra