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

ぃ、小莉子 提交于 2020-07-10 09:27:52

问题


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.


回答1:


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:




回答2:


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);
    }
  } 
}



回答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);

    }
  }
}


来源:https://stackoverflow.com/questions/60343049/event-trigger-to-move-row-to-one-of-two-other-sheets-based-on-values-in-2-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!