我想使用基于时间的触发器来执行以下脚本。
它背后的想法是在屏幕上显示电子表格,并自动每分钟跳转到工作表的另一部分(当您单击内部超链接时)。
因此,在设置基于时间的触发器时,脚本不会抛出任何错误,并且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);
}
}
}
谢谢和最诚挚的问候, 丹尼尔
答案 0 :(得分:2)
参考documentation of setActiveRange
:
设置应用程序的有效范围。
电子表格用户界面会显示包含所选范围的工作表 并且选择在所选范围内定义的单元格。
但另一方面基于时间的触发器在没有任何UI 的情况下运行,因此使用setActiveRange
无效。
编辑(添加的解决方法):
可能的解决方法是create sidebar并通过普通JavaScript使用setTimeout
等同于基于时间的触发器。这是演示示例:
<强> Code.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>