user12939856
user12939856

Reputation: 3

Event trigger to move row to one of two other sheets based on values in 2 columns

Image of Spreadsheet I am fairly new to Google Apps Script and am needing some help.

I have a spreadsheet entitled "Start" that has a "Received" column with a checkbox. I am able to move the row to another sheet if the checkbox is edited to be true but I need to add one more condition.

If the Received column is edited to be true AND the Location is Store, I want to move the row to the Target1 sheet. If the Received column is edited to be true AND the Location is Area, I want to move the row to the Target2 sheet.

Here is a link to my test spreadsheet: https://docs.google.com/spreadsheets/d/1exixeyE1ByMPnZ-gVf6i1vm_rKOcHb8Kj06_ubvhlQc/edit?usp=sharing

Here is the script I have so far:

function onEdit(event) {
  // assumes source data in sheet named main
  // target sheet of move to named Completed
  // getColumn with check-boxes is currently set to colu 4 or D
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Start" && r.getColumn() == 4 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet1 = ss.getSheetByName("Target1");
    var targetSheet2 = ss.getSheetByName("Target2");
    var target1 = targetSheet1.getRange(targetSheet1.getLastRow() + 1, 1);
    var target2 = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);
    var locationStore = ss.getSheetByName("Start") && r.getColumn() == 3 && r.getValue() == "Store"; 
    var locationArea = ss.getSheetByName("Start") && r.getColumn() == 3 && r.getValue() == "Area"; 
    if (locationStore) {
    s.getRange(row, 1, 1, numColumns).moveTo(target1);
    s.deleteRow(row);
    } if (locationArea) {
    s.getRange(row, 1, 1, numColumns).moveTo(target2);
    s.deleteRow(row);
    }
  } 
}

Hope someone has a solution! Thank you in advance for your help.

Upvotes: 0

Views: 208

Answers (3)

user12939856
user12939856

Reputation: 3

This is the solution that worked for me:

function onEdit(e) {

  // Log the event
  console.log(JSON.stringify(e));

  // Get the event range
  var sh=e.range.getSheet();

  // Check if something received
  if(sh.getName()=="Start" && e.range.columnStart==4 && e.value=="TRUE") {

    // check if it was in the store
    if(sh.getRange(e.range.rowStart, 3).getValue() == "Store" ){

      // Display Toast
      e.source.toast('Something Received in store');

      // Get target row to move to in Target1 sheet
      var tsh=e.source.getSheetByName("Target1");
      var trg=tsh.getRange(tsh.getLastRow()+1,1);

      // Move row to target
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg);

      // Delete the row
      sh.deleteRow(e.range.rowStart);

    }

    // Check if it was in the area
    else if(sh.getRange(e.range.rowStart, 3).getValue() == "Area" ){

      // Display Toast
      e.source.toast('Something Received in area.\nMoving to Target1 sheet');

      // Get target row to move to in Target2 sheet
      var tsh=e.source.getSheetByName("Target2");
      var trg=tsh.getRange(tsh.getLastRow()+1,1);

      // Move row to target
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg);

      // Delete the row
      sh.deleteRow(e.range.rowStart);

    }
  }
}

Upvotes: 0

Aerials
Aerials

Reputation: 4419

This is certainly achievable and you are going the right way. Building from @Cooper's answer, and using an onEdit() installable trigger, to run your function myOnEdit(e).

Here is a sample code that does what you need:

Example:

function onMyEdit(e) {
  
  // Log the event
  console.log(JSON.stringify(e));
  
  // Get the event range
  var sh=e.range.getSheet();
  
  // Check if something received
  if(sh.getName()=="Start" && e.range.columnStart==4 && e.value=="TRUE") {
    
    // check if it was in the store
    if(sh.getRange(e.range.rowStart, 3).getValue() == "Store" ){
      
      // Display Toast
      e.source.toast('Something Received in store\nMoving to Target1 sheet'');
      
      // Get target row to move to in Target1 sheet
      var tsh=e.source.getSheetByName("Target1");
      var trg=tsh.getRange(tsh.getLastRow()+1,1);
      
      // Move row to target
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg);
      
      // Delete the row
      sh.deleteRow(e.range.rowStart);
      
    }
    
    // Check if it was in the area
    else if(sh.getRange(e.range.rowStart, 3).getValue() == "Area" ){
      
      // Display Toast
      e.source.toast('Something Received in area.\nMoving to Target2 sheet');
      
      // Get target row to move to in Target2 sheet
      var tsh=e.source.getSheetByName("Target2");
      var trg=tsh.getRange(tsh.getLastRow()+1,1);
      
      // Move row to target
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg);
      
      // Delete the row
      sh.deleteRow(e.range.rowStart);
      
    }
  }
}

Script in action:

enter image description here

Upvotes: 0

Cooper
Cooper

Reputation: 64032

Try this:

Since you're actions involve changing user data you may require that this be an installable trigger and if you do make it installable change it's name to something other than onEdit() so that simple trigger wont activate it.

function onMyEdit(e) {
  e.source.toast('Entry');
  var sh=e.range.getSheet();
  sh.getRange('A23').setValue(JSON.stringify(e));
  if(sh.getName()=="Sheet14" && e.range.columnStart==4 && e.value=="TRUE") {
    e.source.toast('Flag1');
    e.range.setValue('FALSE');
    var tsh1=e.source.getSheetByName("Target1");
    var tsh2=e.source.getSheetByName("Target2");
    var trg1=tsh1.getRange(tsh1.getLastRow()+1,1);
    var trg2=tsh2.getRange(tsh2.getLastRow()+1,1);
    if (e.range.offset(0,-1).getValue()=="Store") {
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg1);
      sh.deleteRow(e.range.rowStart);
    }else if (e.range.offset(0,-1).getValue()=="Area") {
      sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).moveTo(trg2);
      sh.deleteRow(e.range.rowStart);
    }
  } 
}

Upvotes: 1

Related Questions