Données générées par un script à coté d'autres données ! Impact ?

Bonjour !

J'ai un script qui génère des données sur les Colonnes A, B, C, D lorsque je l'active. Si j'ai des données sur les autres colonnes, le script décale la plage d'insertion des données qu'il génère.

Comme ceci

image

Une solution pour forcer le script a partir de la ligne 1 ? ( quelque soit les données existantes à partir de la colonne "E" et sans les effacer !)

( comme si ma feuille était séparé en deux de façon bien distinct au final )

Merci, j'espère que c'est plus clair

l'idée étant de pouvoir utiliser 2 script générant des données côte a côte, ou avoir d'autres tableau a coté etc....

je pense avoir résolu mon problème avec cette fonction piocher a droite et a gauche ( tri de la colonne facultative )

var output = [ ];

[....Mon script.....]

if (output.length > 0) {
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Feuille");
    try {
      sheet.getRange(2, 1, sheet.getLastRow(1000), sheet.getLastColumn(8)).clearContent();
    } catch (e) { }
    sheet.getRange(2, 1, output.length, output[0].length).setValues(output).sort({ column: 8, ascending: true })
  }

j'ai pu interagir avec 2 script différents sur une même feuille sans impact sur les lignes

Hey !

En faite je me rend compte que j'ai un gros problème de compréhension sur la structure même d'un script.

entre les

SpreadsheetApp.getActive().getSheetByName()

SpreadsheetApp.getActiveSpreadsheet().getRange()

etc...

plus les sheet.getRange( ), output.push([ ])

au final je me suis mélangé et perdu plus qu'autre chose !



Il n'y a donc rien de simple pour structurer correctement l'application d'un script dans une plage donnée que je pourrais appliquer a n'importe quel schéma ?

je veux rendre mais 4-5 scripts le plus propre possible et il faut absolument que je comprenne ce point et je trouve pas les explications sur le site google très qualitatives

J'utilisais ceci au début

pour les données

// le fichier complet
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
// une feuille du fichier, par nom ou active
  var feuille = classeur.getSheetByName('Chronomètre');
  var feuille = SpreadsheetApp.getActiveSheet();
// les cellules
  var cell = feuille.getActiveRange();
  var cell = feuille.getRange('A1:Z100');
// les valeurs
  var cell = feuille.getActiveRange().getValue();
  var cell = feuille.getRange('A1:Z100').getValues();

ensuite, dans les scripts, il y a des arrays, c'est autre chose, une sorte d'image miroir des données quipermettent une accélaration du code en évaitant des allers/retours avec la feuille

var data = []

Merci ! Donc le mieux pour déterminer une "zone" c'est de faire ces 3 étapes en faites :

var classeur = SpreadsheetApp.getActiveSpreadsheet();
var feuille = classeur.getSheetByName('Chronomètre');
var cell = feuille.getRange('A1:Z100');

et d'utiliser la référence "cell" pour les fonctions !

Pour alléger aussi l'écriture, tu peux adopter une "codification" de type

doc, doc1, doc2 pour les classeurs
f, f1, f2 pour les feuilles
c, c1, c2 pour les cellules
ensuite
d pour les dates ...
val pour les valeurs

comme j'interviens aussi pas mal en anglais, je déroge quand même à mes pratiques du début.

je vais essayer d'assainir mes feuilles merci

Bonjour,

par exemple ici je suis coincé sur un truc bete.

const id1 = ""
const id2 = ""
const f = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('test');

function compilCSV() {
  f.clear();
  SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);
  var dossierId = "";
  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 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(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || (i==0) || (i==1) ){ 
      result.push([csvData[i][0]], [csvData[i][1]], [csvData[i][7], csvData[i][8]]);
    }
  }

  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, 2, 1, 1).setValue(id);
    f.getRange(n, 3, 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]; }); });
}

j'ai 2 questions :

1) pourquoi utiliser cette ligne ici

SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);

alors que j'ai déjà ma feuille "f" en Constante en haut du script, une différence d'impact entre le setActiveSheet et getActiveSheet ?

2) une chose idiote qui me bloque.

var n = f.getLastRow()+1;

si je veux exécuter le script a partir de la colonne "B" et dès la 2ieme ligne, ce getLastRow m'embête en cas de présence de donnée sur la colonne "A" car ça tiens compte de ce que j'ai sur cette colonne et du coup je me retrouve en bas de mon sheet ^^

j'ai essayé de remplacer "f" par "f1" contenant f1.getRange('B2:K'); mais j'ai pas de retour positif.

3) et une dernière petite chose, est-ce que je peux englober ces fonctions dans une seul fonction ? je voudrais éviter les Constantes vu que je peux avoir parfois ces même données sur d'autres scripts

le but étant toujours de nettoyer au maximum mes scripts et facilement modulable si je veux les changer d'endroit !

Bonne soirée :)

1) pourquoi utiliser cette ligne ici

SpreadsheetApp.getActiveSpreadsheet().setActiveSheet(f);

alors que j'ai déjà ma feuille "f" en Constante en haut du script, une différence d'impact entre le setActiveSheet et getActiveSheet ?

2) une chose idiote qui me bloque.

var n = f.getLastRow()+1;

si je veux exécuter le script a partir de la colonne "B" et dès la 2ieme ligne, ce getLastRow m'embête en cas de présence de donnée sur la colonne "A" car ça tiens compte de ce que j'ai sur cette colonne et du coup je me retrouve en bas de mon sheet ^^

3) et une dernière petite chose, est-ce que je peux englober ces fonctions dans une seul fonction ? je voudrais éviter les Constantes vu que je peux avoir parfois ces même données sur d'autres scripts

1- enlève cette ligne, je pense en effet qu'elle est inutile

2- utilise cette fonction

function getLastDataRow(sheet,col) {
// col en lettre
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

de cette façon

var n = getLastDataRow(f,"B")+1;

3- clarifier, oui, mettre en commun des constantes oui, mais faire de trop longues fonctions me gêne souvent, je préfère rester souvent modulaire pour conserver une certaine lisibilité et réutiliser au passage certaines fonctions

Bonjour,

2- utilise cette fonction

En effet j'avais déjà essayé, mais comme résultat j'ai encore des curiosités..

le résultat est généré sur la dernière ligne de ma feuille sans raisons particulière

Voici ce que j'avais fait à la base :

const id1Soon = ""
const id2Soon = ""
const classeurSoon = SpreadsheetApp.getActiveSpreadsheet();
const feuilleSoon = classeurSoon.getSheetByName('Data');
const cellSoon = feuilleSoon.getRange('Z2:AI');

function compilCSV() {
  cellSoon.clear();
  var dossierId = "";
  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 lireCsvFromId(id) {
  var result = []
  var csv = DriveApp.getFileById(id).getBlob().getDataAsString();
  var csvData = Utilities.parseCsv(csv);
  var num1 = parseInt(id1Soon)
  var num2 = parseInt(id2Soon)
  for (var i = 0; i < csvData.length; i++) {
    if(parseInt(csvData[i][0])==num1 || parseInt(csvData[i][0])==num2 || (i==0) || (i==1) ){ 
      result.push([csvData[i][0]], [csvData[i][1]], [csvData[i][7], csvData[i][8]]);
    }
  }

  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 = getLastDataRow(feuilleSoon)+1
    feuilleSoon.getRange(n, 26, 1, 1).setValue(id);
    feuilleSoon.getRange(n, 27, 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]; }); });
}

function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("Z" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }
}
image

si jamais j'ai plusieurs résultat, ça écrase l'ancienne pour rester sur la dernière ligne de ma feuille je pensais pourtant avoir fait les choses bien

hum... je sais pas comment je me débrouille, je vais regarder ça, merci

Edit : erreur trouvée et tout fonctionne

Rechercher des sujets similaires à "donnees generees script cote impact"