代码之家  ›  专栏  ›  技术社区  ›  StackUser

google应用程序脚本:在除活动工作表外的所有工作表中设置光标[复制]

  •  0
  • StackUser  · 技术社区  · 6 年前

    我有一个谷歌电子表格,有多张表格。我希望将光标设置为特定单元格 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 回复  |  直到 6 年前
        1
  •  1
  •   tehhowch    6 年前

    看来你需要打个电话给 SpreadsheetApp.flush() 在“图纸”集合上循环时:

    function onOpen() {
      SpreadsheetApp.getActive().getSheets().forEach(function (s) {
        s.setActiveSelection("B4");
        SpreadsheetApp.flush(); // Force this update to happen
      });
    }
    

    我的猜测是apps script的执行引擎优化了对单个调用的写入,并且在单个调用中只能进行一个活动选择。调用flush会强制每个工作表更新一个调用。