Javascript код для создания нового листа для каждого элемента в списке - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужно создать макрос в GoogleSheets, который будет искать разные имена в списке на листе с именем «Поставщики» и создавать новый лист для каждого имени. Каждый лист должен быть копией отдельного листа под названием «Данные». Столбец А на новом листе должен быть отфильтрован по имени. Каждый лист также должен быть назван в честь элемента в списке.

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

Код, который я сейчас использую, приведен ниже:

function Supplier1() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A1').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Data'), true);
spreadsheet.duplicateActiveSheet();
spreadsheet.getActiveSheet().setName('Supplier1');
spreadsheet.getRange('A:L').activate();

spreadsheet.getRange('A:L').createFilter();
spreadsheet.getRange('A1').activate();
var criteria = SpreadsheetApp.newFilterCriteria()
.setHiddenValues(['', 'Supplier2', 'Supplier3', 'Supplier4','Supplier5'])
.build();

spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(1, 
criteria);
spreadsheet.getRange('G:G').activate();
spreadsheet.getRange('C1').activate();
spreadsheet.getActiveSheet().getFilter().sort(3, true);
spreadsheet.getRange('D1').activate();
spreadsheet.getActiveSheet().getFilter().sort(4, true);

function hideRows() {
["Supplier1"].forEach(function (s) {
var sheet = SpreadsheetApp.getActive()
sheet.hide(sheet.getRange('B:B'))
sheet.getRange('B:B')
    .getValues()
    .forEach(function (r, i) {
        if (!r[0]) sheet.hideRows(i + 1)
    });
});
}
}

1 Ответ

0 голосов
/ 17 апреля 2019

Я написал две функции для вас. factory считывает имена поставщиков из столбца «Поставщики» A и для каждого имени выполняет работу в функции doTheWork. Я пропустил скрытую функциональность, так как не знаю, что она делает. Если текущий код работает, всегда можно добавить это позже.

Сохраните имена в столбце «Поставщики» и запустите заводскую функцию.

function factory() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var supSheet = ss.getSheetByName('Suppliers');
  var supNames = supSheet.getRange(1, 1, supSheet.getLastRow(), 1).geValues();
  supNames = supNames.map(function(el) {
    return el[0];
  });

  supNames.forEach(function(name, i) {
    doTheWork(ss, name, i, supNames);
  });
}

function doTheWork(ss, name, i, allNames) {
  if (!name || name.length == 0) return;

  ss.getSheetByName('Data').activate();
  var nSheet = ss.duplicateActiveSheet();
  nSheet.setName(name);

  nSheet.getRange('A:L').activate();
  nSheet.getRange('A:L').createFilter();
  nSheet.getRange('A1').activate();

  var values = [''].concat(allNames);
  values.splice(i+1, 1);
  var criteria = SpreadsheetApp.newFilterCriteria()
    .setHiddenValues(values)
    .build();

  nSheet.getFilter().setColumnFilterCriteria(1, criteria);

  nSheet.getRange('G:G').activate();
  nSheet.getRange('C1').activate();
  nSheet.getFilter().sort(3, true);

  nSheet.getRange('D1').activate();
  nSheet.getFilter().sort(4, true);
}
...