2 回答
TA贡献1784条经验 获得超8个赞
问题:
根据官方文件:
onOpen(e)
当用户打开他们有权编辑的电子表格、文档、演示文稿或表单时,触发器会自动运行。
这种方法的问题是它仅在您打开电子表格文件时onOpen
执行。因此,即使您在工作表之间切换或进行任何其他操作,脚本也不会执行,除非您再次刷新/打开电子表格文件。也就是说,只会对你第一次打开的sheet执行。onOpen
解决方案 1:
要在不同工作表之间切换时执行代码,您可以使用onSelectionChange(e):
function onSelectionChange(e) {
makeMenu();
const as = e.source.getActiveSheet();
if (as.getName().indexOf("Agent Report")>-1){
master();
}
}
我不建议您选择这种方法,因为每次您在脚本中进行选择更改时,都会执行代码。
方案二(推荐):
正如您还建议的那样,为了控制何时要执行脚本,我建议您使用一个常规函数来遍历所有工作表并检查工作表名称是否符合条件。添加也onOpen
执行makeMenu()
:
function allSheets(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
sheets.forEach(sh=>{
if(sh.getName().indexOf("Agent Report")>-1){
master();
}});
}
function onOpen() {
makeMenu();
}
您可以通过多种不同的方式执行此常规功能:
脚本编辑器
创建自定义菜单并从电子表格文件中执行
在电子表格文件中创建一个图标按钮
创建一个时间驱动的触发器以在特定时间执行
奖金信息:
在这两种方法中,您都可以替换
if(as.getName().indexOf("Agent Report")>-1)
和
if(as.getName().includes("Agent Report"))
它的作用完全相同,但对眼睛更友好。
TA贡献1810条经验 获得超4个赞
最终的解决方案是使用可安装的触发器(不是简单的触发器,这就是脚本没有运行 onOpen 的原因)和以下脚本:
function allSheets() {
makeMenu();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
sheets.forEach(sh=>{
SpreadsheetApp.setActiveSheet(sh);
if (sh.getName().includes("Agent Report")) {
master();
}
})
SpreadsheetApp.setActiveSheet(sheets[0]);
}
添加回答
举报