Скрипт - дублирование листов Google Spreadsheets

Рейтинг: 0Ответов: 1Опубликовано: 22.01.2015

Описание

Скрипт работает так как хотел, все получилось!

Что делает скрипт:

  • создает копию листа шаблона;
  • нумерует новые листы в порядке возрастания и задает имя из указанного диапазона.

Код

function makeCopies() {
  //getting active spreadsheet
  var activeSreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //getting basic sheet
  var basicSheet = activeSreadsheet.getSheetByName("All_base");
  //getting active spreadsheet
  var activeSreadsheet2 = SpreadsheetApp.getActiveSpreadsheet();
  //getting template sheet
  var templateSheet = activeSreadsheet2.getSheetByName("Window");  
  //setting template sheet as active
  activeSreadsheet2.setActiveSheet(templateSheet);
  //getting values from selected range
  var rangeArr = basicSheet.getRange("D6:D9").getValues();
  //going through range values
  for(i = 0; i < rangeArr.length; i++){
    //preparing name for new sheet
    var name = (i + 2) + '. ' + rangeArr[i][0];
    //making duplicate of base sheet
    var newSheet = SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();
    //setting new name for duplicated sheet
    newSheet.setName(name)
  }
};

Вопрос

Не получилось изменить название дублированного листа, беря названия из списка на базовом листе (не на активном) и добавлять номер, т.е. вид должен получаться такой: 1. Window, 2. Rooms .. etc - продолжать скрипт пока не кончаться имена на базовом листе. Как решить?

Ответы

▲ 1Принят

Вероятно, оптимальнее будет использовать проверку на имя (у вас при повторном вызове создается "лишний" лист) и сократить количество системных вызовов (строки 7 и 11 бессмысленны, а 19 не оптимальна)

function makeCopies2(){
  var as = SpreadsheetApp.getActiveSpreadsheet();
  var template = as.getSheetByName('Window');
  var names = as.getRange('All_base!D6:D9').getValues().forEach(function(r, i){
    var name = (+i + 2) + '. ' + r[0];
    if(!as.getSheetByName(name)) template.copyTo(as).setName(name);
  });
}

Код удаления всех листов для отладки

function delAll(){
  var as = SpreadsheetApp.getActiveSpreadsheet();
  as.getSheets().forEach(function(s){
    var sname = s.getSheetName();
    if(sname != 'Window' && sname != 'All_base') as.deleteSheet(s);
  })
}