Additionner données .csv (Colonnes + Lignes)
Bonjour,
j'ouvre ce nouveau sujet en décortiquant mon problème.
J'utilise un script pour importer des données d'un .csv dont je dispose :
function importationCSV() {
var id = "1TVo6i4s3J5aAHzoCKCNSed9XSeJ-8tGa"
var id1= "0x00B591BC2b682a0B30dd72Bac9406BfA13e5d3cd"
var id2= "0x083fc10cE7e97CaFBaE0fE332a9c4384c5f54E45"
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv");
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(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || csvData[i][0]=='Investor'){
result.push(csvData[i]);
}
}
feuille.getRange(1, 1, result.length, result[0].length).setValues(result)
}Je vais mettre 2 photos pour montrer ce que je peux obtenir comme data.
https://docs.google.com/spreadsheets/d/1jSJEMH16orgopMxkgIUWrrntngJnpc89Ya-Wjw8V4gg/edit?usp=sharing
1]Comment puis-je additionner les 2 lignes contenants les adresses ?
la première colonne contenant "investor" et les adresses peut sauter si il faut, j'en ai pas besoins spécialement
2] Est-ce possible d'additionner également les colonnes qui ont le même nom ?
Dans mes tests j'avais supprimé les "- TOTAL" ; " - CLAIM" ; etc... pour avoir seulement le nom de la propriété. mais ensuite j'ai pas assumé le regroupement de colonnes, ce n'est pas dans mes compétences
Voici la liste des champs pouvant être supprimés :
"- TOTAL"
"- CLAIM"
"- DEPOSIT"
"- REINVEST"
"Pool - CLAIM"
"Pool - DEPOSIT"
"Pool - REINVEST"
"Rmm"Pour tout regrouper j'y arrive avec un Query simple mais version script "tout-en-un" c'est une autre paire de manches…. j'aimerai ne pas avoir 50 tableau sur mon spreadsheet !
Merci
Pour additionner je ne sais pas ce qui etait le mieux entre traiter les lignes ou les colonnes.
j'ai donc repris et adapté pour avoir un tableau et j'ai enlever les "en-têtes" également
à voir ce qui est le mieux
function lireCsvRentFromId(id) {
var id = "1CVmdrk5bhlbEytoZlAh6msILJWQHQ9Yn"
var id1Csv= "0x083fc10cE7e97CaFBaE0fE332a9c4384c5f54E45"
var id2Csv= "0x00B591BC2b682a0B30dd72Bac9406BfA13e5d3cd"
var feuilleCsv = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv");
var cellformat = feuilleCsv.getRange('A1:C')
var result = []
var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
var csvData = Utilities.parseCsv(csv);
var num1 = parseInt(id1Csv)
var num2 = parseInt(id2Csv)
for (var i = 0; i < csvData.length; i++) {
if(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || csvData[i][0]=='Investor'){
if (csvData[i][0]=='Investor'){
for (var ii=0;ii<csvData[i].length;ii++){
csvData[i][ii]=csvData[i][ii].replace(" - TOTAL","").replace(" - DEPOSIT","").replace(" - REINVEST","").replace(" Rmm","").replace("OLD-","")
}
}
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]!='' && result[i][j]!=0){
flag = true
}
}
if(flag){
newResult.push(result[i])
}
var final = newResult.slice(1)
}
feuilleCsv.getRange(1, 1, final.length, final[0].length).setValues(final)
cellformat.setNumberFormat('$0.000000')
}catch(e){
}
SpreadsheetApp.flush();
}
function transpose(a){
return Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
}
Bonjour,
j'ai trouvé un script que j'ai un peu adapté pour additionner les lignes !
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var input = ss.getSheetByName('Sheet1');
var output = ss.getSheetByName('Sheet2');
var inputValues = input.getDataRange().getValues();
Logger.log(inputValues)
for (var i = 1; i < inputValues.length; i++) {
var properties = inputValues[i][0];
var totalrents = [];
for (var j = 0; j < inputValues.length; j++) {
var rents = inputValues[j][1];
if (properties == inputValues[j][0]) {
totalrents.push(inputValues[j][1]);
}
}
var outputValues = output.getDataRange().getValues();
var newEntry = true;
for (var k = 0; k < outputValues.length; k++) {
if (properties == outputValues[k][0]) {
newEntry = false;
}
}
if (newEntry) {
output.appendRow([properties,totalrents.reduce(function(a, b) {return a + b})]);
}
}
}
Au tour de l'addition des 2 colonnes !
j'ai trouvé ceci :
function test() {
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("colonnes");
var rng = feuille.getRange("B1:C");
var val = rng.getValues();
for(row=0;row<val.length;row++) {
val[row][0] = val[row][0]+val[row][1];
val[row][1] ='';
}
rng.setValues(val)
}
Maintenant je pense qu'il me faudrait un petit coup de main pour intégrer tout ça dans un seul script pour faire tout ces étapes en 1x si possible
pourquoi veux-tu le faire avec un script ? en TCD c'est immédiat !
J'ai un nouveau .CSV a traiter toute les semaines, avec potentiellement des nouvelles données / données differentes
et l'objectif final c'est de pouvoir reporter ces données dans un tableau "sauvegarde" pour avoir un visuel en fin d'année sur ce que X m'a rapporté chaque semaines
Comme ceci par ex.
Sachant que chaque semaines je peux avoir des nouvelles propriétés qui s'insert entre celles existante.
j'en ai pas parlé ici pour pas tout mélanger et faire comme la dernière fois…
C'est pour ça que l'objectif de ce sujet c'était de synthétiser au maximum le .CSV à importer. j'aurais fait un autre sujet ensuite pour l'enregistrement de ces données..
Mais je suis ouvert a toutes suggestions en effet.
pour la somme des lignes sur plusieurs colonnes, j'utilise ceci
function test() {
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').getDataRange().getValues().slice(1)
var result = sum2DmultiCol(data)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(1,1,result.length,result[0].length).setValues(result)
}
function sum2DmultiCol(a) {
var s = [], m = new Map()
a.forEach(function (r) {
if (m.has(r[0])) {
var p = m.get(r[0])
r.forEach(function (v, c) { if (c > 0) { p[c - 1] += v } })
m.set(r[0], p)
}
else {
p = []
r.forEach(function (v, c) { if (c > 0) { p.push(v) } })
m.set(r[0], p)
}
})
m.forEach(function (w, k) {
p = []
p.push(k)
w.forEach(v => p.push(v))
s.push(p)
})
return s.sort()
}si tu veux que la valeur finale (somme par ligne) je regarde pour simplifier cela
pour la somme des lignes sur plusieurs colonnes, j'utilise ceci
Quelle différence avec celui que j'avais mis au dessus ? https://forum.excel-pratique.com/s/goto/1084755
si tu veux que la valeur finale (somme par ligne) je regarde pour simplifier cela
Avec les 2 scripts du dessus, j'ai réussi a additionner les 2 colonnes et additionner les lignes lorsque le nom est identique.
hier je n'ai pas vraiment eu le temps, mais je vais essayer d'assembler les 3 script = import csv + addition ligne + addition colonnes.
sinon je le ferais en plusieurs fois.
pour une somme lignes et colonnes
function test() {
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1')
.getDataRange()
.getValues().slice(1)
var array = []
data.forEach(r => {
var sum = 0
r.forEach((c, i) => {if (i > 0) { sum += c }})
array.push([r[0], sum])
})
var result = sum2D(array)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(1, 1, result.length, result[0].length).setValues(result)
}
function sum2D(a) {
var s = [], x = new Map()
a.forEach(function (r) {
if (x.has(r[0])) { x.set(r[0], (x.get(r[0]) + r[1])) }
else { x.set(r[0], r[1]) }
})
x.forEach(function (value, key) { s.push([key, value]) })
return s.sort()
}pour la somme des lignes sur plusieurs colonnes, j'utilise ceci
Quelle différence avec celui que j'avais mis au dessus ? https://forum.excel-pratique.com/s/goto/1084755
il n'y a pas de différences en soi, j'ai juste repris une routine que j'avais écrite de façon générique et que j'utilise dans ces cas là, j'utilise les fonctions sum2D et sum2DmultiCol écrites une fois pour toutes
Merci Pour le script 2 en 1
Je viens de l'essayer et j'ai 2 petites erreurs qui se glissent dans mon tableau.
( à première vu le reste semble ok , je ferais d'autres tests avec d'autres .csv ensuite )
Sur le tableau récap:
Et voici ce qu'il y a dans le tableau "brut"
si jamais je remets le liens du .sheet
https://docs.google.com/spreadsheets/d/1jSJEMH16orgopMxkgIUWrrntngJnpc89Ya-Wjw8V4gg/edit?usp=sharing
à un moment donné il considère que les valeurs ne sont pas numériques
j'ai réussi à régler 581-587 Jefferson
reste le second
c'est ok pour les 2, je force les données en numérique
ligne 13
r.forEach((c, i) => {if (i > 0) { sum = +sum + c*1 }})ligne 24
if (x.has(r[0])) { x.set(r[0], (+x.get(r[0]) + r[1]*1)) }au lieu d'additionner il juxtaposait les valeurs
Merci !
je clôture ce sujet, je vais maintenant voir pour l'enregistrement de tout ça semaines après semaines
de mon côté, je vais essayer de mettre dans une seule et même fonction les sommes horizontales et verticales ... cela va me décoincer les neurones !