有没有办法在用户在 Google Sheets 电子表格中的工作表之间切换时运行脚本?
或多或少类似于
onOpen
,但它不是在打开文档时运行,而是在每次用户切换到另一张工作表时触发。
这是我的 onSheetChange 解决方法:
function saveActiveSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var actsheet = ss.getActiveSheet();
// The onSelectionChange() function executes in a separate thread
// which does not use any script global variables, so use the
// PropertiesService to maintain the user global state.
var userProperties = PropertiesService.getUserProperties();
userProperties.setProperty('ACTIVE_SHEET', actsheet.getSheetName());
}
function onSheetChange(e) {
// Do anything needed after a new sheet/tab selection
}
function onSelectionChange(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Get current sheet name and compare to previously saved sheet
var currentactsheet = ss.getActiveSheet();
var currentactsheetname = currentactsheet.getSheetName();
var userProperties = PropertiesService.getUserProperties();
var actsheetname = userProperties.getProperty('ACTIVE_SHEET');
if (currentactsheetname !== actsheetname) { // New sheet selected
saveActiveSheet();
onSheetChange(e); // Call custom sheet change trigger
}
// Do anything needed when a different range is selected on the same sheet
else {
var range = e.range;
}
}
function onOpen(e) {
saveActiveSheet();
}
更新:2020 年 4 月 Google 添加了 onSelectionChange(e),可用于检查用户是否在工作表(又名选项卡)之间切换。
SpreadsheetApp.setActivesheet
在工作表之间进行切换,方法是使用脚本而不是使用选项卡,并在该脚本中包含对从一张工作表切换到另一张工作表时要运行的函数的调用。
getName
API(需要 xxx 毫秒)一次,2) 使用 Google 支持的更新的 ES2015 语法,3) 使用一致的命名, 4) 使用事件参数中的电子表格,而不是进行单独的 API 调用来检索它。只需将您的代码放入
onSheetOpen
即可。
function onSheetOpen(spreadsheet, sheet, sheetName) {
// Do anything needed after a new sheet/tab selection
}
function storeActiveSheet(name) {
// onSelectionChange() executes in a separate thread which does not use
// script global variables, so use the PropertiesService to maintain state.
PropertiesService.getUserProperties().setProperty('ACTIVE_SHEET', name);
}
function onSelectionChange(e) {
const {spreadsheet, sheet, sheetName} = eventSpreadsheetVariables(e);
const userProperties = PropertiesService.getUserProperties();
const storedSheetName = userProperties.getProperty('ACTIVE_SHEET');
if (storedSheetName !== sheetName) {
onSheetOpen(spreadsheet, sheet, sheetName);
storeActiveSheet(sheetName);
}
}
function eventSpreadsheetVariables(e) {
const spreadsheet = e.source;
const sheet = spreadsheet.getActiveSheet();
const sheetName = sheet.getName();
return {spreadsheet, sheet, sheetName};
}
function onOpen(e) {
const { spreadsheet, sheet, sheetName } = eventSpreadsheetVariables(e);
onSheetOpen(spreadsheet, sheet, sheetName);
storeActiveSheet(sheetName);
}
(最初作为对现有答案的编辑提交,但因偏离原始答案太远而被拒绝,因此单独提交。)
sheet1.showSheet();
sheet2.hideSheet();