Estoy tratando de encontrar la última columna en un rango, pero el problema es que no puedo especificar la secuencia de comandos para verificar solo dentro de una matriz en lugar de toda la hoja. Pude usar este fragmento de código para encontrar la última fila, pero tengo problemas para entender cómo se puede cambiar esto para encontrar la columna en lugar de la fila.
function findLastRow() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet1'); const data = sh.getRange("A:K").getValues(); const mR = sh.getMaxRows(); const indexes = []; data[0].forEach((_,ci)=>{ let col = data.map(d => d[ci]); let first_index = col.reverse().findIndex(r=>r!=''); if(first_index!=-1){ let max_row = mR - first_index; indexes.push(max_row); } }); last_row = indexes.length > 0 ? Math.max(...indexes) : 0; console.log(last_row); }¿Alguien puede explicarme cómo se podría cambiar un poco esta función para buscar la columna en lugar de la fila?
Descripción
Encontrar la última fila o columna que contiene datos de un rango se puede simplificar con el uso de Range.getNextDataCell().
Aquí hay una hoja de cálculo con celdas escasamente pobladas.
Código.gs
function test() { try { let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test"); let range = sheet.getRange("A1:D10"); let lastRow = range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); console.log("lastRow = "+lastRow); range = sheet.getRange("A1:E5"); lastColumn = range.getNextDataCell(SpreadsheetApp.Direction.NEXT).getColumn(); console.log("lastColumn = "+lastColumn); } catch(err) { console.log(err); } }Registro de ejecución
6:14:50 PM Notice Execution started 6:14:51 PM Info lastRow = 4 6:14:51 PM Info lastColumn = 4 6:14:51 PM Notice Execution completedReferencia
En su situación, ¿qué tal la siguiente modificación?
function findLasColumn() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet1'); const range = sh.getRange("A:K"); const offset = range.getColumn(); const maxColumn = Math.max(...range.getDisplayValues().map(r => r.reduceRight((n, c, i) => { if (!n && c) n = i; return n }, null))); const lastColumn = maxColumn + offset; console.log(lastColumn); }"A:K" , se devuelve el último número de columna."B:K" , el último número de columna se devuelve como el número de columna válido.También puede usar el método de transposición para poder obtener la última columna en su rango.
function findLastColumn() { const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('Sheet1'); const range = sh.getRange("C1:H18"); const data = transpose(range).map((values,index) => values[0].length ? index+range.getColumn() : null).filter(d => d); //The 'index+range.getColumn()' part returns the number of a non-empty col console.log(data[data.length-1]); } function transpose(range){ return range.getValues()[0].map((_, colIndex) => range.getValues().map(row => row[colIndex])); }findLastColumn()