【问题标题】:setActiveRange does not work via time-based triggersetActiveRange 不能通过基于时间的触发器工作
【发布时间】:2018-01-15 23:36:11
【问题描述】:

我想使用基于时间的触发器来执行以下脚本。

其背后的想法是在屏幕上显示电子表格,并每分钟自动跳转到工作表的另一部分(就像您单击内部超链接时一样)。

因此,在设置基于时间的触发器时,脚本不会抛出任何错误,并且 viewportCount 也会每分钟相应地变化 -> 只有 活动范围根本不会改变(因此它不显示工作表的其他部分)。

当手动或通过例如触发脚本时onEdit 触发器,一切正常,活动范围发生变化。您知道为什么基于时间的触发器似乎无法与 setActiveRange 结合使用吗?

function autoJump() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);
  var autoPlayConfig = sheet.getRange('P7').getValue();
  var viewportCount = sheet.getRange('Q7').getValue();
  var range1 = sheet.getRange("A1");
  var range2 = sheet.getRange("A30:A31");
  var range3 = sheet.getRange("A53:A54");

  if (autoPlayConfig == true) {

   switch(viewportCount) {
   case 1:
        sheet.getRange('Q7').setValue(viewportCount+1);
        sheet.setActiveRange(range1);
        break;    
   case 2:
        sheet.getRange('Q7').setValue(viewportCount+1);
        sheet.setActiveRange(range2);
        break; 
   case 3:
        sheet.getRange('Q7').setValue(1);
        sheet.setActiveRange(range3);;
        break; 
   default:
        sheet.setActiveRange(range1);
   }
  }    
}

感谢和最好的问候, 丹尼尔

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    参考documentation of setActiveRange

    设置应用程序的活动范围。

    电子表格 UI 显示包含所选范围的工作表 并选择所选范围内定义的单元格

    但另一方面,基于时间的触发器运行没有任何可用的 UI,因此使用 setActiveRange 无效。

    编辑(添加的解决方法):

    可能的解决方法是 create sidebar 并通过纯 JavaScript 使用 setTimeout 作为基于时间的触发器。这是演示示例:

    代码.gs

    function onOpen() {
      SpreadsheetApp.getUi()
          .createMenu('My Menu')
          .addItem('Show sidebar', 'showSidebar')
          .addToUi();
    }
    
    function showSidebar() {
      var html = HtmlService.createHtmlOutputFromFile('sidebar').setTitle('My Sidebar');
      SpreadsheetApp.getUi().showSidebar(html);
    }
    
    function autoJump() {
      // sample function that just will jump down one cell 
      SpreadsheetApp.getActiveRange().offset(1, 0).activate();
    }
    

    sidebar.html

    <!DOCTYPE html>
    <html>
      <head>
        <base target="_top">
      </head>
      <body>
        <script>
        // call autoJump function every 2 seconds
        setInterval(function(){
          google.script.run.autoJump();
        }, 2000);
        </script>
      </body>
    </html>
    

    【讨论】:

    • 您好,科斯,感谢您的帮助。你的解释很有道理。您/任何人是否知道通过基于时间的触发器“自动跳转到电子表格的某些部分”的任何其他解决方法,还是目前不可能?
    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2022-01-07
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多