google 工作表:用于从模板创建新工作表的 Apps 脚本

google sheets: Apps Script to create new sheets from template

我有一个 google sheets 文档,其中包含 StartTemplate sheet。这个想法是在 Start 中输入员工的姓名,然后按“生成”按钮。对于输入的每个员工,Template sheet 应该重复,命名与员工相似(例如,McCormick, Peter)并且员工的姓名应该写在新的 sheet 在单元格 A2 中。然后还应将每位员工的姓名添加到 Start sheet,并间接引用每位员工的单元格 B2 sheet。

Apps 脚本可能可以做到这一点,但我在编写代码时遇到了一些困难。任何建议将不胜感激

以下是可能的解决方案:

function create_sheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Start');
  var name = sheet.getActiveCell().getDisplayValue();
  var template = ss.getSheetByName('Template');
  var new_sheet = template.copyTo(ss).setName(name);
  new_sheet.getRange('A2').setValue(name);
}

此脚本复制 'Template' sheet 并将其名称更改为 sheet 'Start'.

上当前单元格的任何名称

但是我不明白你的意思'indirect reference to Cell B2'。你能澄清一下吗?它应该是什么样子?

这里是同一代码的变体,它将 'Start' sheet 上的雇主名称转换为指向相应 sheet 的链接:

function create_sheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Start');
  var cell = sheet.getActiveCell();
  var name = cell.getDisplayValue();
  var template = ss.getSheetByName('Template');
  var new_sheet = template.copyTo(ss).setName(name);
  new_sheet.getRange('A2').setValue(name);

  var url = ss.getUrl() + '#gid=' + new_sheet.getSheetId();
  var link = SpreadsheetApp.newRichTextValue().setText(name).setLinkUrl(url).build();
  cell.setRichTextValue(link);
}

这里是 sheet.

更新

这是更新后的代码:

function add_sheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var start_sheet = ss.getSheetByName('Start');
  var template_sheet = ss.getSheetByName('Template');

  // get list of names from the 'Start'sheet 
  var names = start_sheet.getRange('A2:A').getValues().flat().filter(String);

  while(names.length) {
    var name = names.shift();

    // try to pick existed sheet with the name
    try { var dest_sheet = ss.getSheetByName(name); dest_sheet.getRange('A1') }

    // create the sheet if there is no sheet with this name
    catch(e) { var dest_sheet = template_sheet.copyTo(ss).setName(name) } 

    dest_sheet.getRange('A2').setValue(name);
  }
}

它从 sheet 'Start' 和 sheet 'Template' 的 A 列创建 sheets。

这里是sheet