【问题标题】:Hide a sheet when I am active on another sheet当我在另一个工作表上处于活动状态时隐藏一个工作表
【发布时间】:2021-05-29 20:11:10
【问题描述】:

当我不活跃时,我试图自动隐藏名为“添加费用”的工作表。

例如。

我有“BD 费用”表格、“BD 代币”表格、“BD 收入”表格、“添加费用”表格、“添加收入”表格。

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

我目前有这个代码:

//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 和 stackoverflow 搜索过,但找不到解决这个问题的方法。

目前从编辑器运行脚本时,我收到错误“TypeError:sheets.forEach 不是函数”。

我无法让它工作。

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

非常感谢。

【问题讨论】:

标签: javascript google-apps-script google-sheets spreadsheet


【解决方案1】:

看起来有no specific Google Scripts event 供您更换工作表时使用。

issue tracker ticket 中提到了一种解决方法 - 滚动到票证底部以查看它。它涉及使用onSelectionChange(e) 来跟踪您移出和移入的工作表。

以下代码使该解决方法适应您的情况:

代码假定您的 Google 电子表格有 2 张或更多张 - 其中一张称为 Secret Sheet。您可以将此名称更改为您想要的任何名称(参见代码的第一行)。

当您从 Secret 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();
}

该脚本的工作原理是跟踪哪个工作表是当前活动工作表,以及哪个工作表是之前的(不同的)先前活动工作表。

它将“以前的”工作表名称存储在用户属性中。

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

function onSelectionChange(e) { ... }

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

【讨论】:

  • 非常感谢您的解释和帮助!非常感谢能够以这种方式学习。最后一个问题。我试图让代码在多张纸上运行,而不仅仅是一张。所以我正在使用 forEach 和 .getSheetByName (s);但这似乎由于某种原因不起作用。我怎样才能使它适用于多张纸?
【解决方案2】:

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

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

以@adrewjames 的代码为基础隐藏多张工作表的代码是这样的。

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 个工作表,这就是为什么只有 3 个变量。如果你想隐藏 5 个工作表,你应该有 5 个变量。

在这里,您可以随意命名它们。那么,引号中的文字就是您要隐藏的工作表的名称,因此您必须将其更改为工作表的名称。

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

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

在这种情况下,我们将前 3 个 var 连接成一个 var,以便稍后在 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 个 var 中 .getSheetByName () 的 var 替换为您在整个开头创建的 var 的名称代码(第 1 点)。

例子:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多