应用程序脚本执行代码太快了??

时间:2013-06-26 02:11:31

标签: google-apps-script while-loop google-sheets

我写了一些代码,在打开这个电子表格时执行。主要是检查除了名为“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 ...”并且不显示任何细胞或任何东西。自定义菜单显示。它还在顶部的黄色框中显示“正在工作”。

1 个答案:

答案 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();
  }