为了账号安全,请及时绑定邮箱和手机立即绑定

仅激活某些工作表时触发脚本

仅激活某些工作表时触发脚本

智慧大石 2023-04-27 17:13:21
我有几张以“代理报告”开头,后跟名称的工作表,如下所示:“代理报告 - 约翰”、“代理报告 - 亚当”等。我有一个脚本可以从特定单元格中读取代理的名称并从该人的另一个电子表格中检索数据。我想在激活以“代理报告”开头的工作表时触发脚本,以便在工作表之间移动时,为“代理报告”工作表中的每个人更新工作表数据。到目前为止我有这个:function onOpen(e) {  makeMenu();  var ss = SpreadsheetApp.getActiveSpreadsheet();  var sname = ss.getActiveSheet().getName();  if(sname.indexOf("Agent Report")>-1){    master();  }}代理报告不是第一个工作表,因此当我打开电子表格时脚本正确地创建了一个自定义菜单 (makeMenu),但是当我切换到“代理报告”工作表时没有被触发(主)。当我从“代理报告”表手动运行脚本时,它运行良好。我的问题是:当我切换到名称以“Agent Report”开头的工作表时,我可以创建一个触发器来运行脚本吗?onOpen()似乎不适合这个目的。如果这样的触发器不可能,是否可以有一个解决方法 - 一个遍历每张工作表的循环,检查名称,如果它包含“代理报告”,则运行脚本。像这样的东西:function onOpen(e) {  var ss = SpreadsheetApp.getActiveSpreadsheet();  var numberOfSheets = ss.getSheets().length;       for (var i = 0; i<=numberOfSheets; i ++) {    if(SOMETHING HERE.indexOf("Agent Report")[i] > -1){      master();    }  }}
查看完整描述

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();

}

您可以通过多种不同的方式执行此常规功能:

  1. 脚本编辑器

  2. 创建自定义菜单并从电子表格文件中执行

  3. 在电子表格文件中创建一个图标按钮

  4. 创建一个时间驱动的触发器以在特定时间执行


奖金信息:

在这两种方法中,您都可以替换

if(as.getName().indexOf("Agent Report")>-1)

if(as.getName().includes("Agent Report"))

它的作用完全相同,但对眼睛更友好。

查看完整回答
反对 回复 2023-04-27
?
慕莱坞森

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]);

}

查看完整回答
反对 回复 2023-04-27
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信