Перемещение одного ряда в другой в зависимости от значения - PullRequest
2 голосов
/ 20 октября 2019

Я пытаюсь переместить данные с одной вкладки 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

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Ответ:

Существует несколько проблем с кодом, включая некорректное использование .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);
    }
  }
}

Ссылки:

0 голосов
/ 20 октября 2019

Измените эти значения:

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

на: var ss=SpreadsheetApp.getActive();

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

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