Copier dans un autre onglet puis supprimer en fonction d'une date

Bonjour, j'ai une feuille de calcul qui dispose de plusieurs onglets.
Dans l'onglet principal "Suivi des fruits" j'ai des données afin de faire mes suivis et lorsque je fais une livraison, je coche la case correspondante dans la colonne "M" et automatiquement, cela ajoute la date actuelle dans la colonne "N".

Ce que je cherche à faire c'est que quand la date dans la colonne "N" est égale ou plus vieille que 10 jours, la ligne entière soit copiée dans l'onglet "Fruits livrés" puis, que la ligne soit supprimée de l'onglet "Suivi des fruits".
(Et ce peu importe que la date originale dans la colonne "N" ait été mise via la case à cocher en "M" ou directement mise manuellement dans la colonne "N")

Actuellement, dans l'éditeur de script il n'y a que ma formule pour écrire la date automatiquement.
Autrefois, j'avais réussi avec une formule pour copier la ligne puis effectuer la suppression mais seulement via "function onEdit" en cochant la colonne "M".

Donc, je perdais ma fonction de date et la copie se faisait instantanément quand je cochais "M".

J'ai vraiment besoin que lorsque l'item est livré, je conserve l'historique pour 10 jours dans l'onglet actuel mais qu'ensuite, je puisses trouver les vieux historiques dans l'autre onglet.

Quelqu'un sait quelle fonction je devrais utiliser pour y arriver, si cela est possible?

https://docs.google.com/spreadsheets/d/13yI_rXQ4skeXRO-hcLC98IzSpks1LYvtp_NhbreHQ6k/edit?usp=sharing

Merci pour votre précieuse aide.

coche

Bonjour,

Autrefois, j'avais réussi avec une formule pour copier la ligne puis effectuer la suppression mais seulement via "function onEdit" en cochant la colonne "M".

cela aurait été intéressant de l'avoir et l'adapter ... bon je vais partir de zéro

  • soit tu mets un bouton,
  • soit on ajoute un menu,
  • soit tu mets un déclencheur quotidien (la meilleure solution)
function archiver(){
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var main = classeur.getSheetByName('Suivi des fruits');
  var archive = classeur.getSheetByName('Fruits livrés');
  derL = getLastDataRow(main,'N');
  for (var i=2;i<=derL;i++){
    var maintenant = new Date().getTime();
    var d = new Date(maintenant -10 * 86400000); 
    if ((main.getRange('N'+i).getValue()<d) && (main.getRange('N'+i).getValue()!='')){
      Logger.log(i)
      archive.insertRowBefore(3);
      var plage = main.getRange('A' + i + ':N' + i);
      plage.copyTo(archive.getRange('A' + 2), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 
      main.deleteRow(i);
    }
  }
}

function getLastDataRow(sheet,col) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

correction ici (3 au lieu de 2), désolé ...

plage.copyTo(archive.getRange('A' + 3), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
function archiver(){
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var main = classeur.getSheetByName('Suivi des fruits');
  var archive = classeur.getSheetByName('Fruits livrés');
  derL = getLastDataRow(main,'N');
  for (var i=2;i<=derL;i++){
    var maintenant = new Date().getTime();
    var d = new Date(maintenant -10 * 86400000); 
    if ((main.getRange('N'+i).getValue()<d) && (main.getRange('N'+i).getValue()!='')){
      Logger.log(i)
      archive.insertRowBefore(3);
      var plage = main.getRange('A' + i + ':N' + i);
      plage.copyTo(archive.getRange('A' + 3), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 
      main.deleteRow(i);
    }
  }
}

function getLastDataRow(sheet,col) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

Merci, jamais je n'aurais pu programmer cela.

J'aime particulièrement que vous ayez pensé à ajouter la ligne en haut du document plutôt qu'en bas, à la suite des autres.
Je me demande par contre à quoi peut bien correspondre la valeur de la colonne N dans la feuille "Fruits livrés". Cela ne semble pas correspondre à une date, ni à des minutes ou des secondes. Pourquoi la date originale est-elle perdue?

C'est bien une date ... au format nombre ! Passe la colonne entière en format date.

Ohh que oui... ça fonctionne. J'ai pas pensé au formatage "date".

On dirait bien que tout fonctionne comme souhaité. Vraiment mais vraiment merci!

Finalement, ça ne fonctionne pas comme souhaité.

Des items sont présent et datent de bien plus que 10 jours mais cela ne se transfert pas automatiquement. Afin que cela fonctionne, je dois aller manuellement faire "exécuter" dans l'éditeur de script.

Comme mentionné, pour que ce soit automatique, il faut ...

  • soit tu mets un bouton,
  • soit on ajoute un menu,
  • soit tu mets un déclencheur quotidien (la meilleure solution)
Le mieux est en effet que tu mettes un déclencheur (trigger) quotidien sur la fonction archiver. Si tu n'as jamais fait, je peux te faire une video.

Effectivement, je n'ai jamais fait.

Si tu peux me faire un vidéo, ce serait très apprécié. Cependant, fais cela a temps perdu, il n'y a pas d'urgence. Je ne voudrais pas prendre trop de ton temps. Tu as déjà été génial de faire tout le travail.

trigger

Aww... aussi facile que cela !

Merci énormément !

Rechercher des sujets similaires à "copier onglet puis supprimer fonction date"