首页 > 解决方案 > 将所有工作表滚动到打开时的最后一行

问题描述

我已经建立了一个有 7 张工作表的电子表格,每张工作表都填充了许多行数据。我厌倦了手动向下滚动到每张工作表的最后一行,因此我构建了一个简单的脚本函数来以编程方式查找并转到工作表的最后一行。此功能在大多数情况下在手动运行时有效。但是,当我尝试使用“从电子表格,打开时”安装的事件触发器执行此功能时,它无法正常触发。

这是功能:

function LastRowOnOpen() {
  var ss = SpreadsheetApp.getActive();
  var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('302 Ashfrd'));
   var lastRow = sheet.getLastRow();

   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3220 Blmnt'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3302 Blmnt'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('1035 Bnhm'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('Deer Park'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('3000-102 Lrn'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();

   var sheet = SpreadsheetApp.setActiveSheet(ss.getSheetByName('2249 Wht'));
   var lastRow = sheet.getLastRow();
   lastRow = lastRow + 5;
   sheet.getRange(lastRow, 1).activate();
   sheet.showSheet();  

附言

我还尝试使用包含以下内容的 for 循环:

var sheet = SreadsheetApp.setActiveSheet(ss.getSheetByName('2249 Wht'));
var lastRow = sheet.getLastRow();
lastRow = lastRow + 5;
sheet.getRange(lastRow, 1).activate();
sheet.showSheet();   `   

改变sheet = getSheetByname方法以减少代码行,但是除了循环的最后一次迭代之外的所有内容都被忽略了。

标签: google-apps-scriptgoogle-sheetsgoogle-sheets-macros

解决方案


没有一个很好的答案(我能找到)完全解决这个话题:

您当前脚本“忽略”“除了循环的最后一次迭代之外的所有内容”的问题源于 Google 自己对电子表格服务的内部优化

脚本通常需要从电子表格中读取数据,执行计算,然后将数据结果写入电子表格。Google Apps 脚本已经有一些内置优化,例如使用前瞻缓存来检索脚本可能获取的内容并写入缓存来保存可能设置的内容。

换句话说,您的脚本被分析并且有效地只有最后一次activate调用被确定为需要。为了解决这个问题,我们使用SpreadsheetApp.flush()and Utilities.sleep,就像这里所做的那样。

function onOpen(e) { // "Simple Trigger" from reserved function name.
  // https://developers.google.com/apps-script/guides/triggers/events#open
  scrollAll(e.source);
}
function scrollAll(wb) {
  (wb ? wb : SpreadsheetApp.getActive()).getSheets().forEach(
    function (sheet) {
      wb.setActiveSheet(sheet).setActiveSelection("A" + sheet.getLastRow());
      SpreadsheetApp.flush();
      Utilities.sleep(1000); // may need to be adjusted
    });
}
function scrollActive() { // Macro target
  const s = SpreadsheetApp.getActiveSheet();
  s.setActiveSelection("A" + s.getLastRow());
}

要使用键盘快捷键将当前工作表重新滚动到底部,您可以在项目的清单文件中包含以下内容,以将函数绑定scrollActive为具有键盘快捷键的宏:

"sheets": {
  "macros": [{
    "menuName": "Scroll To Last Row",
    "functionName": "scrollActive",
    "defaultShortcut": "Ctrl+Alt+Shift+N" // N= 1, 2, 3, 4, 5, 6, 7, 8, 9, or 0
  }]
}

推荐阅读