[Script] Selectionner derniere cellule vide d'une colonne et Somme

Bonjour,

https://docs.google.com/spreadsheets/d/1jIu5_6kQQtAEhSHWEEuNf3MIbqn0xbf5t69IHhuaa9k/edit?usp=sharing

j'aimerais selectionner la derniere cellule vide de la colonne B et inscrire dans la cellule la somme des chiffres de la colonne B.

La colonne B peut avoir + ou - de lignes avec des chiffres.

Tout ca avec un script.

Merci

Jack

j'ai un debut mais apres pour la somme de toute la colonne je n y arrive pas.

function lastCell() {  
  var spreadsheet = SpreadsheetApp.getActive();  
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = workSheet.getLastRow();
  var columnToSearch = 1; //index of the column to search. 1 is 'A'.

  workSheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
  workSheet.getCurrentCell().offset(1, 0).activate();

  };

Je voudrais faire la somme de toutes les cellules de la colonne A et le placer a la cellule selectionner avec le script ci dessus.

actuellement j ai 7 cellules pleines dans la colonne A mais je peux en avoir + ou -

si quelqu un peut m aider

merci

un essai

function somme() {
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = workSheet.getLastRow();
  var columnToSearch = 'A'; 
  workSheet.getRange(columnToSearch+(lastRow+1)).setFormula(`=SUM(${columnToSearch}1:${columnToSearch}${lastRow})`)
};

Merci et pour la colonne B et ainsi de suite ...

ca ecrit tres loin en bas comme la fin de la colonne A.

Je voudrais faire la somme juste en cellule B9 soit la premiere cellule vide de la colonne B.

function somme() {
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = workSheet.getLastRow();
  var columnToSearch = 'B'; 
  workSheet.getRange(columnToSearch+(lastRow+1)).setFormula(`=SUM(${columnToSearch}1:${columnToSearch}${lastRow})`)
};

avec ce code ca ecrit vraiment loin en bas.

Bonjour,

si tu veux personnaliser la fin selon la colonne, remplace

var lastRow = workSheet.getLastRow();
var columnToSearch = 'B';

par (2 est ici la colonne B)

var columnToSearch = 'B';
var lastRow = workSheet.getLastDataRow(columnToSearch) ;

et ajoute

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();
  }  
};

... ce qui fait

function somme() {
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var columnToSearch = 'B'; 
  var lastRow = workSheet.getLastDataRow(columnToSearch);
  workSheet.getRange(columnToSearch+(lastRow+1)).setFormula(`=SUM(${columnToSearch}1:${columnToSearch}${lastRow})`)
};
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 viens d'essayer.

Ca ne marche pas la fonction somme.

EDIT:

Ca marche maintenant pour la colonne B. J essaye la colonne C

J'ai essaye sur plusieurs colonne c'est ok maintenant merci.

Regarde ce code je n'arrive pas a afficher la 1ere cellule vide de la colonne B.

function lastCell() {  
  //var spreadsheet = SpreadsheetApp.getActive();  
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = workSheet.getLastRow();
  var columnToSearch = 2; //index of the column to search. 1 is 'A'.

  workSheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
  workSheet.getCurrentCell().offset(1, 0).activate(); // shift one cell down to find a free cell

  };

Change ceci

var lastRow = workSheet.getLastRow()

en

var lastRow = workSheet.getLastDataRow('B')

avec le même additif s'il n'est pas déjà présent

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 voulais le faire d'un script lancer sur le drive.

function lastCell() {    
  var spreadsheet = SpreadsheetApp.openById(getFileId("C"));
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Feuille 1'), true);
  var lastRow = spreadsheet.getLastDataRow('B');
  var columnToSearch = 2;
  spreadsheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
  spreadsheet.getCurrentCell().offset(0, 0).activate();
};
  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();
  }  
};

Voici l'erreur

18:14:26    Avis    Exécution démarrée
18:14:26    Erreur    
Exception: The parameters (String,number) don't match the method signature for SpreadsheetApp.Spreadsheet.getRange.
lastCell    @ Code.gs:1144

C'est la ligne

spreadsheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
Comment je peux corriger cela stp

Jack

ben je ne comprends déjà pas cette première ligne

var spreadsheet = SpreadsheetApp.openById(getFileId("C"))

de toutes façons, pour débugger, n'hésite pas à mettre

Logger.log(lastRow)
Logger.log(columnToSearch)
spreadsheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();

est-ce que

columnToSearch

est numérique ?

Bonjour,

je voudrais en faite pouvoir ouvrir le fichier sheet C sans avoir mis le macro dans ce fichier. Le script est dans un fichier GS apart dans google drive.

cette ligne est censé ouvrir le fichier C et executer le script.

Jack

et tu as quelque part la fonction function getFileId ?

Il y a en fait confusion sur spreadsheet dans ton script. Ce n'est pas la feuille, mais le fichier

Il faut écrire non pas

  spreadsheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
  spreadsheet.getCurrentCell().offset(0, 0).activate();

mais

  spreadsheet.getSheetByName('Feuille 1').getRange(lastRow, columnToSearch).activateAsCurrentCell();
  spreadsheet.getSheetByName('Feuille 1').getCurrentCell().offset(0, 0).activate();

là tu n'auras pas avoir d'erreur !

Pour autant, tu ne verras rien car openById est une instruction pour le serveur, mais pour le terminal. C'est à dire que Google va bien ouvrir le fichier pour exécuter le script mais sans l'afficher.

Cela permet quand même d'exécuter ensuite d'autres instructions. Mais si tu t'attends à voir le fichier s'ouvrir, tu risques d'attendre longtemps. Donc il serait intéressant de connaître ton objectif.

function lastCell1() {    
  var workSheet = SpreadsheetApp.openById(getFileId("C"));
  var lastRow = workSheet.getLastDataRow('B');
  var columnToSearch = 2;

  workSheet.getSheetByName('Feuille 1').getRange(lastRow, columnToSearch).activateAsCurrentCell();
  workSheet.getSheetByName('Feuille 1').getCurrentCell().offset(0, 0).activate();

  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();
  }  
};

  };

Ce code est dans un fichier gs sur le drive mais ca ne marche pas. Je voudrais que ce script selectionne la derniere cellule pleine de la colonne B. ca ne marche pas pourquoi? rien ne s active mais le script tourne. Je laisse ouvert le fichier C mais le curseur de la selection ne bouge pas. Comment dois je faire?

Par contre ce code marche dans le fichier C en script:

function lastCell1() {    
  var workSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = workSheet.getLastDataRow('B')
  var columnToSearch = 2; //index of the column to search. 1 is 'A'.

  workSheet.getRange(lastRow, columnToSearch).activateAsCurrentCell();
  workSheet.getCurrentCell().offset(0, 0).activate(); // shift one cell down to find a free cell

  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();
  }  
};

  };

si tu as un script (que je peux lancer de drive en gs meme sans voir le fichier s ouvrir) pour selectionner la derniere cellule pleine d une colonne

C'est une autre version que ci-dessus ... je ne suis pas certain que le dernier }; soit au bon endroit

function lastCell1() {    
  var workSheet = SpreadsheetApp.openById(getFileId("C"));
  var lastRow = workSheet.getLastDataRow('B');
  var columnToSearch = 2;

  workSheet.getSheetByName('Feuille 1').getRange(lastRow, columnToSearch).activateAsCurrentCell();
  workSheet.getSheetByName('Feuille 1').getCurrentCell().offset(0, 0).activate();

  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();
  }  
};

  };

si tu as un script (que je peux lancer de drive en gs meme sans voir le fichier s ouvrir) pour selectionner la derniere cellule pleine d une colonne

AFAIK, cela ne fonctionnera jamais !

openByID ouvre le fichier pour le serveur, quand bien même ce dernier est aussi ouvert sur ton poste de travail, mais cela ne fera pas changer la sélection sur ton poste, le serveur est un opérateur virtuel qui n'a pas d'action physique de déplacement dans les feuilles et cellules

par contre, si tu fais

workSheet.getSheetByName('Feuille 1').getCurrentCell().offset(0, 1).setValue('coucou !')

tu verras apparaître coucou ! à la ligne suivante

la question est, pourquoi vouloir activer cette cellule ? on s'en passe généralement dans les scripts, sauf en ouverture de fichier, sinon cela ralentit les scripts

Je voudrais l'activer pour pouvoir coller cette cellule dans un autre fichier une fois selectionner.

Si tu sais comment faire?

1- pour te convaincre totalement du fait que l'activation n'est pas possible ou visible sur ton fichier ouvert :

Admettions que vous soyez à 2 sur le même fichier.

Si ton collègue change la cellule sur laquelle il travaille, tu verras cette cellule avec son nom dessus, mais cela ne changera pas la position de ton curserur et l'autre cellule sur laquelle tu es en train de travailler. Et heureusement !

Considère que le serveur avec openById travaille sur le fichier mais sans intervenir sur ta position.


2- ton objectif est plus clair, et c'est un cas de figure où justement activate n'est pas utile (voire est nuisible). Il suffit de faire

var donnee = workSheet.getSheetByName('Feuille 1').getRange(lastRow, columnToSearch).getValue()

et tu as la valeur

tu peux alors la recopier ailleurs en faisant

autreWorkSheet.getSheetByName('la feuille où copier').getRange(telleLigne, telleColone).setValue(donnee)
Rechercher des sujets similaires à "script selectionner derniere vide colonne somme"