2013-06-26 57 views
1

我写了一些代码来执行此电子表格打开时。主要检查除了名为“Main”的表以外是否还有工作表,如果有,请删除除“Main”之外的所有工作表。 (“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循环运行,并删除除“主”所有的床单,但它会挂在“主”之一,只是显示“正在加载...”和不显示任何细胞或任何东西。自定义菜单出现。它还在顶部的黄色框中显示“工作”。

+0

从循环中删除“ss.getSheets()”?如果你只有两张床单,你会发现问题。我怀疑问题是网络。我怀疑你的循环中的一些函数很慢,因为他们进行网络调用....或者你可以通过触发器删除它们。 – eddyparkinson

+0

Serge在下面解答了解决方案。但你是对的,这是一个网络问题。 – PhysLabTsar

回答

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'); 
} 

注:你在你的问题提,你将不会删除称为“主”片,但我没有看到任何条件,以你的脚本,所以我猜你依靠床单订单。在删除之前添加一个检查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(); 
    } 
+0

非常感谢!这解决了它。 是,“主”片也不会被删除。我确信的,通过删除numSheet [1](未[0]),它是第二片材,只要片材的总数量大于1 但是您的除了代码将确保毫无疑问永远不要删除“主”表,如果由于某种原因它不是第一张表。 (Sheet Index 0) – PhysLabTsar

+0

实际上,当我在setActiveSheet()和deleteActivesheet()之间放置1秒的延迟时,它对我很有用: while(numSheets.length> 1)ss.setActiveSheet(numSheets [1]) ; Utilities.sleep(1000); ss.deleteActiveSheet(); var numSheets = ss.getSheets(); } 它挂了一下它的下方,我尝试过一步移动它,它完美地工作。 再次感谢! – PhysLabTsar