Search code examples
google-apps-scriptgoogle-sheetsgoogle-apps-script-editor

Creating a post edit function


I currently use an onEdit function to assist in sorting a sheet. The sheet sorts when a value is entered into column A but I would prefer the sheet to sort after all values in columns A-F have been entered, due to my lack of coding knowledge I need help on this.

var SORT_COLUMN_INDEX = 2;
var ASCENDING = true;
var NUMBER_OF_HEADER_ROWS = 1;

var activeSheet;

function autoSort(sheet) {
  var range = sheet.getDataRange();

  if (NUMBER_OF_HEADER_ROWS > 0) {
    range = range.offset(NUMBER_OF_HEADER_ROWS, 0);
  }
  range.sort( {
    column: SORT_COLUMN_INDEX,
    ascending: ASCENDING
  } );
}
function onEdit(event) {
  var editedCell;
  activeSheet = SpreadsheetApp.getActiveSheet();
  editedCell = activeSheet.getActiveCell();
  if (editedCell.getColumn() == SORT_COLUMN_INDEX) {
    autoSort(activeSheet);
  }
}

function onOpen(event) {
  activeSheet = SpreadsheetApp.getActiveSheet();
  autoSort(activeSheet);
}

function onInstall(event) {
  onOpen(event);
}

Solution

  • You need two column indexes

    • a SORT_COLUMN_INDEX that specifies by which column the sheet shall be sorted and
    • a TRIGGER_COLUMN_INDEX that specifies after the edit of which column function autoSort shall be called.

    You can modify your code as following:

    var SORT_COLUMN_INDEX = 1;
    var TRIGGER_COLUMN_INDEX = 6;
    var ASCENDING = true;
    var NUMBER_OF_HEADER_ROWS = 1;
    
    var activeSheet;
    
    function autoSort(sheet) {
      var range = sheet.getDataRange();
    
      if (NUMBER_OF_HEADER_ROWS > 0) {
        range = range.offset(NUMBER_OF_HEADER_ROWS, 0);
      }
      range.sort( {
        column: SORT_COLUMN_INDEX,
        ascending: ASCENDING
      } );
    }
    function onEdit(event) {
      var editedCell;
      activeSheet = SpreadsheetApp.getActiveSheet();
      editedCell = activeSheet.getActiveCell();
      if (editedCell.getColumn() == TRIGGER_COLUMN_INDEX)  {
        Logger.log('column '+editedCell.getColumn()+' edited');
     autoSort(activeSheet);
      }
      else{
        Logger.log('other column edited');
      }
    }
    
    function onOpen(event) {
      activeSheet = SpreadsheetApp.getActiveSheet();
      autoSort(activeSheet);
    }
    
    //Sure that you need the following function?
    function onInstall(event) {
      onOpen(event);
    }