电子表格中所有工作表上的setActiveCell。 Google Apps脚本

时间:2018-03-16 19:20:52

标签: google-apps-script google-sheets

我有一张包含多张表的Google电子表格。我希望将光标设置为所有选项卡的特定单元格onOpen。第一行的每个单元代表一年中的一周,从头到尾,全年。我已经编写了一些代码,以便在打开时在第5行预选该特定列(一年中的某周)。

目前,只有最后一张工作表选择了我想要的单元格。这是因为setActiveCell一次只能用于一个单元格。我也试过setActiveRangesetActiveSelection无济于事。

我在几年前发现了一个问题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));
    });
}

其中也只设置了最后一张

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次呼叫进行更新。