setActiveRange 无法通过基于时间的触发器工作

问题描述 投票:0回答:1

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

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

因此,在设置基于时间的触发器时,脚本不会抛出任何错误,viewportCount 也会每分钟相应变化 -> 只有 active range 根本不会改变(因此它不会显示其他部分)片材)。

手动或通过例如触发脚本时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-sheets google-apps-script triggers
1个回答
2
投票

参考

setActiveRange
的文档:

将指定范围设置为

active range
,该范围内左上角的单元格作为
current cell

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

但从另一方面来看,基于时间的触发器运行时没有任何可用的UI,因此使用

setActiveRange
没有效果。

编辑(添加解决方法):

可能的解决方法是创建侧边栏并通过纯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>
© www.soinside.com 2019 - 2024. All rights reserved.