Javascript 代码,用于为列表中的每个项目创建一个新工作表



我需要在GoogleSheets上创建一个宏,该宏将在名为"Suppliers"的工作表的列表中显示不同的名称,并为每个名称创建一个新工作表。每个工作表都需要是称为"数据"的不同工作表的副本。新工作表上的列 A 需要按名称进行筛选。每个工作表还需要以列表中的项目命名。

我有一个功能正常的宏来独立为每个名称创建工作表,但无法弄清楚如何通过名称列表进行此循环并为每个名称自动生成一个新工作表。

我目前使用的代码如下:

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)
    });
});
}
}

我为你写了两个函数。 factory从"供应商"表 A 列中读取供应商的名称,并为每个名称执行doTheWork功能。我省略了隐藏功能,因为我不知道它在做什么。如果当前代码有效,则始终可以稍后添加。

将名称存储在"供应商"表列 A 中并运行工厂功能。

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);
}

相关内容

最新更新