我写了一些代码,在打开这个电子表格时执行。主要是检查除了名为“Main”的工作表之外是否有工作表,如果存在,则删除除“Main”之外的所有工作表。 (“主”表始终是第一张表。)然后清除“主”表中的任何内容,并每次更换最后可以在代码中读取的内容。
// This creates a menu when this spreadsheet is opened.
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
var numSheets = ss.getSheets();
while (numSheets.length > 1){
ss.setActiveSheet(numSheets[1]);
ss.deleteActiveSheet();
var numSheets = ss.getSheets();
}
ss.setActiveSheet(numSheets[0]);
ss.getActiveSheet().getDataRange().clear();
menuEntries.push({name: "Create Folder Structure", functionName: "folderStruc"});
ss.addMenu("Click here when done.", menuEntries);
ss.getRange('A1:B1').mergeAcross().setValue('TA');
ss.getRange('A2').setValue('First Name');
ss.getRange('B2').setValue('Last Name');
ss.getRange('C2').setValue('Email');
ss.getRange('D2').setValue('Classes');
}
当我逐行调试时,脚本运行正常。当那里只有“主”表时,它也很好用。但是当有多张纸并打开电子表格时,它将通过while循环并删除除“Main”之外的所有纸张,但它会挂在“Main”上,只显示“Loading ...”并且不显示任何细胞或任何东西。自定义菜单显示。它还在顶部的黄色框中显示“正在工作”。
答案 0 :(得分:2)
如果您只是在每个工作表删除之间添加一个小延迟,您的代码就可以正常工作,这在删除多个工作表时是个已知问题。
以下是代码:
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [];
var numSheets = ss.getSheets();
while (numSheets.length > 1){
ss.setActiveSheet(numSheets[1]);
ss.deleteActiveSheet();
Utilities.sleep(1000);// 1 second delay is sufficient and seems optimal from my experience.
var numSheets = ss.getSheets();
}
ss.setActiveSheet(numSheets[0]);
ss.getActiveSheet().getDataRange().clear();
menuEntries.push({name: "Create Folder Structure", functionName: "folderStruc"});
ss.addMenu("Click here when done.", menuEntries);
ss.getRange('A1:B1').mergeAcross().setValue('TA');
ss.getRange('A2').setValue('First Name');
ss.getRange('B2').setValue('Last Name');
ss.getRange('C2').setValue('Email');
ss.getRange('D2').setValue('Classes');
}
注意:你在问题中提到你不会删除名为“main”的表格,但我没有在你的脚本中看到任何条件,所以我猜你依赖于工作表顺序。添加在删除之前检查sheetName的条件非常简单,因此如果由于任何原因修改了工作表顺序,您将不会意外删除主工作表。如果需要,替换原始while loop
的内容会将纸张放在原位。
while (numSheets.length > 1){
ss.setActiveSheet(numSheets[1]);
Utilities.sleep(1000);
if(ss.getActiveSheet().getName()=='main sheet'){
ss.moveActiveSheet(0);
}else{
ss.deleteActiveSheet();
}
var numSheets = ss.getSheets();
}