Connection avec Drive et importation "auto" ?

Bonjour ( encore ) j'avais dit que je reviendrais bientôt !

j'avais lancé ce sujet fin 2020 avec Excel ( sans réponse ) mais depuis je suis tombé amoureux de Sheets ! alors je relance sur le bon support.

Je suis toujours sur mon doc qui a value quelques sujet pour rien mélanger.

ultime question. j'aimerai bien récupérer certaines données qui sont stockées sur un google drive partagé.

un fichier global est généré par semaines sous un format .CSV

drive

et dans chaque fichiers il y a un détail par adresse ( avec beaucoup d'adresse )

disperse

pour chaque fichiers, j'aimerai simplement récupérer tout le contenu de la ligne " investor" ( que j'appel "en-tete" ) et de la ligne contenant 2 adresses précises que j'ai en ma possession.

A savoir que ces 3 informations sont toujours sur la 1ere colonne de chaque document

Et je dois avouer que télécharger tout les .CSV, filtre avec google Sheets, etc.. pour récupérer 3 lignes… comment dire

je suis sur que google a une solution pour ça !

ps : au besoins je pense que je peux partager le drive en Mp sinon quelques .CSV en Mp
également

merci a vous !

et le top du top ce serait de récupérer seulement les "en-têtes" dans lequel des données existent pour les lignes d'adresse

je ne sais pas si ma phrase est clair

Bonjour,

mais depuis je suis tombé amoureux de Sheets ! alors je relance sur le bon support.

moi aussi ...

Oui, je veux bien un exemple même bidon d'un fichier csv, je dupliquerai et ferai quelques essais

Je pense qu'avec IMPORTDATA et QUERY on peut s'en sortir mais a condition de connaître au préalable les ID des fichiers csv. Sinon, on devrait pouvoir lister ces fichiers et récupérer les données adhoc via un script.

  • Les fichiers csv sont-ils tous regroupés dans un dossier particulier ?
  • Ont-ils un nom distinctif ou faut-il prendre tous les fichiers csv ?
  • Quel est le séparateur ? virgule ou point-virgule (ou autre) ?
  • Quels sont les 2 adresses précises à retenir ?

De toute façon, je travaillerai en paramétrage, donc peu importe les valeurs réelles, on prendra des valeurs bidon.

Bonjour,

je t'envoie le lien du drive en Mp. Ensuite pour répondre a tes questions.

> il existe plusieurs dossier, mais une fois que j'aurais compris comment faire je verrais quoi prendre. pour le moment on peux se concentrer sur un dossier.

> le fichier commence toujours par " PayOut Realt via disperse.app - 2021 - weekXX.csv ( xx étant le numéro de la semaine, c'est le seul élément changeant )

> en ouvrant le .CSV directement avec Sheets, mais lorsque je le télécharge et l'ouvre avec Excel par ex. et ce sont des virgules

> voici 2 adresses au hasard par soucis de donnée perso :D

0xd58B7F2722371aa92C929272094c3A65482c0429

0x43a89C2f84e7e731D1787b523AE4e1c588C1Aa6A

Merci encore

PS : si jamais c'est plus simple et possible aussi, je reçois le fichier .CSV en question chaque semaine par Gmail en piece jointe. si jamais le lien est plus facile que pour google drive


EDIT = vu la complexité du Drive que j'ai envoyé ( ça faisait un moment que n'avais pas été voir ) , je pense même que ce serait mieux de mettre les liens des doc' manuellement sur le spreadsheet et travailler a partir de ce lien ?

Bonjour,


EDIT = vu la complexité du Drive que j'ai envoyé ( ça faisait un moment que n'avais pas été voir ) , je pense même que ce serait mieux de mettre les liens des doc' manuellement sur le spreadsheet et travailler a partir de ce lien ?

1ère partie : je récupère automatiquement les url et id des fichiers csv ...

function listeFichiersUnDossier() {

  var dossier = '________mettre ici id du dossier__________';

  var feuille = SpreadsheetApp.getActiveSheet();
  feuille.clear();
  feuille.appendRow(["nom", "date mise à jour", "URL", "id"]);
  var folder = DriveApp.getFolderById(dossier);
  var data = [];
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      data = [ 
        fichier.getName(),
        fichier.getLastUpdated(),
        fichier.getUrl(),
        fichier.getId()
      ];
    feuille.appendRow(data);
    }
  }
}

La deuxième partie était d'importer les données csv ...

function importData() {
  var id = '_______id du fichier____________';
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("maFeuille");
  for (var i = 0; i < csvData.length; i++) {
    f.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
  }
}

J'ai essayé d'enchaîner et tout importer, mais on dépasse la capacité

image

Ce qui veut dire aussi que ta base de données est lourde ! Cela justifierait presque de travailler avec un serveur et mysql.

voici

const idX = ['0x09C16c5c6578A75Fabd123ad236971E41B2775Ab','0x09e329413234E621aA810481b271ab80e1fB4AE4','0x09E773a308556be26b2e9e797D9747014910c51b']
const f = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

function compilCSV() {
  f.clear();
  var dossier = '__________id_du_dossier___________';
  var folder = DriveApp.getFolderById(dossier);
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      lireCsvFromId(fichier.getId())
    }
  }
}

function lireCsvFromId(id) {
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var n = f.getLastRow()+1;
  f.getRange(n, 1, 1, 1).setValue(id);
  for (var i = 0; i < csvData.length; i++) {
    if(idX.indexOf(csvData[i][0])!=-1 || csvData[i][0]=='Investor'){
      f.getRange(n, 2, 1, csvData[i].length).setValues(new Array(csvData[i]));
      n+=1;
    }
  }
  SpreadsheetApp.flush();
}

Merci, je vois tout ça en débauchant. Les macros c'est encore du chinois pour moi 🤗 mais je me doutais qu'il fallait en passer par là !

Merci encore, je reviens vite

On peut essayer avec query et importdata, mais il faut lister au préalable les id des fichiers.

edit :

en A1, l'ID du fichier csv

en colonne C les critères de sélection des lignes

=query(importdata("____________"&A1),"select * where Col1 matches '"&textjoin("|",true,C1:C)&"' ",0)

Effectivement les .CSV sont assez lourd, d'où mon intérêt de cibler juste les données qui m'intéresse

j'étais parti sur cette solution "full" automatique. mais je suis ouvert a d'autres solutions, maintenant que mes attentes sont assez ciblées.

le principal étant de récupérer les données des colonnes contenant quelques choses pour 2 adresses, et récupérer les "en-têtes" .

donc je peux partir sur un processus manuel pour apporter le lien d'un document par ex. et extraire celui-ci via des formules ( dis comme ça c'est si simple )

ce que je ne voulais pas ( ou du moins, éviter ), c'est de download et importer les fichiers complet sur mon Dashboard.

merci pour ces quelques recherches, j'ai bien eu ton doc.

la 1ere pages est liée au script ? et la 2ieme page est liée a ta formule ? ( rien ne ressort en revanche j'ai l'impression )

  1. la première feuille est l'extraction par le script
  2. la seconde feuille était un essai avec une formule query et importdata, mais je ne sais prendre qu'une ID du fichier csv à la fois, donc oublie pour le moment, j'ai supprimé

Les scripts sont super !! il faut vraiment que j'assimile ce langage et la façon de structurer

je soumets 2 petites choses si possible ou "amélioration" ( c'est quand même gênant de demander ce surplus et d'abuser de ton temps ... )

Concernant ListeFichiersUnDossier

*Comment éditer le script de façon a ce que je renseigne moi même un ID de dossier dans une cellule et ensuite lancer le script via une commande ?

par exemple =ListeFichiersUndossier(A1)

(ça me permettra de cibler un dossier en particulier, voir même faire une feuille par dossier, je verrais ce qui est le mieux)


Concernant sélection

* Idem, pourquoi pas lancer le script en fonction d'une cellule toujours dans l'optique de cibler le fichier cible

*un rendu transposé serait peut-être plus "lisible " ?

* et reprendre seulement les données où il y a des données correspondants aux adresses par ex :

capture

cette démarche d'importer ces documents, c'est juste pour vérification et comparer a la réalité, a titre éphémère. je n'ai pas besoins d'accumuler ces données sur du long terme

Merci encore

Tu as tout à fait raison, j'ai un peu galéré pour y arriver, mais maintenant il faut mettre en dehors du script les paramètres. J'avais tenté une fonction appelée dans la feuille, mais j'ai échoué !

Je vais m'y mettre ...

Vérifie, j'ai l'impression d'avoir moins de données.

Il y a une feuille param et deux zones dossier et criteres

J'ai ajouté un menu pour lancer la lecture.

  1. Les en-têtes des fichiers sans relation avec les critères sont encore présentes, si tu veux je pourrais les enlever, mais c'est un peu complexe quand même. Il faut aussi que je réfléchisses sur la suppression de certaines en-têtes. Pour cela, il faut que je stocke les données une fois le fichier lu, et ensuite ne reprendre que les données utiles.
  2. Que veux-tu dire par transposées ?
const idX = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('criteres').getValues().join().split(",");
const f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('csv');

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('** Compiler ... **')
    .addItem('... les fichiers csv', 'compilCSV')
    .addToUi();
}

function compilCSV() {
  f.clear();
  var dossier = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('dossier').getValue();
  var folder = DriveApp.getFolderById(dossier);
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      lireCsvFromId(fichier.getId())
    }
  }
}

function lireCsvFromId(id) {
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var n = f.getLastRow()+1;
  for (var i = 0; i < csvData.length; i++) {
    if(idX.indexOf(csvData[i][0])!=-1 || csvData[i][0]=='Investor'){
      f.getRange(n, 1, 1, 1).setValue(id);
      f.getRange(n, 2, 1, csvData[i].length).setValues(new Array(csvData[i]));
      n+=1;
    }
  }
  SpreadsheetApp.flush();
}

ok, je vais regarder ça

Que veux-tu dire par transposées ?

avoir les éléments de la ligne "investor" sur une colonne et les éléments des adresses sur 1 colonne par adresse

je ne pense pas qu'il manque d'elements par rapport a ton script. En revanche si je mets l'ID d'un fichier directement, ça ne fonctionne pas.

merci :)

Vérifie, j'ai l'impression d'avoir moins de données.

il y a effectivement moins de donnée mais c'est sans doute liée a ces adresses, car lorsque je mets les miennes je retombe sur mes pattes.

( moins d'ancienneté dans les fichiers sans doute )

avoir les éléments de la ligne "investor" sur une colonne et les éléments des adresses sur 1 colonne par adresse

si tu pouvais me faire à la main un exemple partiel ...

je ne pense pas qu'il manque d'elements par rapport a ton script. En revanche si je mets l'ID d'un fichier directement, ça ne fonctionne pas.

merci :)

absolument ! un ID de dossier ne se traite pas de la même façon qu'un ID de fichier csv, mais si tu le souhaites je peux aussi le faire

Bonjour,

absolument ! un ID de dossier ne se traite pas de la même façon qu'un ID de fichier csv, mais si tu le souhaites je peux aussi le faire

Ne connaissant pas la structuration futur du google Drive, avec le recul je me dit que c'est mieux en effet, j'importerai l'ID du fichier que je veux vérifier précisément a chaque fois.

si tu pouvais me faire à la main un exemple partiel ...

c'est fait :)

Merci et bonne journée / soirée si jamais on est pas sur le même fuseau horaire :D

Voici une nouvelle mouture

const idX = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('criteres').getValues().join().split(",");
const f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('csv');

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('** MENU **')
    .addItem('Lister les fichiers csv', 'listeFichiersUnDossier')
    .addItem('Lire un fichier csv', 'lireCSV')
    .addItem('Compiler les fichiers csv d\'un dossier', 'compilCSV')
    .addToUi();
}

function compilCSV() {
  f.clear();
  var dossierId = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('dossier').getValue();
  var folder = DriveApp.getFolderById(dossierId);
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      lireCsvFromId(fichier.getId())
    }
  }
}

function lireCSV(){
  f.clear();
  var fichierId = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('fichier').getValue();
  lireCsvFromId(fichierId)
}

function lireCsvFromId(id) {
  var result = []
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  for (var i = 0; i < csvData.length; i++) {
    if(idX.indexOf(csvData[i][0])!=-1 || csvData[i][0]=='Investor'){
      result.push(csvData[i]);
    }
  }
  try{
    result = transpose(result)
    var newResult = []
    for (var i=0;i<result.length;i++){
      var flag = false
      for (var j=1;j<result[0].length;j++){
        if(result[i][j]!=''){flag = true}
      }
      if (flag) {newResult.push(result[i])}
    }
    //newResult = transpose(newResult)
    var n = f.getLastRow()+1;
    f.getRange(n, 1, 1, 1).setValue(id);
    f.getRange(n+1, 2, newResult.length, newResult[0].length).setValues(newResult)
  }catch(e){

  }
  SpreadsheetApp.flush();
}

function listeFichiersUnDossier() {
  var dossier = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('dossier').getValue();
  var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('liste');
  feuille.clear();
  feuille.appendRow(["nom", "date mise à jour", "URL", "id"]);
  var folder = DriveApp.getFolderById(dossier);
  var data = [];
  var fichiers = folder.getFiles();
  while (fichiers.hasNext()) {
    var fichier = fichiers.next();
    if (fichier.getMimeType() == 'text/csv'){
      data = [ 
        fichier.getName(),
        fichier.getLastUpdated(),
        fichier.getUrl(),
        fichier.getId()
      ];
    feuille.appendRow(data);
    }
  }
}

function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
Rechercher des sujets similaires à "connection drive importation auto"