@Toomaas

Как создать копию листа в таблице Google Sheets через макрос, чтобы имена новых листов брались из диапазона ячеек?

В документе Google-таблиц на листе "Список" есть список наименований, с которыми необходимо создать новые листы копированием листа "Пример".
Нужен макрос для привязки к кнопке, чтобы по её нажатию лист "Пример" копировался в новый в конец документа (последним листом в документе) и ему задалось имя из ячейки A1 листа "Список", затем лист "Пример" копировался в новый и ему задалось имя из ячейки A2 листа "Список"...и так до тех пор, пока не создадутся копированием все листы из списка в столбце А. Список может быть с разным количеством.
Документ для примера
На данный момент сделал только создание нового листа копированием и именованием заданным именем:
function CopySheet() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getSheetByName('Пример');
spreadsheet.getSheetByName('Пример').getRange('A1').activate();
spreadsheet.duplicateActiveSheet();
spreadsheet.moveActiveSheet(3);
spreadsheet.getActiveSheet().setName('ПримерНовый');
};

Как изменить макрос так, чтобы:
1) при копировании лист перемещался в конец документа (проверялось количество листов и новый помещался за последний),
2) имя назначалось из списка A1, A2, A3 и т.д., пока есть данные в ячейках в столбце А листа "Список" (может быть 10 значений, а может быть и 20),
3) можно ли как-то сделать это в фоне (например, в Excel можно было в функции указать "Application.ScreenUpdating = False", чтобы каждый лист не открывался.
4) если возможен пункт 3, то можно ли как-то сделать, чтобы по итогу выводилось сообщение примерно как "Все листы созданы" или (в идеале) "Создано листов: ** (количество созданных макросом листов)"?
  • Вопрос задан
  • 544 просмотра
Решения вопроса 1
BasiC2k
@BasiC2k
.NET developer (open to job offers)
1)
function CopySheet() {
var ss = SpreadsheetApp.getActive();

var sheet = ss.getSheetByName("Список");
var ranges = sheet.getDataRange();
var lastRow = ranges.getLastRow();

var names = sheet.getRange(`A1:A${lastRow}`).getDisplayValues(); // get new sheet names array
names = names.filter(name => (name.length > 0)); // delete empty values 

// need check by doubles

var sheetSample = ss.getSheetByName('Пример');

names.forEach(name => { // create new sheets 
  var sheetTemp = sheetSample.copyTo(ss);
  sheetTemp.setName(name);
});

Browser.msgBox('Info', 'Completed! Create: ' + names.length + ' sheets', Browser.Buttons.OK);
};


Работу скрипта не проверял, если будут ошибки, надеюсь справитесь. Скрипт не проверяет список названий листов на дубликаты. Также возможно потребуется перемещение листа в конец книги;

2) в столбце "А" может быть любое количество новых названий;

3) нельзя. Единственное, что можно сделать - при создании нового листа скрыть его, а в конце выполнения скрипта - сделать цикл для отображения всех новых листов. Это имеет смысл делать, если на листах выполняются вычисления (например много формул);

4) реализовано
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы