Import automatique de csv to google sheet

Bonjour,

Voici ma problématique !

Je passe par mon CRM Looker pour télécharger de multiples fichiers CSV qui arrivent tous ensemble zippés.

A partir de ce fichier que je "dezippe" je me retrouve avec un fichier contenant une vingtaine de petits fichiers csv.

Ma question est, une fois que j'ai ça, quel script puis je créer pour automatiser ces imports par exemple :

fichier n°1 : "MetricsHourly.csv" doit s'importer dans l'onglet "MetricsHourly" de mon google sheet "https://docs.google.com/spreadsheets/d/17OV3S-qRkZEeyJosCuGJoFPn4mEu1BLE3DKFIl50AhY/edit#gid=6560863..."

Tous mes fichiers ont au préalable les memes noms que mes onglets.

Merci par avance pour aide precieuse

Bonjour,

l'accès au fichier est refusé, partage le comme suit https://www.sheets-pratique.com/fr/cours/partage

fichier n°1 : "MetricsHourly.csv" doit s'importer dans l'onglet "MetricsHourly" de mon google sheet

  • attention, car MetricsHourly n'existe pas, c'est Metrics Hourly
  • où sont stockés ces 20 fichiers csv ?
  • je suppose qu'ils sont au format séparateur virgule
  • est-ce que l'on connait a priori le nom de ces fichiers ?

en connaissant a priori les noms des fichiers (uniques) stockés sur le drive, on peut faire ceci en activant le service Sheets API dans l'éditeur de script (je l'ai fait sur ta copie, voici comment faire ...)

image
function importMultipleCSV() {
  const ss = SpreadsheetApp.getActive();
  const list = ["fichier1", "fichier2", "fichier3"];
  const obj = list.map((name, i) => ({
    gid: ss.getSheetByName(list[i]).getSheetId(),
    data: DriveApp.getFilesByName(name + '.csv').next().getBlob().getDataAsString()
  }));
  var resource = {
    requests: obj.map(({ gid, data }) => ({
      pasteData: {
        data: data,
        coordinate: { sheetId: gid },
        delimiter: ","
      }
    }))
  };
  Sheets.Spreadsheets.batchUpdate(resource, ss.getId());
}

Effectivement ! Bien vu !!! Merci bcp pour le spot.

Ces 20 fichiers sont stockés sur le bureau ou un drive je ne sais pas quelle solution serait la plus simple.

oui séparateur virgule classique.

Hormis une erreur, les fichiers ont le même nom que chaque onglet de mon ggsheet (sans le ".csv " bien entendu)

sur le script que tu m'as collé juste au dessus, il n' y a pas encore la ligne qui dit " l'emplacement " où aller chercher ces .csv, on est d'accord ? (un peu novice je dosi le reconnaitre)

j'ai tenté de modifier les fichiers 1, 2, 3 effectivement il execute mais il execute "dans le vide" bien sur.

Merci pour la suite Steelson 🙏🏻 ca me sauve la vie haha

Ces 20 fichiers sont stockés sur le bureau ou un drive je ne sais pas quelle solution serait la plus simple.

Hormis une erreur, les fichiers ont le même nom que chaque onglet de mon ggsheet (sans le ".csv " bien entendu)

sur le script que tu m'as collé juste au dessus, il n' y a pas encore la ligne qui dit " l'emplacement " où aller chercher ces .csv, on est d'accord ? (un peu novice je dosi le reconnaitre)

il faut que ces fichiers soit sur le drive, dans n'importe quel dossier si leur nom est unique, sinon il faudra préciser le dossier, et donc effectivement, dans ce cas je n'ai pas à préciser le lieu (sous-entendu quelque part dans ton drive)

quand tu dis chaque onglet ... dans ce genre de script il ne faut pas qu'il y ait un écart sinon rien ne se passe (l'avantage d'un tel script est qu'il est réalisé rapidement en un seul bloc côté serveur mais sans retour possible avec l'utilisateur), je pense que pour tester, il faudrait remplacer fichier1 et fichier2 pour commencer par les noms de 2 onglets, j'ajouterai ensuite un complément pour lister automatiquement

il me semble qu'aujourd'hui, tous les onglets n'ont probablement pas de fichier csv avec leur nom, en tous cas il y en a plus que 20

[ '1️⃣ JBP 4.0',
  'DT RxLevel',
  'Monthly',
  'Daily',
  'Hourly',
  'WAR (mois)',
  'WAR (jours)',
  'WAR (heures)',
  'Reject (mois)',
  'Reject (jours)',
  'Reject (heures)',
  'Spilled (mois)',
  'Spilled (jours)',
  'Spilled (heures)',
  'MI (mois)',
  'MI (jours)',
  'MI (heures)',
  'DT RxPOCLevel',
  'MI costs for Rx',
  'Spilled costs for Rx',
  'Data Rx',
  'Metrics Hourly',
  'Customers',
  'OrdersMonthly',
  'OrdersDaily',
  'OrdersHourly',
  'Ratings',
  'Ratings&Comments',
  'Daily-OV',
  'Advert_ROI',
  'Roo Voices',
  'Marketer',
  'AOF',
  'Completion rate (rewards)',
  'Reedemers (rewards)',
  'OVxMarketer',
  'B10 costs',
  'BogofxOV',
  'Bogof (copy)',
  'Busy mode',
  'Comments&ratings' ]

mais on peut procéder autrement, mets les fichiers dans un dossier et on fera la liste à partir de ce dossier

Genial ça fonctionne je viens de faire le test avec 3 onglets du coup !!!

Seul bémol, si mon onglet que je dois importer est vide alors que le même précèdement importé au meme endroit était complet, le nouveau alors n'efface pas la data, dans un sesn logique il n'y a rien aucune data à remplacer mais serait ce possible d'inclure une dimension "laisser vide si nouvel import sans données" ?

Du coup je suis preneuse de ta liste automatique pour mes 36 autres onglets, sinon j'imagine que je peux le faire à la mano ?
En tout cas trop bien merci déjà pour ton aide précieuse

Seul bémol, si mon onglet que je dois importer est vide alors que le même précèdement importé au meme endroit était complet, le nouveau alors n'efface pas la data, dans un sesn logique il n'y a rien aucune data à remplacer mais serait ce possible d'inclure une dimension "laisser vide si nouvel import sans données" ?

j'ai pas trop pigé !! si tu pouvais me le redire

Du coup je suis preneuse de ta liste automatique pour mes 36 autres onglets, sinon j'imagine que je peux le faire à la mano ?

bien sûr, mais je vais même inclure des exceptions, car franchement je m'étonnerais que tu aies un fichier csv qui s'appelle 1️⃣ JBP 4.0.csv

liste auto:

au lieu de

const list = ["fichier1", "fichier2", "fichier3"];

tu mets

const list = mesOnglets();

avec cette fonction en gérant les exclusions

function mesOnglets() {
  const exclude = [`1️⃣ JBP 4.0`, `DT RxLevel`]
  return SpreadsheetApp.getActiveSpreadsheet()
    .getSheets()
    .map(sheet => sheet.getName())
    .filter(sheet => !exclude.includes(sheet))
}

coucou steelson !!

Tout fonctionne au top depuis une semaine merci bcp.

il me reste un petit souci à régler néanmoins, les fichiers peuvent parfois être "vide de données" suivant ce qui a été extrait de notre base.

Lorsque ceux ci s'intégrent dans la présentation, comme ils sont vide, au lieu d'écraser les anciennes données et mettre "rien" ils laissent le fichier comme il est c'est à dire que sur X onglets, la moitié d'entre eux vont etre ecrasés par les nouvelles données puisqu'il y avait de la data et l'autre moitié garde les anciennes données car les nouveaux fichiers devant s'y integrer étaient vides...

tu as un tips pour écraser les données meme si fichier vide et toutes les colonnes à zéro ?

mille merciiiis

Après

const list = mesOnglets();

ajoute

list.forEach(x => ss.getSheetByName(x).getDataRange().clearContent())

ce sera un peu plus long ...

Rechercher des sujets similaires à "import automatique csv google sheet"