Архивировать строки с разных листов и удалять их в исходное положение (на исходный лист), когда я хочу разархивировать (листы Google) - PullRequest
1 голос
/ 08 апреля 2020

У меня есть 4 листа в одной электронной таблице: 3 на сотрудника (Элиза, Мириам, Виктор) и 1 на архив (Архив). Когда проект завершен, каждый сотрудник может заархивировать всю строку - спасибо следующему сценарию - с помощью флажка (проверка данных). Эта строка удаляется на лист с именем «Архив».

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 column 2 or B
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "Elisa" && r.getColumn() == 2 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Archive");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  } else if(s.getName() == "Archive" && r.getColumn() == 2 && r.getValue() == false) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Elisa");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

Я сохранил этот сценарий, который работает в разделе «Архив - Elisa» в редакторе сценариев.

У меня возникли 2 проблемы , Сначала , я продублировал этот скрипт для других сотрудников и сохранил каждый скрипт в «Archive - NameEmployee» в редакторе скриптов. Когда я запускаю сценарии, это не работает для Мириам или Виктора: поэтому, если я поставлю флажок на листе Мириам или Виктора, строка не переместится в Архив. Это просто работает для Элизы. Второй , я в отчаянии, потому что не могу найти способ удалить строку из архива на его первоначальный лист. Я хотел бы, чтобы: когда Виктор снимает флажок с Архива, ряд возвращается к своему листу, а не к листам Мириам или Элизы.

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 08 апреля 2020

Первое: если вы хотите, чтобы один и тот же сценарий выполнялся для Мириам и Виктора, вам не нужно делать копии сценария.

Точнее, вам не следует делать это, потому что это приведет к с тремя onEdit функциями в одном проекте, что запрещено.

Кроме того, копирование сценария и сохранение его под именами других сотрудников не заставит его работать на них.

Вместо этого вам необходимо изменить сценарий.

строка

if(s.getName() == "Elisa" && r.getColumn() == 2 && r.getValue() == true) {

указывает, что строка должна быть заархивирована, только если имя листа - "Elisa". Чтобы заставить его работать для других сотрудников, измените его на:

if((s.getName() == "Elisa"||s.getName() == "Victor"||s.getName() == "Miriam" )&& r.getColumn() == 2 && r.getValue() == true) {

Секунда:

Строка var targetSheet = ss.getSheetByName("Elisa"); указывает, что лист, к которому должна быть строка отошла назад "Элиза".

Если вы хотите, чтобы он переместился на лист человека, который создал эту строку - эта строка должна содержать некоторую информацию о ее создателе. Есть ли у него? Если нет, вы должны внедрить дополнительный столбец во всех листах, в которых указан создатель.

Если имя создателя хранится в столбце S, вы можете изменить оператор else своего кода следующим образом:

else if(s.getName() == "Archive" && r.getColumn() == 2 && r.getValue() == false) {
    var row = r.getRow();
    var nameColumn = 19;
    var name = s.getRange(row, nameColumn).getValue();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName(name);
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }

По сути, вы извлекаете имя создателя строки с помощью

var name = s.getRange(row, nameColumn).getValue();

и затем передаете содержимое переменной в

var targetSheet = ss.getSheetByName(name); .

Таким образом, целевой лист будет устанавливаться динамически, в зависимости от строки.

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