我有一张包含多张表的Google电子表格。我希望将光标设置为所有选项卡的特定单元格onOpen
。第一行的每个单元代表一年中的一周,从头到尾,全年。我已经编写了一些代码,以便在打开时在第5行预选该特定列(一年中的某周)。
目前,只有最后一张工作表选择了我想要的单元格。这是因为setActiveCell
一次只能用于一个单元格。我也试过setActiveRange
和setActiveSelection
无济于事。
我在几年前发现了一个问题Here,但解决方案对我不起作用。也许从那以后发生了一些变化。
这是我的代码:
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
}
var now = new Date();
var weekNum = now.getWeek();
var sheets = ss.getSheets();
for(var i = 0; i < sheets.length; i++) {
var newRange = sheets[i].getRange(5,weekNum + 1);
sheets[i].setActiveCell(newRange);
}
}
在我上面提供的链接中,我尝试了所有给定解决方案的差异,但我的代码从未完全相同,因为我没有寻找与OP完全相同的东西。例如,使用Jacob Jan Tuistra的最新代码解决方案,我提出了:
function setCursor() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
Date.prototype.getWeek = function() {
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7);
}
var now = new Date();
var weekNum = now.getWeek();
ss.getSheets().forEach(function (sheet, weekNum) {
Logger.log(weekNum);
sheet.setActiveRange(sheet.getRange(5,weekNum+1));
});
}
其中也只设置了最后一张
答案 0 :(得分:1)
当您循环遍历工作表集合时,您似乎需要拨打SpreadsheetApp.flush()
:
function onOpen() {
SpreadsheetApp.getActive().getSheets().forEach(function (s) {
s.setActiveSelection("B4");
SpreadsheetApp.flush(); // Force this update to happen
});
}
我的猜测是Apps Script的执行引擎优化了对单个调用的写入,并且在该单个调用中只能进行一次活动选择。每张表调用冲洗强制1次呼叫进行更新。