Как выполнить вызов строки с помощью Google App Script - PullRequest
0 голосов
/ 14 апреля 2020

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

Так что этот код смотрит на первый столбец и получает значения, которые будут использоваться при переименовании новых вкладок

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 {
            templateSheet.copyTo(ss).setName(getNames[i]);
            ss.setActiveSheet(ss.getSheetByName(getNames[i]));
            ss.moveActiveSheet(ss.getNumSheets());
        }
    }
}

Лист

enter image description here

То, что я хотел бы сделать и становится Задача заключается в том, чтобы при создании новой вкладки с именем я хотел бы скопировать всю строку на новую вкладку / лист. например, для листа Levi только лист с данными Леви будет скопирован на лист.

В данный момент мой код копирует весь исходный лист на новые вкладки / листы. Я буду очень признателен за любую помощь с этим

1 Ответ

2 голосов
/ 14 апреля 2020

Предлагаемое решение:

Теперь вы используете основной лист в качестве шаблона, поэтому при использовании его с функцией .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]);
});

Список литературы:

Таблица классов

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