Предлагаемое решение:
Теперь вы используете основной лист в качестве шаблона, поэтому при использовании его с функцией .copyTo
вы будете копировать весь контент. Вам нужно будет получить всю строку, соответствующую индексу данного имени.
Подход
Вам потребуется дополнительная фильтрация, чтобы получить правильные значения строк, которые вы хотите поместить в новый лист. , Я отфильтрую столбец имени (столбец A) и получу индекс имени в l oop.
(я предполагаю, что у вас может быть несколько пробелов, поэтому индекса для l oop будет недостаточно).
Как только я найду соответствующий индекс, мне нужно будет увеличить его на один, потому что индексирование строк начинается с 1 в таблицах Google.
Теперь я могу легко получить строку, используя функцию .getRange(row, column, numRows, numColumns)
. Я использую функцию .getLastColumn()
для вычисления параметра numColumns
.
Теперь я могу использовать функцию .appendRow()
, чтобы вставить строку в новый лист, который я только что создал с помощью функции .insertSheet()
.
Пример кода:
function newSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var templateSheet = ss.getActiveSheet();
var sheet1 = ss.getSheetByName("main")
var getNames = sheet1.getRange("A2:A").getValues().filter(String).toString().split(",");
for (var i = 0; i < getNames.length; i++) {
var copy = ss.getSheetByName(getNames[i]);
if (copy) {
Logger.log("Sheet already exists");
} else {
//The copyTo function will copy the entire sheet
//templateSheet.copyTo(ss).setName(getNames[i]);
var rowIndex = sheet1.getRange("A:A").getValues().flatMap(value => value[0]).indexOf(getNames[i]) + 1;
var rowValues = sheet1.getRange(rowIndex, 1, 1, sheet1.getLastColumn()).getValues();
ss.insertSheet(getNames[i]).appendRow(rowValues[0]);
ss.setActiveSheet(ss.getSheetByName(getNames[i]));
ss.moveActiveSheet(ss.getNumSheets());
}
}
}
Редактировать
В случае повторения имен вам придется отфильтровать столбец и извлечь соответствующие индексы.
Сначала вам нужно получить набор для вашей переменной getNames. (в противном случае у вас будут повторения).
var getNames = [...new Set(sheet1.getRange("A2:A").getValues().filter(String).toString().split(","))];
Тогда вам нужно будет сопоставить индексы строк с именами в столбце A. Теперь вы можете фильтровать по значениям getNames и получать индексы строк. В конце вы можете добавить к новому листу строки с соответствующими индексами.
var rowIndexes = sheet1.getRange("A:A").getValues()
.map((value, index) => [value[0], (index + 1)])
.filter(value => value[0] === getNames[i]);
var namedSheet = ss.insertSheet(getNames[i]);
rowIndexes.map(index => {
var rowValues = sheet1.getRange(index[1], 1, 1, sheet1.getLastColumn()).getValues();
namedSheet.appendRow(rowValues[0]);
});
Список литературы:
Таблица классов