Как я могу создать копии листа, меняя значение ячейки каждый раз с помощью цикла? - PullRequest
0 голосов
/ 18 января 2019

Я новичок в этом деле, но это здорово! Я работал с Excel и Vba, и я очень рад видеть весь этот новый мир.

Вот моя проблема: В Excel у меня есть файл с «шаблоном». Этот шаблон связан с данными, которые меняются в зависимости от значения ячейки. Например, в ячейке K26 есть номер ключа; если его значение равно 1, шаблон покажет вам информацию, связанную с 1. Если это 2, он покажет вам информацию, связанную с 2 и так далее. Есть список чисел, которые я хочу сгенерировать, поэтому, когда я запускаю код, шаблон добавит новый лист, скопирует его текущие значения и вставит их в новый лист, переименует лист из «SheetX» в значение ячейки K26 и затем переходите к следующему ряду.

Вопрос : Я хочу сделать то же самое в драйверах, но не знаю, с чего начать.

Мой шаблон листа называется «Generador», а текущий реестр находится в ячейке K26 (это также будет имя листа). Диапазон, который я хочу скопировать, составляет от A1 до I67. Если это возможно, я хотел бы иметь новую рабочую книгу, и в этой рабочей книге создать все листы списка. Список может быть где угодно на листе «Список».

Заранее спасибо.

EDIT:

Пока мой код: на основе это

function createEmployeeSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
   // Get the range of cells that store employee data.
  var ssLista = ss.getSheetByName("Lista");
  var rgEData = ssLista.getRange(2,1);
  var eData=rgEData.getValue();//número de registros
  var employeeDataRange = ssLista.getRange(2,1,eData,1);//Nombres de hoja empezando en columna 1 desde fila 2
  var employeeObjects = employeeDataRange.getValues();
  var template = ss.getSheetByName('Generador');

  for (var i=0; i < employeeObjects.length; i++) {
     // Put the sheet you want to create in a variable
     var sheet = ss.getSheetByName(employeeObjects[i]);
      // Check if the sheet you want to create already exists. If so,
      // log this and loop back. If not, create the new sheet.
        if (sheet) {
           Logger.log("Sheet " + employeeObjects[i] + "already exists");
        } else {
           template.getRange("K3").offset(0,0).setValue(employeeObjects[i]);
           template.copyTo(ss).setName(employeeObjects[i]);

           }
        }
  return;

  i = 0;
}

Мне удалось сгенерировать каждый лист, изменить K3 значения шаблона и переименовать его. Мне не хватает двух вещей:

Я все еще получаю сообщение об ошибке: когда код начинает генерировать листы, он включается и не останавливается в последней строке листа «Список». Например, у меня есть 3 строки со значениями, и когда цикл переходит к 4, он показывает строку ошибки, потому что не может назвать листы ни с чем (ноль).

Другое дело, что я хочу создавать листы в новой книге, а не в текущей. Есть ли способ, что эти листы могут быть созданы в новом? Учитывая, что информация связана с формулами, поэтому это должны быть только значения.

Спасибо.

1 Ответ

0 голосов
/ 19 января 2019

Попробуйте это:

Функция getValues ​​() возвращает двумерный массив Objec [] []

function createEmployeeSheets() {
  var ss = SpreadsheetApp.getActive();
  var shLista = ss.getSheetByName('Lista');
  var rgEData = shLista.getRange(1,3);
  var eData=rgEData.getValue();//the number of names I think
  var employeeDataRange = ssLista.getRange(2,1,eData,1);//Sheet names in column1 starting from row2
  var employeeObjects = employeeDataRange.getValues();//sheet names in column 0
  var template=ss.getSheetByName('Generador');//template
  for (var i=0;i< employeeObjects.length; i++) {
    if(!ss.getSheetByName(employeeObjects[i][0])){
      template.getRange("K3").setValue(employeeObjects[i][0]);
      var sheet=ss.insertSheet(employeeObjects[i][0], {template:template});
    }
  }
}

Этот код не был проверен.

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