Google Apps脚本函数getActiveSheet()不返回活动工作表

时间:2018-10-26 22:55:59

标签: google-apps-script google-sheets

The Google Apps Script Developers' Guide's definition of an "active sheet"

  

电子表格中的活动工作表是在电子表格UI中显示的工作表。

my sheets

如果我有三个表,分别是Mary,Moe和Joe,则将Mary表显示(因此,它是活动表)并运行以下简单脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  Logger.log(sheet.getName());

  ss.setActiveSheet(ss.getSheets()[2]);
  Logger.log(ss.getActiveSheet().getName());
}

我希望输出说出来

[18-10-26 18:41:45:724 EDT] Mary
[18-10-26 18:41:45:730 EDT] Joe

但是,实际上它说:

[18-10-26 18:49:14:752 EDT] Moe
[18-10-26 18:49:14:755 EDT] Joe

如果我第二次运行而又不触碰表皮,我希望输出会显示

[18-10-26 18:50:51:930 EDT] Joe
[18-10-26 18:50:51:933 EDT] Joe

但实际上它说的和以前一样

[18-10-26 18:50:51:930 EDT] Moe
[18-10-26 18:50:51:933 EDT] Joe

换句话说,设置活动工作表确实确实会更改Spreadsheet UI中显示的工作表,但是似乎没有在内部将新工作表注册为活动工作表。 GAS始终将Moe视为活动表,即使将活动表设置为其他表也是如此。

请您提供一种解释和解决此问题的方法。基本上,我只需要getActiveSheet()getActiveRange()(存在类似问题)就可以得到与Spreadsheet UI中当前可见的工作表,完全符合《开发人员指南》中的定义。

编辑:我找到了解决此问题的方法。我要从评论中引用自己。

  

大家好,谢谢大家的投入。我才发现   getActiveSheet()确实按照我希望的方式工作,但是   仅当您通过使用以下命令构建的自定义菜单UI运行该功能时   SpreadsheetApp.getUi()。createMenu(...),需要一个onOpen()   触发(感谢@I'-'I提示)。从   脚本编辑器引起了启发我原始帖子的问题。

但是,虽然我很高兴找到了解决方案,但感觉更像是一种解决方法,无法解决核心问题。我觉得getActiveSheet()在菜单UI和脚本编辑器中都应按照《开发人员指南》中的定义进行操作。它不能在一个中工作而在另一个中也没有工作。

1 个答案:

答案 0 :(得分:0)

显示所有图纸10秒钟

此脚本将循环遍历电子表格中的所有工作表,一次激活一个工作表并显示大约10秒钟。

function cycleThroughAllSheets() {
  var ss=SpreadsheetApp.getActive();
  var shA=ss.getSheets();
  var start=new Date();
  for(var i=0;i<shA.length;i++){
    shA[i].activate();
    SpreadsheetApp.flush();
    ss.toast('Active Sheet is ' + shA[i].getName());
    do{
      //nothing
    }while(new Date().valueOf()-start.valueOf()<10000);
    start=new Date();
  }
  ss.toast('End of Script.')
}