google 工作表:用于从模板创建新工作表的 Apps 脚本
google sheets: Apps Script to create new sheets from template
我有一个 google sheets 文档,其中包含 Start
和 Template
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
我有一个 google sheets 文档,其中包含 Start
和 Template
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