Lier partie d'une ligne IMPORTRANGE a une autre partie de la meme ligne

Bonjour à tous,

J'ai un sheet avec une plage dans B4:O.

B4:I est un IMPORTRANGE (chaque ligne importée est un client), J4:J n'est rien et K4:O est une plage ou j'ajoute manuellement des commentaires concernant le client.

Mon problème est que si j'ajoute ou je supprime un client dans le fichier source de l'IMPORTRANGE, le contenu des lignes de la plage B4:I bougent et pas le contenu de K4:O. Du coup les commentaires ne correspondent pas au bon client.

Donc ma question est : est il possible de lier une partie d'une ligne remplie avec IMPORTRANGE a une autre partie de la meme ligne remplie manuellement?

De faire que le commentaire reste lier au bon client?

Ou alors faut il utiliser un script pour copier/coller le contenu B4:I plutôt que d'utiliser IMPORTRANGE?

Ou peut être une autre solution a laquelle je n'aurais pas pensé...

Bonjour Mozart75,

Je ne suis pas expert, mais si je comprends bien, seule la partie B4:I est "importé", et tu souhaiterais que les commentaires saisis en K4:O soient liés aux données importées.

À ma connaissance, ce n'est pas possible de cette façon. Toutefois, si tes commentaires étaient réalisés sur une table intermédiaire, avec par exemple en colonne A un ID unique permettant d'identifier tes clients, alors il me semble que tu pourrais relier ces commentaires à ton importrange via un RecherchV.

Aurais-tu un fichier exemple à partager ?

Bonjour Nylream,

Comme tu l'as dit, ce n'est pas possible et la solution avec RechercheV pourrait fonctionner mais c'était trop compliqué car en fait j'ai 5 Spreadsheets pour 5 sellers.

Du coup j'ai restructuré tous mes Spreadsheets et ce dont j'aurais besoin maintenant c'est 2 scripts qui auraient la fonction de copier/coller les lignes d'un onglet dans un autre.

Est ce que tu t'y connais en script?

Hello,

Est ce que tu t'y connais en script?

Je n'ai pas cette prétention, mais il se trouve que j'ai eu un besoin similaire récement.

function myfonction () {

var ss = SpreadsheetApp.getActiveSpreadsheet()
var source = ss.getSheetByName('ficher source')
var target = ss.getSheetByName('ficher target')

    target.getRange('target:range').setValues(source.getRange('source:range').getValues()); //remplace les target:range et source:range par les bons

Browser.msgBox(' copie effectué ')

}

Sans garantie, mais essaie ceci, le target étant la destination, la source étant ce que tu souhaites copier

Ton script est simple et bien mais j'aurais besoin de quelque chose d'un peu plus complexe..

C'est a dire que j'ai 3 onglets dans lesquels je remplis des commentaires, et je voudrais copier les commentaires de ces 3 onglets dans un seul autre qui est comme une base de données des commentaires.

Vu que les 4 onglets on le même format de colonne, donc commentaire de la colonne "L" par exemple dans "L" de l'onglet de base de données.

Et pour déterminer la ligne, ca ce ferait en fonction de la valeur dans la colonne "H" qui sont les même dans les 4 onglets.

Hello Mozart75

Si je comprends bien, tu souhaites recopier les commentaires situés en colonne L sur chacun des trois onglets, dans un quatrième onglet regroupant tous les commentaires.

Et pour déterminer la ligne, ca ce ferait en fonction de la valeur dans la colonne "H" qui sont les même dans les 4 onglets.

Ça par contre, je n'ai pas compris, pourrais-tu détailler ?

Dans un Spreadsheet, j'ai 3 onglets source dans lesquels je remplis des commentaires, et je voudrais copier les commentaires de ces 3 onglets dans un seul autre onglet qui est comme une base de données des commentaires (qui serait l'onglet target).

Les 4 onglets on le même format de colonne, donc commentaire de la colonne "L" dans la colonne "L" de l'onglet de base de données des commentaires. Les commentaires sont édités dans les plages L4:P.

Et pour déterminer la ligne, ca ce ferait en fonction de la valeur dans la colonne "H".. C'est a dire que les valeurs de H4:H des 3 onglets source sont toutes retranscrite dans H4:H de l'onglet de base de données des commentaires.

Ce qui serait souhaitable est de coller uniquement la cellule éditée a la bonne place dans l'onglet target en remplaçant le contenu si il y en a déjà un.

Dans mon sheet, les onglets source sont : "DATA", "EPHAD" et "LIVRET". Et l'onglet target est "COMMENTAIRES".

J'ai combiné plusieurs script que j'ai trouvé mais qui copy/colle une plage entière et pas cellule par cellulle. Mais je n'arrive pas a le faire fonctionner, je ne sais pas ce que je ne fais pas correctement.

Voici le script:

function onEdit(e) {
  if (
    SpreadsheetApp.getActiveSpreadsheet().getSheetName() == "DATA" &&
    e.range.columnStart == 12 &&
    e.range.columnEnd == 16 &&
    e.range.rowStart >= 4 &&
    e.range.rowEnd <= 5000
  ) {
    updateData();
  }

  if (SpreadsheetApp.getActiveSpreadsheet().getSheetName() == "EPHAD") {
    updateEphad();
  }

  if (SpreadsheetApp.getActiveSpreadsheet().getSheetName() == "LIVRET") {
    updateLivret();
  }
}

function updateData() {
  // get active spreadsheet
  var ss   = SpreadsheetApp.getActiveSpreadsheet();

  // get data from Sheet1
  var s    = ss.getSheetByName("DATA");
  var cel  = s.getRange("H4:H").getValues();
  var data = s.getRange("L4:P").getValues();

  // get to Sheet2 and get values from column 'B'
  var s    = ss.getSheetByName("COMMENTAIRES");
  var col  = s.getRange("H4:H").getValues();

  // find the row number in columnn B that contain the value
  var row  = col.flat().findIndex( c => c == cel ) + 1;

  // put the 'data' into the cells of this row
  if (row) s.getRange("L" + row + ":P" + row).setValues(data);
}

function updateEphad() {
  // get active spreadsheet
  var ss   = SpreadsheetApp.getActiveSpreadsheet();

  // get data from Sheet1
  var s    = ss.getSheetByName("EPHAD");
  var cel  = s.getRange("H4:H").getValues();
  var data = s.getRange("L4:P").getValues();

  // get to Sheet2 and get values from column 'B'
  var s    = ss.getSheetByName("COMMENTAIRES");
  var col  = s.getRange("H4:H").getValues();

  // find the row number in columnn B that contain the value
  var row  = col.flat().findIndex( c => c == cel ) + 1;

  // put the 'data' into the cells of this row
  if (row) s.getRange("L" + row + ":P" + row).setValues(data);
}

function updateLivret() {
  // get active spreadsheet
  var ss   = SpreadsheetApp.getActiveSpreadsheet();

  // get data from Sheet1
  var s    = ss.getSheetByName("LIVRET");
  var cel  = s.getRange("H4:H").getValues();
  var data = s.getRange("L4:P").getValues();

  // get to Sheet2 and get values from column 'B'
  var s    = ss.getSheetByName("COMMENTAIRES");
  var col  = s.getRange("H4:H").getValues();

  // find the row number in columnn B that contain the value
  var row  = col.flat().findIndex( c => c == cel ) + 1;

  // put the 'data' into the cells of this row
  if (row) s.getRange("L" + row + ":P" + row).setValues(data);
}
Hello Mozart75,
Je n'ai pas le niveau pour identifier le problème à la volée.
Pourrais-tu dupliquer les classeurs et supprimer/remplacer les données "sensibles" ?

Si je comprends bien, la
function onEdit(e)
permet d'identifier la feuille éditée et déclencher la macro correspondante

A vue de nez, je vois des "if" consécutifs dans le
oneEdit(e)
, mais il me semble que ce serait plutôt :
ifelse ifelse if

J'aurais aussi défini les variables.

Finalement le script est beaucoup plus simple que je l'avais imaginé... Le voici:

function onEdit(e) {
  var ss = e.source;
  var sourceSheet = ss.getActiveSheet();
  var shName = sourceSheet.getName();
  var range = e.range;
  var row = range.getRow();
  var col = range.getColumn();

  var destSheet = ss.getSheetByName("COMMENTAIRES");

  if ((shName == "DATA" || shName == "EPHAD" || shName == "LIVRET" )&& (row > 4 && col >= 12 || col <= 16)){
    var dataToCopy = range.getValue();
    var email = sourceSheet.getRange(row, 8).getValue();
    var destRow = destSheet.createTextFinder(email).findNext().getRow();
    destSheet.getRange(destRow,col).setValue(dataToCopy);
  }
}

Merci Nylream pour tes réponses, j'espère que ca te sera utile aussi.

Bonjour,

Je me permets de relancer votre conversation car j'ai un problème qui ressemble un peut au sujet de la discussion.

Dans mon cas, j'ai utilisé rechercherv pour lier les commentaires à mon importrange car je n'ai qu'un seul onglet, mais je ne parviens pas à lier la mise en forme (je surligne les commentaires d'une certaine couleur selon les données importée par importrange). Est-ce que vous savez si c'est possible de conserver la couleur via un script ?

Merci à vous !

Rechercher des sujets similaires à "lier partie ligne importrange meme"