[Script] Copier une valeur a la 1ere cellule vide d'une colonne

Bonjour,

voici mon code:

function copiermois() {
 var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('R');
 var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');      
 ss2.getRange(ss2.getLastDataRow('B')+1,2,34).setValues(ss1.getRange("F4").getValues());
}
Object.prototype.getLastDataRow = function(col){
  var lastRow = this.getLastRow();
  if (col == null){col='A'}
  var range = this.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }  
};

Je voudrais copier a la 1ere cellule vide de la colonne B, soit la cellule B12:

exemple

Voila l'erreur:

09:48:43    Erreur    
Exception: The number of rows in the data does not match the number of rows in the range. The data has 1 but the range has 34.
copiermois    @ Code.gs:208

Jack

je ne sais pas ce que tu veux faire, mais voici l'explication de l'erreur

ss2.getRange(ss2.getLastDataRow('B')+1,2,34).setValues(ss1.getRange("F4").getValues());

ici tu demandes de remplir 34 lignes

ss2.getRange( ss2.getLastDataRow('B')+1 , 2 , 34)
et ici tu n'as qu'une seule cellule
ss1.getRange("F4")

je voudrais copier la cellule F4 de la feuille R vers la feuille MOIS en 1ere cellule vide de la colonne B.

comment faire?

ss2.getRange(("B"+ss2.getLastDataRow('B')+1)).setValue(ss1.getRange("F4").getValue());
ligne

Ca copie a la ligne 351 je ne sais pas pourquoi?

voila le code:

function copiermois() {
 var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('R');
 var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');      
ss2.getRange(("B"+ss2.getLastDataRow('B')+1)).setValue(ss1.getRange("F4").getValue());
}
Object.prototype.getLastDataRow = function(col){
  var lastRow = this.getLastRow();
  if (col == null){col='A'}
  var range = this.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }  
};

il doit y avoir des cellules avec un espace, regarde la cellule B350

Je viens de regarder mais aucune cellule avec espace.

J'ai meme recopier des cellules vide a la place de la colonne B et les autres colonnes.

Tiens regarde:

https://docs.google.com/spreadsheets/d/1ag-jtd0EZaJLHS6I33_1FnS5YOEyRGjZ8hAorhJV49E/edit?usp=sharing

ok, j'ai compris, autant pour moi

ss2.getRange(("B"+(ss2.getLastDataRow('B')+1))).setValue(ss1.getRange("F4").getValue());

en fait, quand j'écris

"B"+ss2.getLastDataRow('B')+1
sachant que la dernière ligne est 35, il ajoute 1 ce qui fait 351 !! car comme il y a du texte devant il prend le + pour une concaténation
il fallait donc écrire
"B"+ ( ss2.getLastDataRow('B')+1 )


désolé

Ca copie maintenant a la cellule B36 toujours pas bon.

c'est laquelle ? la B2 ou la B12 ?

Je dois copier la cellule F4 de la feuille R vers la premiere cellule vide de la colonne B (en feuille MOIS).

SOIT EN CELLULE B12.

function copier() {
 var ss1 = SpreadsheetApp.openById(getFileId("A")).getSheetByName('R');
 var ss2 = SpreadsheetApp.openById(getFileId("A")).getSheetByName('MOIS');      
ss2.getRange("B3").getNextDataCell(SpreadsheetApp.Direction.DOWN).offset(1,0).setValue(ss1.getRange("F4").getValue());
}

Maintenant je voudrais copier les cellules E38:Q38 de la feuille MOIS vers la feuille B sur la ligne de mars 22 (qui est deja pleine).Ca va donc remplacer la ligne.

Et en debut de mois je voudrais copier toujours E38:Q38 sur la ligne en avr 22.

Il me faut donc deux scripts.

J'ai essaye sans reussir:

function copieb() {
 var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
 var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');      
ss2.getRange("E3:Q3").getNextDataCell(SpreadsheetApp.Direction.DOWN).offset(1,0).setValue(ss1.getRange("E38:Q38").getValue());
};

Ca ne copie que la1ere cellule soit E38 en E6.

b

Merci

Jack

D'abord il faut que tu ailles dans

et que tu règles la timezone

image

sinon tu risques de ne pas être positionné sur le bon mois

Pour y aller, il faut cliquer sur l'engrenageà gauche, activer ensuite la 3ème case à cocher, revenir dans les scripts en cliquant sur <>

sachant que les mois commencent ligne 3

function copieb() {
  var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
  var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');
  var ligne = (new Date()).getMonth() + 3
  ss2.getRange("E" + ligne + ":Q" + ligne).setValues(ss1.getRange("E38:Q38").getValues());
};

j'aurais quand bien aimé avoir une vue d'ensemble de toutes les fonctionnalités, car je pense qu'on aurait pu utiliser par exemple des TCD sans formules

Bonjour,

En réalité je voudrais copier coller les cellules E38:Q38 en fonction de la colonne et non pas de la date.

Comme pour le premier exemple avec une cellule mais là c'est avec plusieurs cellules.

- 1er script pour le mois en cours: copier coller les cellules à la dernière ligne pleine entre E3 et E14

- 2eme script pour début de mois: copier coller les cellules à la première ligne vide entre E3 et E14

comment faire les 2 scripts?

Merci

Jack

pas testé car je n'ai pas de fichier

// - 1er script pour le mois en cours: copier coller les cellules à la dernière ligne pleine entre E3 et E14

function cas1() {
  var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
  var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');
  if (ss2.getRange('E3').getValue = '') {
    ligne = 3
  } else {
    var ligne = ss2.getRange('E3').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1
  }
  ss2.getRange("E" + ligne + ":Q" + ligne).setValues(ss1.getRange("E38:Q38").getValues());
};

// - 2eme script pour début de mois: copier coller les cellules à la première ligne vide entre E3 et E14

function cas2() {
  var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
  var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');
  var ligne = ss2.getRange('E' + ss2.getLastRow()).getNextDataCell(SpreadsheetApp.Direction.UP).getRow()
  ss2.getRange("E" + ligne + ":Q" + ligne).setValues(ss1.getRange("E38:Q38").getValues());
};

Le cas 1 en rouge s'est copie a la mauvaise place. Il aurait du etre en ligne 5 et remplacer les données déjà présentes.

Le cas 2 en vert s'est copie a la mauvaise place aussi. Il aurait du etre en ligne 6.

Ca doit toujours etre entre E3 et E14 et ne jamais dépasser ces lignes quelque soit le cas.

Si par exemple je n'ai rien d'inscrit entre E3 et Q14, les cellules doivent se copier en ligne 3 alors que le script cas 1 se copie en ligne 17 quand tout est vide.

cas

Voici le fichier:

https://docs.google.com/spreadsheets/d/1ag-jtd0EZaJLHS6I33_1FnS5YOEyRGjZ8hAorhJV49E/edit?usp=sharing

ben voilà, c'est plus clair, en plus avec un fichier !

// - 1er script pour le mois en cours: copier coller les cellules à la dernière ligne pleine entre E3 et E14

function cas1() {
  var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
  var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');
  if (ss2.getRange('E3').getValue = '') {
    ligne = 3
  } else {
    var ligne = ss2.getRange('E3').getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow()
  }
  ss2.getRange("E" + ligne + ":Q" + ligne).setValues(ss1.getRange("E38:Q38").getValues());
};

// - 2eme script pour début de mois: copier coller les cellules à la première ligne vide entre E3 et E14

function cas2() {
  var ss1 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('MOIS');
  var ss2 = SpreadsheetApp.openById(getFileId("1")).getSheetByName('B');
  var ligne = ss2.getRange('E15').getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1
  ss2.getRange("E" + ligne + ":Q" + ligne).setValues(ss1.getRange("E38:Q38").getValues());
};
Rechercher des sujets similaires à "script copier valeur 1ere vide colonne"