Google apps script Google应用程序脚本函数getActiveSheet()不返回活动工作表
: 电子表格中的活动工作表是显示在电子表格UI中的工作表 如果我有三张工作表,分别命名为Mary、Moe和Joe,并将Mary工作表保留在屏幕上(因此,它是活动工作表),然后运行以下简单脚本:Google apps script Google应用程序脚本函数getActiveSheet()不返回活动工作表,google-apps-script,google-sheets,Google Apps Script,Google Sheets,: 电子表格中的活动工作表是显示在电子表格UI中的工作表 如果我有三张工作表,分别命名为Mary、Moe和Joe,并将Mary工作表保留在屏幕上(因此,它是活动工作表),然后运行以下简单脚本: function myFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); Logger.log(sheet.getName()); ss.setAct
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:50:51:930 EDT] Joe
[18-10-26 18:50:51:933 EDT] Joe
但事实上,它说:
[18-10-26 18:49:14:752 EDT] Moe
[18-10-26 18:49:14:755 EDT] Joe
如果我第二次运行它,而不接触纸张,我希望输出结果是
[18-10-26 18:41:45:724 EDT] Mary
[18-10-26 18:41:45:730 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
换句话说,设置活动工作表确实会更改电子表格UI中显示的工作表,但似乎不会在内部将新工作表注册为活动工作表。GAS始终将Moe识别为活动板材,即使将活动板材设置为不同的板材
如果能给我一个解释和解决这个问题的方法,我将不胜感激。基本上,我只需要getActiveSheet()
和getActiveRange()
(有类似的问题)来提供当前在电子表格UI中可见的工作表,这与《开发人员指南》中的定义完全一致
编辑:我找到了这个问题的解决方案。我是从评论中引用自己的话
大家好,谢谢大家的意见。我刚刚发现
getActiveSheet()确实按照我希望的方式工作,但是
仅当通过使用构建的自定义菜单UI运行函数时
SpreadsheetApp.getUi().createMenu(…),它需要一个onOpen()
触发器(感谢@I'-'I的提示)。从
脚本编辑器导致了一些问题,这些问题启发了我的原始文章
然而,虽然我很高兴找到了一个解决方案,但它更像是一个解决核心问题的方法。我觉得在这两种情况下,
getActiveSheet()
都应该按照《开发人员指南》中的定义在菜单UI和脚本编辑器中起作用。它在其中一个中工作,而在另一个中不工作是没有意义的。显示所有工作表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.')
}
函数循环throughallsheets(){
var ss=SpreadsheetApp.getActive();
var shA=ss.getSheets();
var start=新日期();
对于(var i=0;我可以与ful access共享电子表格来尝试coe吗?我实际上创建了一份副本,因为我在帖子中使用的工作表包含与工作相关的机密信息…应该提前考虑。无论如何,这张新工作表的行为方式是相同的,除了我现在每次都会收到Joe Joe,无论哪张工作表在di上splay非常感谢您能告诉我您使用的是什么web浏览器吗?它适合我。嗨,JSmith,谢谢您的反馈。我正在使用Mozilla Firefox 63.0(Quantum)对于64位Windows 10,感谢您共享此代码。我自己尝试过,效果非常好。但是,这并不是我想要做的。我想使用函数getActiveSheet(),而不是在工作表中循环,我很失望地发现,在某些情况下,它并没有按照我预期的方式工作,除非我在某种程度上错了。我认为,如果你每次使用activate()方法之后都使用SpreadsheetApp.flush()
的话,你的脚本就会工作。