Connection avec Drive et importation "auto" ?

Oh ! génial ! il faut que vois comment l'intégrer sur mon Spreadsheet, et je crois que j'ai plus rien a ajouter, c'est parfait .

je regarderai la structure de ton doc exactement pour importer le script sur mon doc perso.

merci encore

je peux juste importer le script ou il faut que je rajoute des pages nommées comme celles de ton doc et paramétrer le script en conséquence ?

EDIT : je vais garder le fichier tels quel je pense, pour ne pas alourdir le mienne, et la vérification sera plus simple entre les données des Valeurs.

je clôture ce sujet avec encore une fois un grand remerciement !

même si je maintiens que je doit m'informer sur la structure du script pour comprendre moi-même :D

Un conseil, que j'applique depuis 6 mois où je me suis mis sérieusement à GSheets : crée une base de fonctions, et crée aussi une base de scripts juste en y mettant des instructions élémentaires ... voici le début de ma base qui me sert aujourd'hui

basiques
--------
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = SpreadsheetApp.getActiveSheet();
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getSheetByName('Chronomètre');
  var r = feuille.getActiveRange();
  var factive = fsource.getName().toString();
  var fparnom = doc.getSheetByName('trucmuche');
  Browser.msgBox('message !');
  var cel = feuille.getRange('A1');
  var x = cel.getRow();
  var y = cel.getColumn();
  var plage = feuille.getRange('A' + x + ':Z' + x);
  var ceci = feuille.getRange('A1').getValue();
  feuille.getRange('A1').setValue(ceci);
  feuille.getRangeList(adresses).clearContent();
  var d = Utilities.formatDate(new Date(), "GMT+1", "EEE dd/MM/yyyy HH:mm") // H24
  var d = Utilities.formatDate(new Date(), "GMT+1", "EEE dd/MM/yyyy hh:mm a") // AM/PM
  var d = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MMM dd yyyy hh:mm a");
  var file = DriveApp.getFilesByName("monFichier.extension").next();

texte littéral avec accent grave et ${}
--------------
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
backtick (` `) (grave accent) character instead of double or single quotes
respecte les ' et " et inclus les retours à la ligne
  var texte = `${f.getRange('B' + ligne).getValue()} et ${f.getRange('C' + ligne).getValue()} passeront le ${f.getRange('D' + ligne).getDisplayValue()} au l'école "${f.getRange('K' + ligne).getValue()}"`

  var texte = `${f.getRange('B' + ligne).getValue()} 
et ${f.getRange('C' + ligne).getValue()} 
passeront le ${f.getRange('D' + ligne).getDisplayValue()} 
à l'école "${f.getRange('K' + ligne).getValue()}"`

message 
-------
function toast(body, title, timeout) {
  return SpreadsheetApp.getActive().toast(
    body,
    title || "information",
    timeout || 10 // In seconds
  );
}

confirmation
------------
  if (Browser.msgBox('Confirmation', 'Etes-vous sûr ?', Browser.Buttons.YES_NO) == 'yes'){}

remise à false des cases à cocher
---------------------------------
  var der = liste.getLastRow()
  var raz=[]
  for (var i=2; i<=der;i++){raz.push([false])}
  liste.getRange('A3:A'+der).setValues(raz)

appel fonction
--------------
  envoiCopieFeuillePDF();

ajouter en fin de feuille
-------------------------
  feuille.appendRow([val1,val2,val3]);

selection plage
---------------
function selectPlage() { // de 5 à 15 de la colonne active
  var f = SpreadsheetApp.getActive();
  var c = columnToLetter(f.getCurrentCell().getColumn());
  f.getRange(c + '5:' + c + '15').activate();
};

  var adresses = ["E7","H7","E10","H10","E13","H13","E16"];
  feuille.getRangeList(adresses).clearContent();

  var selection = f.getSelection();
  var r = f.getActiveRange();
  var cellules = selection.getActiveRangeList().getRanges();
  var donnees = (JSON.stringify(cellules[0].getValues()));
  var tableau = JSON.parse(donnees);
  var nblignes = tableau.length

nombre de colonnes
------------------
function nbColonnes(plage){
  if (typeof plage == 'object'){
    return plage[0].length
  }
  else{
    return ('Il n\'y a priori qu\'une seule cellule !');
  }
}

etc. etc. etc.

ce n'est qu'un petit extrait (5% ? 10% ?), je ne dis pas de recopier cet extrait, mais cette méthode me permet maintenant d'être plus efficace.

Est-ce que la lourdeur d'un document peut provoquer un échec du script ? il y a certains documents sur lesquels je ne ressorts aucunes données alors qu'elles sont existantes.

( j'ai rajouté un ex. sur ton fichier partagé )

Je le crains en effet après quelques investigations.

Un import direct a emplafonné le nombre de cellules autorisé

Ensuite, j'ai supprimé le test avec les 2 identifiants, cela m'a donné un big résultat où il avait en effet l'un des 2 critères.

Bref, comme je disais ...

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

et ce serait un autre sujet d'une autre dimension mais pas si complexe que cela pour quelqu'un qui connaît bien mysql et possède un petit serveur lamp car on y importe facilement des fichiers csv.

edit : je vais faire quelques investigations pour savoir si on d'abord récupérer les données sans inverser en colonnes dans ces cas là. Ensuite on pourra enchaîner sur une transposition.

La transposition c'est du confort visuel.

A choisir entre traiter les données et améliorer le visuel, le choix est vite fait 😉

EDIT : question, si on récupère seulement quelques éléments ça permettrait de tout traiter ? =

*Investor

*Due Rent - TOTAL

*Due Rent - CLAIM

*Due Rent - REINVEST

*Corrections - TOTAL

*Corrections- CLAIM

*Corrections - REINVEST

ça représente la somme de toute les colonnes, donc ça pourrait être moins lourds en récupérant que ça

et vu le peu d'information, une transposition ne serait plus nécessaire

et comme ça, je pourrais faire une vérification manuel plus en détails sur je vois que les montants ne correspondent pas Grâce à l'ID du doc

Voici avec les totaux (tous)

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('Lire les totaux d\'un fichier csv', 'synthCSV')
    .addItem('Compiler les fichiers csv d\'un dossier', 'compilCSV')
    .addToUi();
}

function compilCSV() {
  f.clear();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);
  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();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);
  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])}
    }
    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();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(feuille);
  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 synthCSV(){
  var synth = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('synth');
  synth.clear();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(synth);
  var fichierId = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('fichier').getValue();
  var result = []
  var csv = DriveApp.getFileById(fichierId).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  for (var i = 0; i < csvData.length; i++) {
    if(csvData[i][0]=='total' || csvData[i][0]=='Investor'){
      result.push(csvData[i]);
    }
  }
  var n = 1;
  synth.getRange(n, 1, 1, 1).setValue(fichierId);
  synth.getRange(n+1, 2, result[0].length, result.length).setValues(transpose(result))
}

function transpose(a){
  return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}

Voici avec les totaux (tous)

je suis désolé si nous nous sommes pas compris. l'idée aurait été de faire une sélection "restreinte" a quelques éléments plutôt que de récupérer toute la ligne.

capture

Après si cela n'est pas possible car trop lourd comme dit plus haut, pas de problème, cette réalisation est déjà top

Au plaisir

Non, c'était une première étape ... mais in fine je me demandais si ce n'était pas mieux, suffirait ensuite de faire un query pour ne récupérer que ce qui peut être intéressant.

Mais j'ai un doute sur le fichier !!! ma présentation finale était celle-ci dans l'onglet synth.

capture d ecran 696

Non, c'était une première étape ...

j'ai répondu trop vite alors 😁

Mais bon, sans vouloir trop compliquer le script, il suffit de prendre les premières lignes !

Mais bon, sans vouloir trop compliquer le script, il suffit de prendre les premières lignes !

c'est l'intérêt de récupérer le total correspondant aux en-têtes qui laisse perplexe c'était juste pour un test ? ou il y a un réel intérêt ?

je suis perdu du coup sur les possibilités

tu es perdu ? alors tu n'es pas le seul peut-être

ce que j'ai traité dans la synth, c'est ceci ...

question, si on récupère seulement quelques éléments ça permettrait de tout traiter ? =

*Investor

*Due Rent - TOTAL

*Due Rent - CLAIM

*Due Rent - REINVEST

*Corrections - TOTAL

*Corrections- CLAIM

*Corrections - REINVEST

ça représente la somme de toute les colonnes, donc ça pourrait être moins lourds en récupérant que ça

tu es perdu ? alors tu n'es pas le seul peut-être

Effectivement, nous avons eu un soucis de compréhension, je pense.

l'intérêt principal de ce sujet était de pouvoir ciblé des informations précises concernant 1 ou 2 adresses parmi un multitude d'adresse.

Chose que tu as parfaitement réalisé avec ton script précèdent (et je te remercie encore ). Hors lorsqu'un fichier est trop lourd, nous avons un problème d'extraction de données.

J'ai donc émis l'hypothèse de rétrécir la fenêtre de recherche en ce concentrant seulement sur ces 8 éléments ( EDIT :qui correspondent aux 8 premières colonnes )

( Si c'est possible et si c'est crédible comme proposition )

*Investor

*Due Rent - TOTAL

*Due Rent - CLAIM

*Due Rent - DEPOSIT

*Due Rent - REINVEST

*Corrections- CLAIM

*Corrections - DEPOSIT

*Corrections - REINVEST

mais toujours en conservant le ciblage à l'origine de ce sujet ( donc 1 ou 2 adresses précises )

J'espère que j'ai été plus clair et je m'excuse pour ce malentendu

en faite, je ne sais pas si la lourdeur du fichier à un impact sur les colonnes, les lignes, ou globalement concernant ton script

afin d'obtenir ceci ( Transposer ou non, vu la taille ça restera lisible )

capture capture

In fine, après des heures de bataille, ce n'est pas une question de taille de fichier; du reste, je trouvais très bien dans la version précédente Investor au début du fichier et total à la fin avec toutes les données. Le problème est la comparaison de ce qui se trouve sur le fichier et les valeurs données en référence. Or il se trouve que leur structure suggère fortement qu'il s'agit du nombres hexadécimaux (pas étonnant quand il s'agit de token), qui plus est très long (s'agit-il de token eth ?). Je cherche différents moyens pour y remédier ... mais cela va prendre du temps !

Je me suis fait un fichier csv réduit sans changer les valeurs des 0xabcdef...

  1. impossibilité de capter les lignes par le test d'égalité, le problème est bien sur ces données 0xabcdef https://stackoverflow.com/questions/2670639/why-are-hexadecimal-numbers-prefixed-with-0x
  2. j'ai tenté de convertir de l'hexa en décimal mais impossible la longueur est trop importante (40 caractères au lieu de 10) => il faudra développer une fonction spécifique

Bonjour,

donc c'est liée au trop grand nombre d'adresse et leurs caractères ?

( effectivement ce sont des adresses de wallet ETH )

pourtant avec un CTRL+G ça trouve rapidement ^^

et en faisant une recherche "texte" pour renvoyer un numéro de ligne. Puis récupérer les infos de cette ligne ? ( ça a l'air si simple dit comme ça )

car un =RECHERCHEV ne semble pas trop "ramer" pour trouver un adresse de ce type par ex.

Avec excel a priori, pas de problème. Mais GSheets doit faire preuve d'une intelligence hors norme pour les interpréter comme valeurs hexadécimales. Je n'ai pas encore rendu les armes ... une possibilité est de découper en 4 fois 10 caractères, transformer en décimale etc. on verra ce que cela donne.

Si la solution est la, je pourrais envisager un retour sur Excel pour ça

Ce qui reste étonnant, c'est que quelque soit le choix de formule ( EQUIV, RECHERCHEV par ex. ) j'ai un retour Quasi-instantané.

c'est donc au moment de "l'importation" via le script que cela pose problème ?

En contournant le problème ( c'est une idée hein ^^ )

Admettons que je réalise ces actions seulement avec l'ID d'un document a la fois au lieu d'un dossier complet

>>on récupère les 8 premières colonnes sur une feuille,

>>>>et sur une autre feuille on cible la recherche ?

Hé bien voilà, il fallait bien passer par une interprétation du critère en hexa en le transformant en numérique !

const id1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('B6').getValues()
const id2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('param').getRange('C6').getValues()
const f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('csv');

function lireCSV(){
  f.clear();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);
  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);
  var num1 = parseInt(id1)
  var num2 = parseInt(id2)
  for (var i = 0; i < csvData.length; i++) {
    //if(idX.indexOf(csvData[i][0])!=-1 || csvData[i][0]=='Investor'){
    if(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || 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])}
    }
    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 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"