Триггер события для перемещения строки на один из двух других листов на основе значений в 2 столбцах - PullRequest
0 голосов
/ 21 февраля 2020

Изображение электронной таблицы Я довольно новичок в скрипте Google Apps и мне нужна помощь.

У меня есть электронная таблица под названием «Пуск», в которой есть столбец «Получено» с флажком. Я могу переместить строку на другой лист, если флажок отредактирован, чтобы быть истинным, но мне нужно добавить еще одно условие.

Если столбец «Получено» отредактирован, чтобы быть истинным, а расположение - «Хранилище», я хочу переместить строку на лист Target1. Если столбец «Получено» отредактирован, чтобы иметь значение «истина», а «Местоположение - это область», я хочу переместить строку на лист «Цель 2».

Вот ссылка на мою тестовую таблицу: https://docs.google.com/spreadsheets/d/1exixeyE1ByMPnZ-gVf6i1vm_rKOcHb8Kj06_ubvhlQc/edit?usp=sharing

Вот мой скрипт:

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

Надеюсь, кто-нибудь есть решение! Спасибо заранее за вашу помощь.

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Попробуйте это:

Поскольку ваши действия связаны с изменением пользовательских данных, вы можете потребовать, чтобы это был устанавливаемый триггер, а если вы сделаете его устанавливаемым, измените его имя на другое, отличное от onEdit (), чтобы триггер не активирует его.

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);
    }
  } 
}
0 голосов
/ 24 февраля 2020

Это решение, которое сработало для меня:

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

    }
  }
}
0 голосов
/ 24 февраля 2020

Это, безусловно, достижимо, и вы идете правильным путем. Сборка из ответа @ Купера и использование устанавливаемого триггера onEdit() для запуска вашей функции myOnEdit(e).

Вот пример кода, который делает то, что вам нужно:

Пример:

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

    }
  }
}

Скрипт в действии:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...