google-apps-script - 将所有工作表滚动到打开时的最后一行
问题描述
我已经建立了一个有 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 自己对电子表格服务的内部优化:
脚本通常需要从电子表格中读取数据,执行计算,然后将数据结果写入电子表格。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
}]
}
推荐阅读
- apache - 实施重定向到安全到网站
- javascript - 如何使用 vue-chartjs 将图像添加到图表标签?
- python - 不删除尾随零的 NumPy 字节数组
- google-sheets - 如何计算多个不等于<>的变量?
- android - WebView:在外部浏览器中打开的特殊链接?
- google-drive-api - 如何解决“AttributeError: 'Resource' object has no attribute 'documents'”错误?
- amazon-web-services - 如何将内容从 CDN 提供给未登录的用户,以及从实际的 webapps 提供给登录的用户?
- javascript - 几秒钟后超时异步/等待功能
- sql-server - SQL Server 2019 将 Base64 编码打破为标量值函数
- swift - SwiftUI 可识别的 ForEach 最初以空开头时不会更新