1

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

4

1 回答 1

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();
  }
于 2013-06-26T07:50:19.410 回答