The Google Apps Script Developers' Guide's definition of an "active sheet":
电子表格中的活动工作表是在电子表格UI中显示的工作表。
如果我有三个表,分别是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和脚本编辑器中都应按照《开发人员指南》中的定义进行操作。它不能在一个中工作而在另一个中也没有工作。
答案 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.')
}