Page 1 sur 1

Une macro qui exporte en .CSV?

Publié : 03 mars 2023 11:18
par OlivierApad
Bonjour,

Je commence seulement à "jouer" avec Google Sheet. Malgré quelques tutos, je ne trouve pas comment modifier une macro pour exporter une feuille en .csv.
Ma macro fait tout ce que je lui demande (assez simplement) jusqu'à un point. Mais j'aimerais qu'elle continue en exportant la feuille active au format .csv, puis supprime la feuille active.

Ma macro doit:
  1. Dupliquer la feuille
  2. Se rendre sur cette nouvelle feuille
  3. Supprimer les 4 premières lignes
  4. Copier la colonne 4 et la coller en colonne 1
  5. Supprimer (ou effacer) toutes les colonnes à partir de la colonne 4 incluse (= ne garder que les colonnes 1, 2 et 3)
  6. Exporter la feuille en .csv sur mon ordinateur
  7. Supprimer la feuille
Au final, mon fichier n'a pas changé et j'ai un .csv en plus sur mon odri.

Ma macro s'arrête au point 5.
Je ne sais pas lui faire exporter en la feuille (donc, je retire aussi la suppression puisque je dois finie manuellement).

Mon code: 

function csvsarbacane() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('1:1').activate();
  spreadsheet.duplicateActiveSheet();
  spreadsheet.getRange('1:4').activate();
  spreadsheet.getActiveSheet().deleteRows(spreadsheet.getActiveRange().getRow(), spreadsheet.getActiveRange().getNumRows());
  spreadsheet.getActiveSheet().setColumnWidth(1, 140);
  spreadsheet.getRange('A:A').activate();
  spreadsheet.getRange('D:D').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('D:N').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('N1'));
  spreadsheet.getActiveSheet().deleteColumns(spreadsheet.getActiveRange().getColumn(), spreadsheet.getActiveRange().getNumColumns());
};


Savez-vous ce que je dois faire pour ajuster ma macro? 

Merci beaucoup pour votre aide.


Olivier

Re: Une macro qui exporte en .CSV?

Publié : 06 mars 2023 11:23
par NC_Quentin
Bonjour !

J’ai présumé que l’idée de dupliquer la macro était pour faire les manipulations nécessaires afin d’avoir le résultat attendu, à savoir "le contenu de la colonne 4, puis la colonne 2, puis la colonne 3, et ce à partir de la ligne 5 et le tout dans un fichier csv". Plutôt que de faire les manipulations dans Sheets (ce qui est coûteux en temps), j’ai fait les manipulations directement dans le code Apps Script.

Ce qui donne ceci :

Code : Tout sélectionner

function exportCSV() {

  // On récupère la feuille en cours 
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // On récupère le tableau de valeurs de la feuille
  const values = sheet.getDataRange().getValues();

  // On retire les quatre premières lignes
  values.splice(0,4);

  // On prépare le contenu de notre fichier csv
  let csv = "";

  // On parcourt chaque ligne
  values.forEach((row, index) => {

    // On rajoute les valeurs de la colonne 4, 2 et 3 à la ligne en cours en mettant une virgule entre chaque valeur
    csv += [row[4].toLocaleString(), row[2].toLocaleString(), row[3].toLocaleString()].join(",");

    // Si ce n’est pas la dernière ligne, on rajoute un retour chariot
    if(index != values.length-1){
      csv += "\r\n";
    }
  });

  // On récupère l’ID du dossier de sortie
  const folderID = "123abc456exemple789def";

  // On crée un fichier csv directement
  DriveApp.getFolderById(folderID).createFile(`${sheet.getName()}.csv`, csv);
}

Ce n’est pas possible de créer sur l’ordinateur directement avec Apps Script, mais on peut toujours créer un fichier dans un dossier drive. Ici, j’ai choisi la solution simple de créer le fichier dans un dossier déjà identifié avec son identifiant, mais il est aussi possible de créer un dossier automatiquement pour chaque export csv. Pour l’exemple, voilà ce que ça m’a donné sur mon fichier test :

Le tableau de base

Image

Le résultat prévisualisé dans Drive

Image

C’est assez basique, mais ça devrait faire l’affaire !
 

Re: Une macro qui exporte en .CSV?

Publié : 06 mars 2023 14:12
par OlivierApad
Bonjour,

Merci pour ta réponse!

A ceci près que les colonnes sélectionnées sont décalées d'1 à droite.
J'ai fait ce changement : 
csv += [row[4].toLocaleString(), row[2].toLocaleString(), row[3].toLocaleString()].join(",");
=> csv += [row[3].toLocaleString(), row[1].toLocaleString(), row[2].toLocaleString()].join(","); 
et ça marche.

Merci bcp pour ce code!
Il a aussi l'avantage de ne pas créer une page supplémentaire à supprimer à la fin.

Et j'apprécie particulièrement tous les commentaires, dans le code, qui me permettent de bien le comprendre! C'est top!


Cependant, je manque de connaissance et je ne sais pas comment lancer l'application ?
Comme ce n'est plus enregistré en Macro, comment faire pour la lancer rapidement ?
En créant une macro, je savais attribuer un raccourci clavier ou la lancer via le menu Extensions.
Dois-je la déployer pour qu'elle soit accessible à mes collègues avec qui je partage un drive? 

Merci d'avance.


Olivier
 

Re: Une macro qui exporte en .CSV?

Publié : 06 mars 2023 14:37
par NC_Quentin
Une fois que le code est mis dans le fichier Apps Script lié, le moyen le plus simple est, depuis Sheets, d’aller dans Extensions > Macros > Importer une macro. Il devrait y avoir automatiquement la fonction "exportCSV" de disponible, il suffit d’accepter et elle apparaîtra désormais dans la liste des macros 🙂

Il y a d’autres possibilités, comme par exemple de créer un nouveau bouton de menu directement dans Sheets, mais pour quelque chose comme ça je pense que c’est le plus simple !

Re: Une macro qui exporte en .CSV?

Publié : 06 mars 2023 16:20
par OlivierApad
Ca marche!

Merci beaucoup!

Sujet résolu ;-)