Google Apps Script - переместить диапазон данных на основе совпадения циклов в значение = "Да" - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь найти определенные значения в таблице данных, используя цикл for, и в зависимости от того, является ли значение = «Да», он переместит строку на другой лист.Цикл должен дополнительно искать значение requesttype (в данном случае SRM, CC или TM1) и перемещать только определенные части строки на другой лист.

Следовательно, цикл for должен копировать строку на основе входных данных из двух разных столбцов таблицы данных: «Все выходы»

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

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

Вот что у меня есть:

function myonEdit2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  var sheetNameToWatch = "Open Requests";
  var columnNumberToWatch = 38;
  var watchColumn = 2;
  var valueToWatch = "Yes";

  var datarange = sheet.getRange(9, 2, 900, 36).getValues();
  var sheetNameToMoveTheRowTo = "Closed Requests" 

  for (i = 0; i < datarange.length -1; i++) {
    if (datarange[i][35] == "Yes") {
      var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
      if (datarange[i][0] == "SRM") {
        var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
        sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
        sheet.deleteRow(rowstart + i);
      }     
      else if (datarange[i][0] == "GC") { 
        var targetRange3 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2);
        sheet.getRange(i, 2, 1, 8).moveTo(targetRange3);
        sheet.deleteRow(i);
      }
      else if (datarange[i][0] == "TM1") { 
        var targetRange4 = targetSheet.getRange(targetSheet.getLastRow() + 1, 2, 1, 6);
        sheet.getRange(i, 2, 1, 6).moveTo(targetRange4);
        var targetRange5 = targetSheet.getRange(targetSheet.getLastRow(), 10, 1, 1)
        sheet.getRange(i, 13, 1, 1).copyTo(targetRange5)
        sheet.deleteRow(i);
      }
    }
  }

Как я уже сказал, код работает нормально, но он не выполняется для всех строк, для которых он должен выполняться.

Как видно из приведенного выше, я определяю диапазон цикла for как полную таблицу данных, в которой находится таблица. Затем я создаю первый (основной) if условие, а именно 36-й столбец диапазона данных "Да".Это должно определить, для каких строк будет выполняться скрипт.

Второе условие if определяет, какие именно столбцы строки следует скопировать, и зависит от того, является ли первый столбец = SRM, CC или TM1.

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

Пример листа

1 Ответ

0 голосов
/ 16 октября 2018

Подобная проблема возникла со мной, и это также кажется проблемой здесь.вы берете диапазон данных и добавляете в него цикл for для обработки каждой строки.Теперь вы удаляете строки между ними, но есть определенный массив данных, в который вы добавили цикл for.Таким образом, когда предыдущие строки будут удалены, структура массива цикла for останется прежней, но структура листа будет изменена в качестве примера, учитывая, что 2-я строка была удалена и ваше условие соответствует i = 5, но структура листа теперь будет иметь это5-я строка переместилась вверх.

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

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