Перемещение одной строки в другую в зависимости от значения

Я пытаюсь переместить данные с одной вкладки Google Sheet на другую на основе значения одной ячейки (ячейки триггера). Ячейка «триггер» - это количество дней до срока выполнения конкретной задачи. Это значение находится с помощью простого кода для подсчета разницы в днях.

У меня проблемы с запуском кода. У меня есть другой лист, который делает похожую вещь и использует тот же код, и, похоже, он работает нормально. Может ли кто-нибудь взглянуть свежим взглядом, чтобы увидеть, какую глупость я сделал сейчас? Я попытался переписать его, но проблема не исчезла.

Я переписал код, скопировал и вставил из Интернета, прочитал построчно, просто не могу найти проблему.

function moveToDue() {

  var UpToDate = "Up To Date";
  var Due = "Due";
  var triggerDue = "21";
  var triggerCol = 26;

  var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
  var ss = SpreadsheetApp.openByUrl(url);
  var sheet = ss.getSheetByName(UpToDate);
  var range = sheet.getActiveCell();

//Move to Due

  if (sheet.getName() == UpToDate && range.getColumn() == triggerCol && range.getValue() == triggerDue) {

    var targetSheet = ss.getSheetByName(Due);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
      }
}

UpToData и Due - разные заголовки вкладок.

triggerDue - это количество дней до установленной даты, которую необходимо активировать для перемещения (в данном случае 21).

triggerCol - это столбец, в котором находится значение триггера.

Копия листа: https://docs.google.com/spreadsheets/d/1-shzMIIlj247YFWY4Cc1bh6gW895lQWsjvc5gTi-fto/edit?usp=sharing


person Dakota McCarty    schedule 20.10.2019    source источник
comment
Когда вы говорите, что у вас проблемы, в чем проблема на самом деле? Кроме того, какая ячейка является триггерной? Это когда-нибудь изменится?   -  person Rafa Guillermo    schedule 21.10.2019
comment
Это просто не работает. Строки не перемещаются. Ячейка триггера находится в столбце Z. Это формула = РАЗНДАТ для подсчета дней между сегодняшним днем ​​и датой окончания конкретной программы. По истечении 21 дня строка с информацией о программе должна быть перемещена из раздела «Текущая дата» в «Срок выполнения». Итак, когда ячейка в столбце Z имеет значение 21, строку следует переместить.   -  person Dakota McCarty    schedule 21.10.2019
comment
Можно ли вообще удалить все личные / конфиденциальные данные и поделиться своим листом?   -  person Rafa Guillermo    schedule 21.10.2019
comment
Конечно: docsheets/docs.google.com/docsheets/docs.google.com/docsheets/ /   -  person Dakota McCarty    schedule 21.10.2019
comment
Огромное спасибо. В каком событии вы хотите, чтобы эта функция запускалась?   -  person Rafa Guillermo    schedule 21.10.2019
comment
Это будет мероприятие по расписанию, которое проводится дважды в день. И спасибо! Я очень ценю, что вы нашли дополнительное время, чтобы взглянуть на лист. Приносим извинения за неудобства.   -  person Dakota McCarty    schedule 21.10.2019
comment
Все заработало! Я обновлю свой ответ сейчас, чтобы отразить изменения.   -  person Rafa Guillermo    schedule 22.10.2019


Ответы (2)


Отвечать:

Есть несколько проблем с кодом, включая неправильное использование .getActiveCell() и некоторой логики if и for.

Исправления кода:

В вашем коде также есть несколько вещей, которые вы можете очистить - вам не нужно делать проверку if (sheet.getName() == UpToDate), поскольку вы установили эти две строки раньше на var sheet = ss.getSheetByName(UpToDate);, ничего не меняя.

Я переписал многие функции, чтобы они работали более эффективно. Кроме того, .deleteRow(), похоже, не всегда работает, если запускается вместе с moveTo() в цикле, поэтому я добавил функцию для очистки строк после этого.

Код:

function moveToDue() {
  var triggerDue = 21;
  var triggerCol = 26;
  var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
  var ss = SpreadsheetApp.openByUrl(url);
  var upToDate = ss.getSheetByName("Up To Date");
  var targetSheet = ss.getSheetByName("Due");
  var daysUntilEnd = upToDate.getRange(3, 26, upToDate.getLastRow() - 2).getValues();

  for (var i = 0; i < (upToDate.getLastRow() - 2); i++) {
    if (daysUntilEnd[i][0] <= triggerDue) {
      var targetLocation = targetSheet.getRange(targetSheet.getDataRange().getLastRow() + 1, 1, 1, 26);
      var uTDRange = upToDate.getRange(i + 3, 1, 1, 26);

      uTDRange.moveTo(targetLocation);
    }    
  }
  deleteEmptyRows(upToDate);
}

function deleteEmptyRows(utds) {
  for (var i = 0; i < utds.getLastRow(); i++) {
    if (utds.getRange('A' + (i + 1)).getValue() == "") {
      utds.deleteRow(i + 1);
    }
  }
}

Использованная литература:

person Rafa Guillermo    schedule 21.10.2019
comment
Работает блестяще! Большое спасибо за помощь! - person Dakota McCarty; 23.10.2019

Измените это:

var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah"; var ss = SpreadsheetApp.openByUrl(url);

to: var ss=SpreadsheetApp.getActive();

Это будет работать только тогда, когда пользователь открывает электронную таблицу, потому что ему нужно выбрать строку. Согласно моим тестам, когда вы открываете электронную таблицу / лист на сервере, активной ячейкой всегда является «A1».

person Cooper    schedule 20.10.2019