Перемещение частичных данных из одной строки в другую на том же листе путем вставки новой строки чуть ниже - PullRequest
1 голос
/ 08 мая 2020

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

function myFunction() {

var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var rangeData = ss.getDataRange();
var lastColumn = rangeData.getLastColumn();
var lastRow = rangeData.getLastRow();
var data = ss.getRange(2, 1, lastRow, lastColumn).getValues();
var getRow  = rangeData.getRow()

for (var i = 0; i <= lastRow; i++) { 

   var row = data[i];
   Logger.log('data row ' + row);
   var rangeToMove = ss.getRange(/*startRow*/ i, /*startColumn*/ 9, /*numRows*/ 1, /*numColumns*/ ss.getMaxColumns());
   ss.insertRowAfter(i);
   rangeToMove.moveTo(ss.getRange(i++,2,2,9));


}
}

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 мая 2020

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

function so61670015() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dataRange = sheet.getDataRange();
  var lastColumn = dataRange.getLastColumn();
  var lastRow = dataRange.getLastRow();
  var rawData = sheet.getRange(2, 1, lastRow - 1, lastColumn).getValues();
  var maxColumn = 9; // Column I
  var data = [];

  // Step I - Clean
  for (var j = 0; j < rawData.length; j++) {
    data.push(rawData[j].filter(value => value != ""));
  }

  // Step II - Wrap
  for (var j = 0; j < data.length; j++) {
    if (data[j].length > maxColumn) {
      var surplus = data[j].slice(9);
      data[j].splice(9);
      data.splice(j + 1, 0, surplus);
    }
  }

  // Step III - Fill
  for (var j = 0; j < data.length; j++) {
    if (data[j].length < maxColumn) {
      var emptyColumns = maxColumn - data[j].length;
      for (var s = 0; s < emptyColumns; s++) {
        data[j].push("");
      }
    }
  }

  // Step IV - Overwrite
  sheet.getRange(2, 1, lastRow, lastColumn).setValue("");
  sheet.getRange(2, 1, data.length, 9).setValues(data);
}

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

На первом этапе код очистит все пустые значения данных (void, как в "", не null). Это поможет отличить пустые ячейки от заполненных. Я использовал метод .filter(), чтобы записать в массив data только непустые значения.

Тогда код будет вырезать каждую строку с максимальным размером столбца (столбец I в ваш вопрос) и запишите излишек строки в новой строке ниже. Код выполняет это действие с помощью методов .slice() и .splice() (для чтения и изменения массива соответственно). Обратите внимание, как я использую .splice() дважды: сначала для изменения строки, удаляя каждую ячейку, превышающую предел столбца, а затем для изменения массива данных, чтобы вставить строку с избыточными ячейками. Если избыток по-прежнему превышает максимально допустимый, он будет повторять операцию до тех пор, пока все строки не будут соответствовать пределу столбца.

После этих процедур данные должны быть снова заполнены пустыми значениями (как в "") в тех строках, которые в итоге оказались меньше предела столбца. Это действие потребуется для записи данных позже, потому что метод .setValues() требует, чтобы массив значений был равного размера выбранному диапазону . Чтобы выполнить sh, я использовал метод .push() для вставки пустых значений в каждую строку, пока не будет достигнут предел столбца.

Наконец, данные готовы к записи. В двухэтапном процессе код сначала очищает исходный лист, а сразу после этого записывает окончательные данные. Это означает конец операции.

Чтобы проиллюстрировать использование этого кода, если мы воспользуемся следующими примерами данных:

Original sheet

В итоге мы получим этот лист:

Final sheet

Пожалуйста, задавайте мне любые вопросы, если вам нужна дополнительная помощь или разъяснения.

...