Javascript 如何在Google工作表中使用Google Apps脚本从一个范围创建多个选项卡?
我需要创建一个自定义函数,以便根据a列中的值在Google工作表中创建多个选项卡。我如何做到这一点 这是为了跟踪特定电子商务产品的数据。它们的名称位于第一个选项卡的第一列中。列A中的每个条目都需要有一个标签,标签上的名称相同 我不知道怎么做Javascript 如何在Google工作表中使用Google Apps脚本从一个范围创建多个选项卡?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我需要创建一个自定义函数,以便根据a列中的值在Google工作表中创建多个选项卡。我如何做到这一点 这是为了跟踪特定电子商务产品的数据。它们的名称位于第一个选项卡的第一列中。列A中的每个条目都需要有一个标签,标签上的名称相同 我不知道怎么做 输出应该是由A列中的每个单元格创建的新选项卡。在脚本编辑器中复制并粘贴此代码 function createSheet(sheetIndex, value){ // Check if cell is empty after editing if (v
输出应该是由A列中的每个单元格创建的新选项卡。在脚本编辑器中复制并粘贴此代码
function createSheet(sheetIndex, value){
// Check if cell is empty after editing
if (value.oldValue){
value = 'Sheet' + (sheets.length - sheetIndex);
}
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
// If sheet already exits just change the sheet name
if (sheets[sheetIndex]) {
sheets[sheets.length - sheetIndex].setName(value)
} else {
SpreadsheetApp.getActiveSpreadsheet().insertSheet(value);
}
}
function onEdit(e) {
var sheet = e.source.getActiveSheet();
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
// Check if the sheet being edited is the first sheet and first column (A)
if (sheet.getSheetId() == sheets[0].getSheetId() && sheet.getActiveCell().getColumn() == 1) {
createSheet(e.range.getRowIndex(), e.value)
}
}
可以对代码进行扩展,支持删除;不过这有点棘手,因为没有onDelete事件。您可以将图纸数组与列中的值进行比较,以确定删除哪张图纸。使用模板和位置创建多张图纸
只有当原始工作表中a列的单元格不存在时,以下函数才会在每次编辑该单元格时创建一个新工作表。为此,请使用和触发器以及相应的:
- 请参阅共享脚本中的注释,以逐步了解代码的作用
- 在本例中,原始工作表称为“Sheet1”。如果不是您的情况,请相应地更改它
我希望这会有所帮助。获取列a的数组,然后从数组中迭代项,检查现有选项卡,并将项作为其名称,如果不存在,则创建新选项卡,当然将项作为其名称。非常感谢-这是非常有用的!
function onOpen() {
SpreadsheetApp.getUi().createMenu("My Menu")
.addItem('Create onOpen Trigger', 'createTrigger')
.addToUi();
}
//This is where the sheets get created
function startUp() {
var ss=SpreadsheetApp.getActive();
var templateA=["A","B","C"];
templateA.forEach(function(name){ss.getSheetByName(name).hideSheet();});
var sh=ss.getSheetByName("Sheet Data");
var shts=ss.getSheets();
var shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
var hdnshts=shts.map(function(sh){if(sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
var vA=rg.getValues();
vA.sort(function(a,b){return a[2]-b[2];});
vA.forEach(function(r){
if(shtnames.indexOf(r[0])==-1 && r[0]!=sh.getName()) {
ss.insertSheet(r[0], r[2], {template:ss.getSheetByName(r[1])});
}
shts=ss.getSheets();
shtnames=shts.map(function(sh){if(!sh.isSheetHidden()){return sh.getName();}}).filter(function(e){return e});
});
var end="is near";
}
function isTrigger(funcName){
var r=false;
if(funcName){
var allTriggers=ScriptApp.getProjectTriggers();
for(var i=0;i<allTriggers.length;i++){
if(funcName==allTriggers[i].getHandlerFunction()){
r=true;
break;
}
}
}
return r;
}
//Installable onOpen trigger
//run this function first
function createTrigger() {
var ss=SpreadsheetApp.getActive();
if(!isTrigger('startUp')) {//This keeps you from creating unnecessary triggers
ScriptApp.newTrigger('startUp').forSpreadsheet(ss).onOpen().create()
}
}
//This is useful for testing
function deleteSheets() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("Sheet Data");
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
var vA=rg.getValues();
vA.forEach(function(r){
ss.deleteSheet(ss.getSheetByName(r[0]));
});
}
function onEdit(e) {
var firstSheetName = "Sheet1"; // Name of your original sheet, change accordingly
var range = e.range; // Edited cell
var ss = e.source; // Edited spreadsheet
var sheetName = range.getSheet().getName(); // Name of edited sheet
var value = range.getValue(); // Value of the edited cell
// Checks whether edited sheet is the original one, and edited column is A:
if(sheetName == firstSheetName && range.getColumn() == 1) {
// Checks whether a sheet with this name exists:
var sheetExists = ss.getSheets().some(function(sheet) {
return sheet.getName() == value;
});
// Create new sheet only if a sheet with this name it doesn't exist:
if(!sheetExists) {
ss.insertSheet(value);
range.activate(); // Go back to original edited cell
}
}
}