简体   繁体   中英

Delete all empty cells in a column then shift all non empty cells up

Here is my code:

var ct = 0;
var sheet = SpreadsheetApp.getActiveSheet();
var cell = sheet.getCurrentCell();
var cellcol = cell.getColumn();
var cellrow = cell.getRow()
var notate = cell.getA1Notation();
var temp, letter = '';
var solved = new Array()
var pend = new Array()
var cellcol1 = cellcol + 1;
var p;




function copycell1() {
  getFirstEmptyRowByColumnArray();
  cell.copyTo(sheet.getRange(ct,cellcol,1,1))
  cell.clearContent();
}

function getFirstEmptyRowByColumnArray() {
  columnToLetter(cellcol)
  var column = sheet.getRange(letter + ':' + letter);
  var values = column.getValues();
  while ( values[ct] && values[ct][0] !== "" ) {
    ct++;
  }
  ct++
}

function getFirstEmptyRowByColumnArray2() {
  columnToLetter(cellcol);
  var cellrow = cell.getRow();
  var column = sheet.getRange(letter + cellrow + ':' + letter);
  var values = column.getValues();
  while ( values[ct] && values[ct][0] !== "" ) {
    ct++;
  }
}


function columnToLetter(column)
{
  while (column > 0)
  {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

function totalSolved() {
  getFirstEmptyRowByColumnArray2()
  var compacolumn = sheet.getRange(letter + cellrow + ':' + letter + (ct+cellrow));
  var valuesSolved = compacolumn.getValues();
  solved = valuesSolved
}

function totalPending() {
  letter = '';
  ct = 0;
  cellcol = cellcol + 1;
  getFirstEmptyRowByColumnArray2()
  cellrow = cell.getRow();
  var compacolumn = sheet.getRange(letter + cellrow + ':' + letter + (ct + cellrow));
  var valuesPend = compacolumn.getValues();
  pend = valuesPend
}

function compa() {
  var i;
  var o;
  totalSolved();
  totalPending();
  for ( i = 0; i < pend.length; i++ ) {
    for (o = 0; o < solved.length; o++) {
      if (pend[i].toString() == solved[o].toString()) {
        sheet.getRange(i+cellrow,cellcol1).clearContent();
      } 
      else {
      }
    }
  }
  clearemp();
  clearemp();
  clearemp();
}


function clearemp() {
  lastRowForColumn(cellcol1)
  for (var i = 0; i < p; i++){
if((sheet.getRange(letter+(cellrow+i)).getValue()) == "")
     {
       Logger.log(sheet.getRange(letter+(cellrow+i)).getA1Notation());
       sheet.getRange(letter+(cellrow+i)).deleteCells(SpreadsheetApp.Dimension.ROWS);
     }

  }
}

function lastRowForColumn(column){
  var numRows = sheet.getLastRow();
  Logger.log("numRows is " + numRows)
  var data = sheet.getRange(1, column, numRows).getValues();
  Logger.log("data is " + data)
  Logger.log("data.length is " + data.length)
  for(p = data.length - 1 ; p >= 0 ; p--){
    if (data[p][0] != null && data[p][0] != ""){
      Logger.log ("p is " + p)
      return p + 1;
    }
  }
}





function test() {
  Logger.log("cellcol is " + cellcol1)
  lastRowForColumn(cellcol1)
  Logger.log("p is " + p)
}

The function I'm talking about is compa() .
The specific function that deletes the cells is clearemp() . But whenever I do it it is still not complete and I am at a loss on what to do

CONTEXT: I am working on comparing two lists and then removing the equal cells on the 2nd column and then shifting the cells up.

function delcels(col=1) {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getSheetByName('Sheet1');
  const rg=sh.getRange(1,col,sh.getLastRow());
  const c1=rg.getValues().filter((e)=>!(e===""));//thanks to iansedano
  rg.clearContent();
  sh.getRange(1,col,c1.length,1).setValues(c1);
}

A possible solution

There are a few approaches, but here is one, that is essentially the same as Cooper's, except that it doesn't clear values that are 0 . Only if the cell is empty, ie "" will it clear the cell.

/**
 * Clears empty cells in column
 * 
 * @param columnToClear - the column that should be cleared, defaults to 1
 * @param sheetName - the name of the sheet, defaults to "Sheet1"
 */
function clearBlanks(columnToClear = 1, sheetName = "Sheet1") {
  const file = SpreadsheetApp.getActive();
  const sheet = file.getSheetByName(sheetName);
  const range = sheet.getRange(1, columnToClear, sheet.getLastRow(), 1);

  const output = range.getValues().filter(e => !(e[0] === ""));

  range.clearContent();

  const outputRange = sheet.getRange(1, columnToClear, output.length, 1)
  outputRange.setValues(output)
}
  • This gets the whole range into memory as a 2D array.
  • Uses filter to take out any values that are strictly equal === to and empty string. So it will not clear 0 values.
  • Clears the whole column, and pastes in the filtered array.

Filter

This is called on an array

array.filter(function)

You need to pass in a function that will return either a True or False value. The filter will go through each element and if it gets False then it will remove that element. In the example above, its passed in as an arrow function. When its an arrow function, if its on one line, you don't need to include the return statement.

There are a few useful functions that are like this. For example, forEach and map that can be very useful for the types of operation you are doing.

Reference

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM