Système d'archivage google sheet

Bonjours,

dans mon tableau j'ai un système d'archivage je n'arrive pas a le faire fonctionner sur d'autre ficher .

quelqu'un sait ce qu'il faut modifier pour que ca fonctionne ??

function estComplete(row, length) {
  if (row[length] != "" && row[length-1] != "") {
    return true;
  }
  else {
    return false;
  }
}

function removeRow(sheet, indexList) {
  for (var i = indexList.length - 1; i>=0; i--) {
    sheet.deleteRow(indexList[i]+2); 
  }
}

function getComplete(range, data) {
  var lastRow = range.getLastRow();
  var lastCol = range.getLastColumn()-1;

  var list = []
  for (i = 0; i < lastRow-1; i++) {
    if (estComplete(data[i], lastCol)) {
      list.push(i);
    }
  }
  return list;
}

function sendToArchive(sheetName, data, list) {
  sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

  for (i=0; i < list.length ; i++) {
    sheet.appendRow(data[list[i]])
  }
}

function archive_taches() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tâches de Maintenance");
  var range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('tableau_taches');
  var data = range.getValues();

  list = getComplete(range, data);

  sendToArchive("Historique Tâches de Maintenance", data, list);

  removeRow(sheet, list);
}

https://docs.google.com/spreadsheets/d/1LqOVW8bNx05smQ1qrvjEs0pCzmHMo5tD5EoVGDkVq8c/edit?usp=sharing

ci-dessus le liens d'un des classeuses ou je fais des testes .

je pense avoir un souci sur cette commande

function estComplete(row, length) {
  if (row[length] != "" && row[length-1] != "") {
    return true;
}

Bonjour,

peux-tu donner l'accès au fichier ? https://www.sheets-pratique.com/fr/cours/partage

1- Déjà, ceci me semble être une erreur

var range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('tableau_taches');
var data = range.getValues();

puisque range est ici une feuille (sheet) et non des cellules (range)

il faudrait indiquer la zone ou a minima

var range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('tableau_taches').getDataRange();

2- mais ceci m'interpelle aussi

list = getComplete(range, data);

car dans la même fonction on voit range et data qui sont liés !! à mon a vis il doit manquer l'appel à sheet

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tâches de Maintenance");

=> je pense que ton soucis est l'écriture de archive_taches()

oui bien sur voici le lien :https://docs.google.com/spreadsheets/d/1LqOVW8bNx05smQ1qrvjEs0pCzmHMo5tD5EoVGDkVq8c/edit?usp=sharing

le code transmis provient d'un autre tableau qui fonctionne j'essaye de comprendre pour pouvoir le réutiliser

si non tu as un autre moyen d'archiver des lignes d'un tableau (1) vers un autre tableau (2) en supprimant la ligne du tableau (1) est en remontant les autres (avec les cases non vide ?

je voulais le faire grâce un bouton qui détecte quand une certaine cellule est non vide.

on appuie sur le bouton et la ou les lignes sont archiver si la cellule est non vide

Une première proposition ligne à ligne avec case à cocher en dernière colonne

function onEdit(event){
  var feuille = event.source.getActiveSheet();
  var cel = event.source.getActiveRange();
  if ((cel.getColumn() == feuille.getLastColumn()) && (feuille.getName() == 'Tâches de Maintenance')){
    if (cel.getValue()){
      var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Historique Tâches de Maintenance");
      archive.insertRowBefore(2);
      var plage = feuille.getRange(cel.getRow(),1,1,cel.getColumn());
      plage.copyTo(archive.getRange('A' + 2), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false); 
      feuille.deleteRow(cel.getRow());
    }
  }
}

je peux travailler sur une solution globale sur plusieurs lignes

toujours basé sur une case à cocher en dernière colonne

function archiver() {
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Historique Tâches de Maintenance");
  var data = feuille.getRange(2,1,feuille.getLastRow()-1,feuille.getLastColumn()).getValues()
  var archiveData = []
  var lignes = []
  var ligne = 1
  var col = feuille.getLastColumn()-1
  try {
    data.forEach(function (row) {
      ligne++
      if (row[col]) {
        archiveData.push(row)
        lignes.push(ligne)
      }
    })
    archive.getRange(archive.getLastRow() + 1, 1, archiveData.length, archiveData[0].length).setValues(archiveData)
    lignes.reverse().forEach(x => feuille.deleteRow(x));
    SpreadsheetApp.getActive().toast('Ligne(s) '+lignes.flat()+' archivée(s) !', 'Fin de script 🗃️')
  } catch (e) {
    SpreadsheetApp.getActive().toast('Rien à archiver !', 'Fin de script 🗃️')
  }
}

on peut remplacer

if (row[col])

par un test sur la complétude de la ligne ...

Merci beaucoup ca marche nickel vous m'enlevez une belle épine du pieds!

si je doit l'adapter a d'autre tableau quelle paramètre son a changer ?

A quoi ressemblerais le test sur la complétude de la ligne?

si je doit l'adapter a d'autre tableau quelle paramètre son a changer ?

rien à part le nom de la feuille archive, je viens justement de revisiter le code pour toi (et en avoir un plus générique)

A quoi ressemblerais le test sur la complétude de la ligne?

il faudrait mettre

if(row.indexOf('')==-1) {

au lieu de

if (row[col]) {

c'est super merci donc (pour info) cela ne marche pas si j'ai besoin de mettre plusieurs système d'archivage dans un meme tableau ?

apres cette question je t'embete pas plus je clôturerais la conversation. en tout cas c'est super gentil merci beaucoup.!

cela ne marche pas si j'ai besoin de mettre plusieurs système d'archivage dans un meme tableau ?

C'est à dire ?? tout dans 'Historique Tâches de Maintenance' ?

  • si la structure est la même tu peux mettre à la file en provenance de différents onglets
  • et même si la structure n'était pas la même du reste
    • si tu as quelque chose pour te repérer
    • sinon on ajoute le nom de l'onglet de où l'historique provient

Ba ça serais 2 tableau différent sur des feuilles différente Un tableau " historique de maintenance" et un autre "commande" ils n’ont pas de ligne maximum.

Et ils ont a besoin d’archiver les ligne dans 2 feuille d’archives différentes

voir ci-dessous

Excuse moi de ne pas y arriver mais je crois avoir un problème avec le code sur la ligne 11 et 2, j'ai essayer de l'adapter mais en vain.

je t'ai envoyer le liens en mode créateur en mp.

Mets a minima une ligne de titre de tes colonnes

salut et merci de tes réponse!

ErreurException:The number of rows in the range must be at least 1.
archiver@ Code.gs:11
archiverCommande@ Code.gs:2

J'ai toujours ces 2 erreur qui s'affiche même en n'ayant nommer les colonnes

je ne voulais pas mettre de gestion d'erreur sans trouver la cause

en effet, dans ce cas, la ligne de fin getLastRow() est de 1 et donc on ne peut pas trouver les valeurs ...

j'avais pourtant essayé avec aucune ligne dans commande et cela fonctionnait, mais maintenant je comprends que la présence des cases à cocher sur toute la colonne fait que le getLastRow() comprend aussi les lignes sans rien mais avec cette case à cocher

function onOpen() {
  SpreadsheetApp.getUi().createMenu('⇩ M E N U ⇩')
    .addItem('👉 Archiver commandes', 'archiverCommande')
    .addItem('👉 Archiver maintenance', 'archiverMaintenance')
    .addToUi();
}
function archiverCommande() {
  archiver("Commandes","Historique Commande");
}
function archiverMaintenance() {
  archiver("Maintenance","Historique Tâches de Maintenance");
}

function archiver(depuis,vers) {
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(depuis);
  var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(vers);
  if (feuille.getLastRow()==1){
    SpreadsheetApp.getActive().toast('Aucune donnée !', 'Fin de script 🗃️')
    return
  }
  var data = feuille.getRange(2,1,feuille.getLastRow()-1,feuille.getLastColumn()).getValues()
  var archiveData = []
  var lignes = []
  var ligne = 1
  var col = feuille.getLastColumn()-1
  try {
    data.forEach(function (row) {
      ligne++
      if (row[col]) {
        archiveData.push(row)
        lignes.push(ligne)
      }
    })
    archive.getRange(archive.getLastRow() + 1, 1, archiveData.length, archiveData[0].length).setValues(archiveData)
    lignes.reverse().forEach(x => feuille.deleteRow(x));
    SpreadsheetApp.getActive().toast('Ligne(s) '+lignes.flat()+' archivée(s) !', 'Fin de script 🗃️')
  } catch (e) {
    SpreadsheetApp.getActive().toast('Rien à archiver !', 'Fin de script 🗃️')
  }
}

super merci tout fonctionne correctement. Jesper que ca pourra aider d'autre personne !!

Rechercher des sujets similaires à "systeme archivage google sheet"