You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google表格onChange事件中getActiveSheet()始终返回首个工作表问题求助

问题

我需要在用户手动隐藏行时同步不同工作表的隐藏状态,于是创建了onChange事件触发器,但遇到了问题:getActiveSheet()始终返回第一个工作表。之前查到相关问题标记为已修复,但我这里仍出现该错误。我试过用SpreadsheetApp.getActiveSheet().getSheetName()等替代方法,结果还是一样,而且脚本已经绑定到表格了。

相关脚本
function balancer(e) {
  if(e.user == 'example@gmail.com'){
    var currentSheetName = e.source.getActiveSheet().getSheetName();
    Logger.log(currentSheetName)
    switch(currentSheetName) {
      case "Sheet1":
        Logger.log("1");
        var currentSheetURL = 'https://docs.google.com/spreadsheets/d/1lQD783-rP6Rkvbgl0LJhcd2X6ld2x70UDi9qZ-vklQU/edit#gid=845762334';
        var connectedSpreadsheetUrls = [
          'https://docs.google.com/spreadsheets/d/238uFufYiEboFwovMQ4k2C4etuSSTdhVV5mphHVzaVi0/edit#gid=380725117',
        ];
        //onChangeTrigger(e, currentSheetName, currentSheetURL, connectedSpreadsheetUrls);
        break;
      case "Sheet2":
      Logger.log("2")
        var currentSheetURL = 'https://docs.google.com/spreadsheets/d/1lQHGBN-rP6RkpNUl0KLhcd2X6ld2x70UDi9qZ-vklQU/edit#gid=1253678902';
        var connectedSpreadsheetUrls = [
          'https://docs.google.com/spreadsheets/d/1dEba7sTtBKmM2KJG1POIM7bxxWvuR_eLCIw7lXzv9T8/edit#gid=1301134732'
        ];
        //onChangeTrigger(e, currentSheetName, currentSheetURL, connectedSpreadsheetUrls);
        break;
      default:
        Logger.log("Oh no")
        return;
    }
  }
}

function onChangeTrigger(e, originalSheetName, originalSpreadsheetUrl, connectedSpreadsheetUrls) {
  try {
    Logger.log(originalSheetName)

    var originalSpreadsheet = e.source

    var originalSheet = e.source.getSheetByName(originalSheetName)

    var originMatch = originalSpreadsheetUrl.match(/\/d\/([a-zA-Z0-9-_]+)\/edit#gid=(\d+)/);
    
    // Check if the event object and the source are defined
    if (e && originalSpreadsheet) {
      // Check if the edited sheet is the original sheet in the provided spreadsheet
      if (originalSpreadsheet.getId() == originMatch[1] && originalSpreadsheet.getSheetByName(originalSheetName).getSheetId() == originMatch[2]) {
        connectedSpreadsheetUrls.forEach(function(url) {
          var match = url.match(/\/d\/([a-zA-Z0-9-_]+)\/edit#gid=(\d+)/);
          if (match) {
            var connectedSpreadsheetId = match[1];

            var connectedSheetGid = match[2];

            var connectedSpreadsheet = SpreadsheetApp.openById(connectedSpreadsheetId);
            
            // Loop through sheets in the connected spreadsheet to find the one with the specified gid
            var connectedSheets = connectedSpreadsheet.getSheets();
            var connectedSheet = null;
            for (var i = 0; i < connectedSheets.length; i++) {
              if (connectedSheets[i].getSheetId() == connectedSheetGid) {
                connectedSheet = connectedSheets[i];
                break;
              }
            }

            if (connectedSheet) {
              try{
                var hidden_rows = getHiddenAndFilteredRows(originalSheet)
              } catch(error1){
                Logger.log("oops", error1)
              }
              if(hidden_rows.length > 0){
                hidden_rows.forEach(row => {
                  if (!connectedSheet.isRowHiddenByUser(row)){
                    connectedSheet.hideRows(row)
                  }
                })
              }
              var connected_sheet_hidden_rows = getHiddenAndFilteredRows(connectedSheet)
              if(connected_sheet_hidden_rows.length > 0){
                connected_sheet_hidden_rows.forEach(row => {
                  if (!originalSheet.isRowHiddenByUser(row)){
                    connectedSheet.showRows(row)
                  }
                })
              }
            }
          }
        });
      }
    }
  } catch (error) {
    Logger.log('Error:', error.message);
  }
}

function getHiddenAndFilteredRows(sheet) {
  var data = sheet.getDataRange().getValues()
  var hiddenRows = []
  for (var d = 0; d < data.length; d++) {
    // Row Index starts from 1
    if (sheet.isRowHiddenByUser(d + 1)) {
      Logger.log('Row #' + d + ' is hidden - value: ' + data[d][0]);
      hiddenRows.push(d+1)
      continue;
    }
  }
  return hiddenRows
}

内容的提问来源于stack exchange,提问作者Dat Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:28:10