He estado buscando a través de stackoverflow para obtener ayuda sobre cómo escribir en las hojas de Google una función que me permitiría eliminar celdas vacías en un rango y desplazarlas (hacia la izquierda) cuando se complete. Solo he visto preguntas sobre la eliminación de filas o columnas vacías en lugar de celdas en un rango.
Así es como se ven los datos con los que estoy tratando de trabajar:
Necesito eliminar las celdas A1-A15 y cambiar las otras columnas .
Lo que está funcionando actualmente es el siguiente código, sin embargo, eliminará/desplazará la columna incluso si hay datos en la columna (A) que estoy revisando la función (por ejemplo, datos en la celda A6).
Quiero asegurarme de que esta función no se active si hay datos en la columna A antes de la última y penúltima entrada de datos según el ejemplo. :
function blankRemoval(){ var sheet = SpreadsheetApp.getActive().getSheetByName('sheet1');//need to call sheet by name as I have multiple tabs var lastRow = sheet.getLastRow() var cellsBlank = sheet.getRange(1,1).isBlank(); if(cellsBlank) { sheet.getRange(1,1,lastRow-3,1).deleteCells(SpreadsheetApp.Dimension.COLUMNS); // shifts cells left }//end of if }//end of functionEntonces, con esto en mente, pensé que podría hacer que la variable cellBlank use .getRange(1,1,lastRow-3,1) también para que solo mire a través del rango hasta la última fila y se detenga 3 desde la última fila. Sin embargo, cuando uso este código, no elimina las celdas si hay datos en ellas o no (la función se ejecuta sin errores pero no ocurre nada).
He probado algunos elementos diferentes para usar en esto, pero me estoy topando con una pared porque no soy un programador competente. Mi conjetura es que necesita iterar, o estoy haciendo algo mal con el rango.
También tenga en cuenta que siempre habrá 2 entradas de datos en la columna A como mi ejemplo, con los datos separados por una celda. Esta es una especie de entrada para ayudar con la revisión histórica. Quiero conservar estas dos celdas donde están, pero cambiar los datos vacíos de arriba
Probablemente debería ser esto:
function blankRemoval(){ var sheet = SpreadsheetApp.getActive().getSheetByName('sheet1'); var col_A = sheet.getRange(1,1,sheet.getLastRow()-3,1); if (col_A.getValues().flat().filter(String).length == 0) { // <-- if the col A is empty col_A.deleteCells(SpreadsheetApp.Dimension.COLUMNS); } } .getValues() obtiene una matriz 2d con valores
.flat() convierte la matriz 2d en una matriz 1d
.filter(String) elimina de la matriz todas las celdas vacías
.length obtiene una longitud de la matriz
De esta manera, si el rango contiene celdas vacías, solo la matriz no tendrá elementos (array.length = 0)
Antes:
Después:
Actualizar
Resultó que algunas celdas de la columna 'A' podían contener espacios. Aquí hay una función modificada que elimina espacios del rango:
function blankRemoval(){ var sheet = SpreadsheetApp.getActive().getSheetByName('sheet1'); var col_A = sheet.getRange(1,1,sheet.getLastRow()-3,1); var contents = col_A.getValues().flat().join('').replace(/\s+/g,''); if (contents == '') col_A.deleteCells(SpreadsheetApp.Dimension.COLUMNS); }Esta parece ser la mejor función para usar en la pregunta que planteé gracias a @Yuri. ClearContent ayuda a eliminar cualquier entrada que impida que se lleve a cabo la acción deleteCells.
function blankRemoval(){ var sheet = SpreadsheetApp.getActive().getSheetByName('sheet1'); var col_A = sheet.getRange(1,1,sheet.getLastRow()-3,1); if (col_A.getValues().flat().filter(String).length == 0) { col_A.clearContent();} //<---checks if cell range is empty, and if so performs a clear content (this seemed to fix issues with any ghost entries) if (col_A.getValues().flat().filter(String).length == 0) { // <-- if the col A is empty col_A.deleteCells(SpreadsheetApp.Dimension.COLUMNS); } }