Enregistrement de données hébdomadaire
Invité
Bonjour à tous,
Suite de mon sujet concernant la partie "enregistrement"
Rappel :
je dispose de nouvelles données au format .csv chaque semaines.
Voici le script que j'utilise, pour le moment, pour extraire les plages qui m'intéresse :
function lireCsvRentFromId(id) {
var id = "ID CSV"
var id1Csv= "Adresse 1"
var id2Csv= "Adresse 2"
var feuilleCsv = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("csv");
var cellReset = feuilleCsv.getRange('A:C')
var cellformat = feuilleCsv.getRange('B1:C')
var result = []
var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
var csvData = Utilities.parseCsv(csv);
var num1 = parseInt(id1Csv)
var num2 = parseInt(id2Csv)
cellReset.clear();
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(" - X","").replace(" - X","").replace(" - X","").replace(" Rmm","").replace("X-","")
}
}
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]; }); });
}
Ensuite je fais un peu de nettoyage sur le CSV pour additionner les lignes et colonnes avec ce script :
function tri() {
var feuille = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('csv');
var lastRow = feuille.getLastRow();
var cellformat = feuille.getRange('F:F')
var cellReset = feuille.getRange('E:F')
var plage = feuille.getRange('A1:C' + lastRow).getValues().slice(0);
var array = []
cellReset.clear();
plage.forEach(r => {
var sum = 0
r.forEach((c, i) => {if (i > 0) { sum = +sum + c*1 }})
array.push([r[0], sum])
})
var result = sum2D(array)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('csv').getRange(1, 5, result.length, result[0].length).setValues(result)
cellformat.setNumberFormat('$0.000000')
}
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]*1)) }
else { x.set(r[0], r[1]) }
})
x.forEach(function (value, key) { s.push([key, value]) })
return s.sort()
}
Maintenant j'aimerai pouvoir conserver ces données sur un tableau qui serait alimenté chaque semaines.
==> ça se passe toujours ici https://docs.google.com/spreadsheets/d/1jSJEMH16orgopMxkgIUWrrntngJnpc89Ya-Wjw8V4gg/edit?usp=sharing
merci
Invité
Invité
Voici une aide extérieur obtenue à ce sujet.
function test(){
const s = SpreadsheetApp.getActiveSheet(); //<<< sheet with BOTH CSV table and archive table must be active when the script is run
const data = s.getDataRange().getValues();
data.shift();
const csvData = data.map(x => x.slice(4,6)); // <<< CSV data in Columns E & F
let lblData = data.map(x => x[7]); // <<< archive labels are in H
if (lblData[0]==null) lblData = data.slice(0,5).map(x => x[4]);
while (lblData[lblData.length-1]=='') lblData.pop();
let newCol = data[0].length+1;
if (newCol<9) newCol=9;
let outData = [];
let outMap = {};
for (let i in [1,2,3,4,5]) outData.push(csvData.shift()[1]);
for (i in csvData) outMap[csvData[i][0]] = csvData[i][1]; // <<< all current names and values
for (i=5; i<lblData.length; i++) {
if (outMap[lblData[i]==null]) outData.push("");
else {
outData.push(outMap[lblData[i]]);
delete outMap[lblData[i]];
}
}
for (i in outMap) {
lblData.push(i);
outData.push(outMap[i]);
}
s.getRange(2, 8, lblData.length).setValues(lblData.map(x => [x])); // <<< Note
s.getRange(2, newCol, outData.length).setValues(outData.map(x => [x]));
}je laisse ici pour clôturer ce sujet ( même si je vais essayer de comprendre ce script qui est complexe x10000 pour moi )
