在四个表格中隐藏除today's以外的所有列(Google Spreadsheets脚本)

Hide all but today's columns on four sheets (Google Spreadsheets script)

本文关键字:脚本 Spreadsheets Google 表格 四个 隐藏 today      更新时间:2023-09-26

目标:我试图在谷歌电子表格中创建四个类的行为跟踪器。跟踪器有九张表:Class7A、Class7B、Class8A、Class8B和周一至周五总结表。我们的目标是让每个ClassXX表都有一整周的行为跟踪信息,但是默认视图只显示当天的信息。

尝试:在初始工作期间(仅创建Class7A表),我使用这里发现的脚本的修改来工作(感谢Jacob Jan Tuinstra!):优化Google脚本隐藏列

我修改了它来检查每列的第三行中的值(其中保存了星期一的1,星期二的2,等等),如果它与一周中的一天的数值不匹配(var d = new Date();var n = d.getDay();),那么它将隐藏该列。这个过程有点慢——我猜想是因为要遍历每一列——但它是有效的。

非常兴奋,我继续添加其余的工作表,并再次尝试-但代码编写,似乎只影响当前的工作表。我尝试通过替换var sheet = ss.getSheets()[0]来修改它;with for脚本遍历这些列,直到i>4(我已经丢失了这段代码),没有运气。

决定回去并尝试调整脚本的原始版本,而不是显式运行多次为每个命名表,我发现该脚本似乎不再工作在所有。我得到各种版本的"无法在表中找到XX函数"或"无法在范围中找到XX函数"。

来源:可以在这里找到共享版本(删除了学生信息):https://docs.google.com/spreadsheets/d/1OMq4a4_Gh_xyNk_IRy-mwJn5Hq36RXmdAzTzx7dGii0/edit?usp=sharing(正在编辑)。

Stretch Goal:最终,我需要让它可靠地只显示当前的列(通过预设范围(每个工作表相同)或1-5个值),并且我需要它为所有四个ClassXX工作表这样做,但不是摘要页面(最好比迭代更快)。如果有必要,我可以删除摘要页面并在外部设置它们,但这不是我的首选。我将非常感谢任何帮助;到目前为止,我的尝试似乎只会让我倒退。

谢谢!

当前代码:

function onOpen() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // create menu
  var menu = [
    {name: "Show Today Only", functionName: "hideColumn"},
    {name: "Show All Days", functionName: "showColumn"},
    {name: "Clear Week - WARNING will delete all data", functionName: "clearWeek"}
  ];
  // add to menu
  ss.addMenu("Show Days", menu);
}
var d = new Date();
var n = d.getDay();

function hideColumn() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // get first sheet
  var sheet = ss.getSheets()[0];
  // get data
  var data = sheet.getDataRange();
  // get number of columns
  var lastCol = data.getLastColumn()+1;
  Logger.log(lastCol);
  // itterate through columns
  for(var i=1; i<lastCol; i++) {
     if(data.getCell(2, i).getValue() != n) {
        sheet.hideColumns(i);
     }
  }
}

function showColumn() {
  // get active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  // get first sheet
  var sheet = ss.getSheets()[0];
  // get data
  var data = sheet.getDataRange();
  // get number of columns
  var lastCol = data.getLastColumn();
  // show all columns
  sheet.showColumns(1, lastCol);
}

我无法重新创建脚本不工作的问题,它的工作很好为Class7A,所以部分工作良好。

那么让我们看看另外两个问题:

  1. 将此应用于所有表
  2. 加速脚本

首先让我们创建两个函数中使用的全局变量

var d = new Date();
var n = d.getDay();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetNames = ss.getSheets().map(function(sheet) {return sheet.getName();});
var classSheets = sheetNames.filter(function(sheetName) {return sheetName.match("Class")});

现在我们可以遍历classSheets并根据名称获取表格并隐藏其中的列。
然而,隐藏每个单独的列非常慢。
工作表是非常结构化的,每周有12列(除了星期五没有灰色条),所以我们可以计算我们想要隐藏的范围。

function hideColumn() {
  classSheets.map(function(sheetName){
    var sheet = ss.getSheetByName(sheetName);
    if (n == 1) {
      // Hide everything after the first three columns + Monday
      sheet.hideColumns(3 + 11, 12 * 4); 
    } else if (n == 5) { 
      // Hide everything to the left except the leftmost three columns 
      sheet.hideColumns(3, 4 * 12);
    } else {
      // Hide everything left of the current day
      sheet.hideColumns(3, (n - 1) * 12);
      // Hide everything after the current day
      sheet.hideColumns(3 + n * 12, (5 - n) * 12 - 1);
    }
  });
}

最后可以缩短showColumn

function showColumn() {
  classSheets.map(function(sheetName){
    var sheet = ss.getSheetByName(sheetName);
    var lastCol = sheet.getLastColumn();
    sheet.showColumns(1, lastCol);
  });
}