用户在工作表之间切换时触发

问题描述 投票:0回答:5

有没有办法在用户在 Google Sheets 电子表格中的工作表之间切换时运行脚本?

或多或少类似于

onOpen
,但它不是在打开文档时运行,而是在每次用户切换到另一张工作表时触发。

google-apps-script google-sheets triggers
5个回答
3
投票

这是我的 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();
}

0
投票

更新:2020 年 4 月 Google 添加了 onSelectionChange(e),可用于检查用户是否在工作表(又名选项卡)之间切换。


此时不存在与从一张纸切换到另一张纸相关的触发器。要了解 Google Apps 脚本中的可用触发器,请查看

触发器和事件 - Google Apps 脚本指南

作为一种解决方法,您可以使用自定义菜单和

SpreadsheetApp.setActivesheet

 在工作表之间进行切换,方法是使用脚本而不是使用选项卡,并在该脚本中包含对从一张工作表切换到另一张工作表时要运行的函数的调用。


0
投票
我创建了一个“

功能请求”来在谷歌问题跟踪器上实现“onSheetChange”触发器。你可以给它加注星标,所以谷歌现在你想要这个: https://issuetracker.google.com/issues/72140210

这里是相关问题和可能的解决方法:

如何在 Google 电子表格中捕获更改选项卡事件?


0
投票
下面的解决方案 1) 比其他现有答案更快,包括因为它每次运行只调用

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); }
(最初作为对现有答案的编辑提交,但因偏离原始答案太远而被拒绝,因此单独提交。)


-2
投票
你可以使用

sheet1.showSheet(); sheet2.hideSheet();
    
© www.soinside.com 2019 - 2024. All rights reserved.