Détermination de la dernière ligne dans une seule colonne
J'ai une feuille avec des données en cols A
à travers H
.
Je dois déterminer la dernière ligne de la colonne A
qui contient des données (tout est contigu - pas de lacunes dans les données / lignes).
Il est également données dans les autres colonnes qui ont plus lignes de données de la colonne A
, donc j'ai besoin d'isoler uniquement la colonne A
. (Et/ou juste une plage dans col A
).
Je peux le faire au niveau de la feuille de calcul en utilisant
=COUNTA(A2:A100)
Cependant, dans tous mes la recherche D'une solution de Script Google Apps, tout ce que je semble trouver sont des exigences pour effectuer plusieurs fonctions englobant des dizaines de lignes de code - y compris beaucoup de choses i++
... Ce que je pourrais faire de manière moins complexe en compensant directement à partir de A1
.
Existe-t-il un moyen spécifique à la colonne de modifier cette méthode?
var aLast = ss.getDataRange().getNumRows();
Si un processus alambiqué est ce qui est requis, alors qu'il en soit ainsi. Mais je trouve ça difficile à imaginer (et encore plus difficile à trouver!) une simple solution.
Quelqu'un se soucie-t-il de m'éclairer (ou de faire éclater ma bulle)?
9 réponses
Que diriez-vous d'utiliser un truc JavaScript?
var Avals = ss.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;
J'ai emprunté cette idée à partir de cette réponse. Le Array.filter()
la méthode fonctionne sur le tableau Avals
, qui contient toutes les cellules de la colonne A. en filtrant sur le constructeur d'une fonction native, nous ne récupérons que des éléments non nuls.
Cela fonctionne pour une seule colonne seulement; si la plage contient plusieurs colonnes, alors le résultat de filter()
inclura des cellules de toutes les colonnes, et sera donc en dehors des dimensions peuplées de la gamme.
Bien qu'il n'y ait pas de formule directe, je peux y penser, il ne nécessite pas de dizaines de lignes de code pour trouver la dernière ligne de la colonne A. essayez cette fonction simple. Utilisez - le dans une cellule de la manière normale que vous utiliseriez une autre Fonction =CountColA()
function CountColA(){
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
for(var i = data.length-1 ; i >=0 ; i--){
if (data[i][0] != null && data[i][0] != ''){
return i+1 ;
}
}
}
, Vous pouvez le faire en allant dans le sens inverse. À partir de la dernière ligne dans la feuille de calcul et en remontant jusqu'à une certaine valeur. Cela fonctionnera dans tous les cas, même si vous avez des lignes vides entre les deux. Le Code ressemble ci-dessous:
var iLastRowWithData = lastValue('A');
function lastValue(column) {
var iLastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
var aValues = SpreadsheetApp.getActiveSheet().getRange(column + "2:" + column + lastRow).getValues();
for (; aValues[iLastRow - 1] == "" && iLastRow > 0; iLastRow--) {}
return iLastRow;
}
J'ai réécrit les fonctions getLastRow/getlastcolumn pour spécifier un index de ligne ou un index de colonne.
function get_used_rows(sheet, column_index){
for (var r = sheet.getLastRow(); r--; r > 0) {
if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(r, column_index).getValue() != ""){
return r;
break;
}
}
}
function get_used_cols(sheet, row_index){
for (var c = sheet.getLastColumn(); c--; c > 0) {
if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(row_index, c).getValue() != ""){
return c;
break;
}
}
}
Pour obtenir le nombre de colonnes ou l'index de la dernière colonne:
var numColumns = sheet.getLastColumn()
Pour obtenir le nombre de lignes ou l'index de la dernière ligne:
var numRows = sheet.getLastRow()
Où
var sheet = SpreadsheetApp.getActiveSheet()
Cela peut être une autre façon de contourner lastrow. Vous devrez peut-être jouer avec le code pour répondre à vos besoins
function fill() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('a1').activate();
var lsr = spreadsheet.getLastRow();
lsr=lsr+1;
lsr="A1:A"+lsr;
spreadsheet.getActiveRange().autoFill(spreadsheet.getRange(lsr), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
};
var Direction=SpreadsheetApp.Direction;
var aLast =ss.getRange("A"+(ss.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
Voici une autre façon de résoudre ce problème. Il utilise une boucle while
mais prend en compte les espaces vides entre les lignes.
function getLastRow (column) {
var iLastRow = ss.getActiveSheet().getMaxRows();
var aValues = ss.getActiveSheet().getRange(column + ":" + column).getValues();
var row = "";
while(row == ""){
row = aValues[iLastRow-1];
iLastRow--;
}
return iLastRow;
}
J'utilise getDataRange()
suivi de getNumRows()
. La première fonction
Renvoie une plage correspondant aux dimensions dans lesquelles les données sont présentes
Et la deuxième fonction
Renvoie le nombre de lignes dans cette plage.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var lastRow = ws.getDataRange().getNumRows();
P. S j'espère que cela fonctionne pour tous les cas.