Как добавить данные первой строки при динамическом создании новых листов в Google Apps Script - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть этот код, который динамически создает новые листы, но пропускает первую строку, потому что он структурирован таким образом, что он создает новые листы на основе значений в первом столбце A: A . Как мне структурировать, чтобы захватить первую (строку заголовка) перед добавлением остальных данных.

function newSheet() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var templateSheet = ss.getActiveSheet();
    var sheet1 = ss.getSheetByName("main")
    var getNames = [...new Set(sheet1.getRange("A2:A").getValues().filter(String).toString().split(","))];
var title = sheet1.getRange("A1:Z1").getValues().filter(String).toString().split(",");// Not sure


    for (var i = 0; i < getNames.length; i++) {
        var copy = ss.getSheetByName(getNames[i]);
             if (copy) {

        ss.deleteSheet(copy)


                 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();
                sheet1.getLastColumn()).getValues();;

                // Append title row first???

                namedSheet.appendRow(rowValues[0]);

            ss.setActiveSheet(ss.getSheetByName(getNames[i]));
            ss.moveActiveSheet(ss.getNumSheets());

            });

1 Ответ

1 голос
/ 20 апреля 2020

Ситуация:

Вы хотите сделать следующее:

  • Создать новый лист для каждого отдельного значения в столбце A (если он был создан ранее, удалить его).
  • Первая строка в каждом созданном листе должна быть похожа на первую строку в исходном листе (main).
  • Остальная часть листа должна содержать только те строки, в которых совпадает значение столбца A имя листа.

Пример кода (проверьте встроенные комментарии):

function newSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getActiveSheet();
  var sheet1 = ss.getSheetByName("main");
  var getFirstColumn = sheet1.getRange(2, 1, sheet1.getLastRow() - 1).getValues().map(row => row[0]); // Get column A contents (excluding row 1)
  var getNames = [...new Set(getFirstColumn)]; // Get unique values from column A (excluding row 1)
  var title = sheet1.getRange(1, 1, 1, sheet1.getLastColumn()).getValues()[0]; // Get row 1 values
  var data = sheet1.getRange(2, 1, sheet1.getLastRow() - 1, sheet1.getLastColumn()).getValues(); // Get all data in "main" sheet (excluding row 1)
  for (var i = 0; i < getNames.length; i++) { // Iterate through each unique value in column A
    var copy = ss.getSheetByName(getNames[i]);
    if (copy) ss.deleteSheet(copy); // If there is a sheet with this name, delete it
    var filteredData = data.filter(row => row[0] === getNames[i]); // Get rows from "main" sheet with current unique column A value
    var namedSheet = ss.insertSheet(getNames[i]); // Create sheet for current unique column A value
    namedSheet.appendRow(title); // Append row 1 values to new sheet
    namedSheet.getRange(2, 1, filteredData.length, filteredData[0].length).setValues(filteredData); // Copy filtered data to new sheet
  }
}

Примечания:

  • Нет необходимости получать индексы строки для копирования, вы можете просто отфильтровать их, не сохраняя индексы. Это значительно упрощает ваш код.
  • Вы можете просто добавить первую строку перед добавлением остальных данных на лист. Вы также можете добавить массив title в начало массива filteredData и записать все данные одновременно, включая первую строку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...