Я понимаю, что вы хотите разделить строки на блоки по девять столбцов, записав избыток строки сразу под исходной строкой. Если я правильно понимаю, следующий код будет работать для вашего сценария. Я видел в вашем коде, что вы не хотите взаимодействовать с первой строкой; Я учел это решение в своем коде.
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()
для вставки пустых значений в каждую строку, пока не будет достигнут предел столбца.
Наконец, данные готовы к записи. В двухэтапном процессе код сначала очищает исходный лист, а сразу после этого записывает окончательные данные. Это означает конец операции.
Чтобы проиллюстрировать использование этого кода, если мы воспользуемся следующими примерами данных:
В итоге мы получим этот лист:
Пожалуйста, задавайте мне любые вопросы, если вам нужна дополнительная помощь или разъяснения.