当我在另一个 sheet 上活动时隐藏一个 sheet

Hide a sheet when I am active on another sheet

我试图在我不使用时自动隐藏一个名为“添加费用”的 sheet。

例如

我有 sheet“BD 费用”、sheet“BD 代币”、sheet“BD 收入”、sheet“添加费用” , sheet“添加收入”。

我想要的是,当我在任何不称为“输入费用”的 sheet 中处于活动状态时,脚本会完全自动运行(无需单击任何按钮)以隐藏sheet 称为“添加费用”。

我目前有这个代码:

//Ocultar todas las hojas excepto la activa
function Ocultar_formulario_ANADIR_GASTO() {
  var sheets = SpreadsheetApp.getActiveSheet();  

  sheets.forEach(function(sheet) {
      if (sheet.getSheetByName('Añadir gasto') != SpreadsheetApp.getActiveSheet().getName())
        sheet.hideSheet();
  });
};   

我试过各种方法都没有成功。

我知道有一个名为 onSelectionChange (e) 的函数,但由于我对 Javascript 还很陌生,所以我真的不知道如何让它工作。因此我以不同的方式创建了我的代码。

我查看了来自 https://developers.google.com/apps-script/reference/spreadsheet/sheet#hidesheet

的参考资料

我也搜索过 google 和 Whosebug,但找不到解决这个问题的方法。

当前,当 运行 来自编辑器的脚本时,我收到错误“TypeError:sheets.forEach 不是一个函数”。

我无法让它工作。

如果有人能看看我的代码并提供一点帮助,我将不胜感激。

非常感谢。

当您更改 sheets 时,似乎有 no specific Google Scripts event

但是 issue tracker ticket 中提到了一个变通方法 - 滚动到工单底部可以看到它。它涉及使用 onSelectionChange(e) 来跟踪您搬出和搬入的 sheet。

以下代码根据您的情况调整解决方法:

该代码假定您的 Google 传播 sheet 有 2 个或更多 sheet - 其中一个 sheet 称为 Secret Sheet。您可以将此名称更改为您想要的任何名称(请参阅代码的第一行)。

当您从 Secret Sheet 移动到任何其他 sheet 时,Secret Sheet 将自动隐藏。

var secretSheetName = 'Secret Sheet'; // change this to whatever you prefer.
var prevSheetProperty = 'PREVIOUS_SHEET';

function saveActiveSheet() {
  var activesheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty(prevSheetProperty, activesheet.getSheetName());
}

function onSheetChange(e) {
  var sheetToHide = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(secretSheetName);
  sheetToHide.hideSheet();
}

function onSelectionChange(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // Get current sheet name and compare to previously saved sheet
  var currentSheetName = ss.getActiveSheet().getSheetName();
  var userProperties = PropertiesService.getUserProperties();
  var previousSheetName = userProperties.getProperty(prevSheetProperty);

  if (currentSheetName !== previousSheetName) {
    saveActiveSheet(); // this becomes the new "previous sheet".
    if (previousSheetName === secretSheetName) { 
      // you have moved out of the secret sheet - so, hide it:
      onSheetChange(e);   // Call custom sheet change trigger
    }
  }
}

function onOpen(e) {
  saveActiveSheet();
}

脚本的工作原理是跟踪哪个 sheet 是当前活动的 sheet - 哪个是(不同的)之前活动的 sheet。

它在用户 属性 中存储“以前的”sheet 名称。

您将看到要使用 onSelectionChange(e) 事件,您只需将该函数添加到脚本中即可:

function onSelectionChange(e) { ... }

Google 脚本自动将此识别为事件函数。您可以通过示例阅读更多相关信息 here.

我将回答我自己的问题,以提供与@andrewjames 相同的解决方案,但同时隐藏多个 sheet。

可以在@andrewjames 评论中找到隐藏单个 sheet 的代码。

以@adrewjames 的代码为基础隐藏多个sheet的代码是这样的。

var addFicha = 'Añadir ficha'; // change this to whatever you prefer.
var addGasto = 'Añadir gasto'; // change this to whatever you prefer.
var addIngreso = 'Añadir ingreso'; // change this to whatever you prefer.

var hideMultipleSheets = addFicha || addGasto || addIngreso;
var prevSheetProperty = 'PREVIOUS_SHEET';

function saveActiveSheet() {
  var activesheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var userProperties = PropertiesService.getUserProperties();
  userProperties.setProperty(prevSheetProperty, activesheet.getSheetName());
}

function onSheetChange(e) {
  var sheetToHide1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(addFicha);
  var sheetToHide2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(addGasto);
  var sheetToHide3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(addIngreso);

  sheetToHide1.hideSheet();
  sheetToHide2.hideSheet();
  sheetToHide3.hideSheet();
}

function onSelectionChange(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // Get current sheet name and compare to previously saved sheet
  var currentSheetName = ss.getActiveSheet().getSheetName();
  var userProperties = PropertiesService.getUserProperties();
  var previousSheetName = userProperties.getProperty(prevSheetProperty);

  if (currentSheetName !== previousSheetName) {
    saveActiveSheet(); // this becomes the new "previous sheet".
    if (previousSheetName === hideMultipleSheets) { 
      // you have moved out of the secret sheet - so, hide it:
      onSheetChange(e);   // Call custom sheet change trigger
    }
  }
}

function onOpen(e) {
  saveActiveSheet();
}

在这里我留下一个简短的解释,以便如果有人需要此代码,他们知道如何修改它以使其满足他们的需要。

1. 在所有代码的开头,我们看到前 3 个变量。

在这种情况下,我们要隐藏 3 个 sheet,这就是为什么只有 3 个变量。如果你想隐藏 5 sheets,你应该有 5 个变量。

在这里你可以随意命名它们。那么,引号内的文字就是你要隐藏的sheet的名字,所以你必须把它改成你的sheet的名字。

示例: var hideSheettt1 = 'Here you need to copy the name of your sheet';

2. 在前 3 个变量之后,我们有 4 个变量 hideMultipleSheets

在这种情况下,我们将前 3 个变量合并为一个变量,以便稍后在 onSelectionChange (e) 函数中重用它

在这里,您必须将 addFicha addGasto addIngreso 替换为您为第一个变量指定的名称。

继续第 1 点的示例,我们将使用 var hideSheettt1 = 'Here you need to copy the name of your sheet'; 作为参考。

示例:

var hideMultipleSheets = hideSheettt1 || hideSheettt2|| hideSheettt3;

3. 在 SheetChange (e) 函数中,您必须将前 3 个变量中的 .getSheetByName () 变量替换为您在整个代码的开头(第 1 点)。

示例:

var sheetToHide1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(hideSheettt1);

此时,您应该包含与要隐藏的 sheet 和您在代码开头创建的变量一样多的变量。在这种情况下,我们要隐藏 3 sheets。但是如果我们想隐藏 5 sheets,我们必须有 5 个变量,每个 sheet.

我们也必须有相同数量的 hideSheet()