希望将 sheet 复制为新选项卡并根据特定单元格值重命名
Looking to copy a sheet over as a new tab and renaming it based off a specific cell value
为了工作,我的团队保留了一个常客数据库,每次我们将新客户登录到数据库时,团队都必须在其中复制并粘贴“模板”页面。
我希望他们能够单击标有“创建新客户”的 sheet,该标签在单元格 A1 和单元格 B1 中仅显示两个单元格“客户名称”,他们可以在其中手动输入名称. 一旦他们这样做了,我想在那些复制原始模板 sheet 的单元格旁边有一些提交按钮,并将新选项卡重命名为单元格 B1 中的客户名称,同时保持对模板页面。
如果我造成任何混淆,我深表歉意,但我在团队删除 data/scripts 等方面遇到了多个问题,导致我自己回溯以不断弄清楚。提前致谢!
描述
我可以建议使用 Ui 提示来获取客户名称。下面是一个提示用户输入名称、复制模板、应用客户名称和应用模板保护的简单示例。提示是从菜单选项而不是电子表格单元格触发的。
脚本
function onOpen(e) {
var menu = SpreadsheetApp.getUi().createMenu("My Menu");
menu.addItem("Create New Customer","createNewCustomer");
menu.addToUi();
}
function createNewCustomer() {
try {
let ui = SpreadsheetApp.getUi();
let response = ui.prompt("Customer Name",ui.ButtonSet.OK_CANCEL);
if( response.getSelectedButton() == ui.Button.OK ) {
let spread = SpreadsheetApp.getActiveSpreadsheet();
let sheets = spread.getSheets();
let name = response.getResponseText();
// make sure the sheet doesn't already exist
sheets.forEach( sheet => { if( sheet.getName() === name ) { throw "Customer "+name+" already defined" } } );
let template = spread.getSheetByName("Template");
let copy = template.copyTo(spread);
copy.setName(name);
// get all protected ranges from template
let protections = template.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for( let i = 0; i < protections.length; i++ ) {
let protection = protections[i];
let rangeNotation = protection.getRange().getA1Notation();
let protectRange = copy.getRange(rangeNotation).protect();
protectRange.setDescription(protection.getDescription());
protectRange.setWarningOnly(protection.isWarningOnly());
// set all eligible editors
if (!protection.isWarningOnly()) {
protectRange.removeEditors(protectRange.getEditors());
protectRange.addEditors(protection.getEditors());
}
}
}
}
catch(err) {
ui.alert(err);
}
}
参考
- https://developers.google.com/apps-script/reference/base/ui.html#createMenu(String)
- https://developers.google.com/apps-script/reference/base/ui.html#prompt(String,ButtonSet)
- https://developers.google.com/apps-script/reference/spreadsheet/protection
- https://webapps.stackexchange.com/questions/86984/in-google-sheets-how-do-i-duplicate-a-sheet-along-with-its-permission/87000#87000
为了工作,我的团队保留了一个常客数据库,每次我们将新客户登录到数据库时,团队都必须在其中复制并粘贴“模板”页面。
我希望他们能够单击标有“创建新客户”的 sheet,该标签在单元格 A1 和单元格 B1 中仅显示两个单元格“客户名称”,他们可以在其中手动输入名称. 一旦他们这样做了,我想在那些复制原始模板 sheet 的单元格旁边有一些提交按钮,并将新选项卡重命名为单元格 B1 中的客户名称,同时保持对模板页面。
如果我造成任何混淆,我深表歉意,但我在团队删除 data/scripts 等方面遇到了多个问题,导致我自己回溯以不断弄清楚。提前致谢!
描述
我可以建议使用 Ui 提示来获取客户名称。下面是一个提示用户输入名称、复制模板、应用客户名称和应用模板保护的简单示例。提示是从菜单选项而不是电子表格单元格触发的。
脚本
function onOpen(e) {
var menu = SpreadsheetApp.getUi().createMenu("My Menu");
menu.addItem("Create New Customer","createNewCustomer");
menu.addToUi();
}
function createNewCustomer() {
try {
let ui = SpreadsheetApp.getUi();
let response = ui.prompt("Customer Name",ui.ButtonSet.OK_CANCEL);
if( response.getSelectedButton() == ui.Button.OK ) {
let spread = SpreadsheetApp.getActiveSpreadsheet();
let sheets = spread.getSheets();
let name = response.getResponseText();
// make sure the sheet doesn't already exist
sheets.forEach( sheet => { if( sheet.getName() === name ) { throw "Customer "+name+" already defined" } } );
let template = spread.getSheetByName("Template");
let copy = template.copyTo(spread);
copy.setName(name);
// get all protected ranges from template
let protections = template.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for( let i = 0; i < protections.length; i++ ) {
let protection = protections[i];
let rangeNotation = protection.getRange().getA1Notation();
let protectRange = copy.getRange(rangeNotation).protect();
protectRange.setDescription(protection.getDescription());
protectRange.setWarningOnly(protection.isWarningOnly());
// set all eligible editors
if (!protection.isWarningOnly()) {
protectRange.removeEditors(protectRange.getEditors());
protectRange.addEditors(protection.getEditors());
}
}
}
}
catch(err) {
ui.alert(err);
}
}
参考
- https://developers.google.com/apps-script/reference/base/ui.html#createMenu(String)
- https://developers.google.com/apps-script/reference/base/ui.html#prompt(String,ButtonSet)
- https://developers.google.com/apps-script/reference/spreadsheet/protection
- https://webapps.stackexchange.com/questions/86984/in-google-sheets-how-do-i-duplicate-a-sheet-along-with-its-permission/87000#87000