【问题标题】:Hide all but today's columns on four sheets (Google Spreadsheets script)在四张纸上隐藏除今天以外的所有列(Google 电子表格脚本)
【发布时间】:2016-09-22 19:00:51
【问题描述】:

目标:我正在尝试为 Google 电子表格中的四个类创建一个行为跟踪器。跟踪器有九张表:Class7A、Class7B、Class8A、Class8B 和周一至周五摘要表。目标是让每个 ClassXX 工作表都包含一整周的行为跟踪信息,但默认视图仅显示当天的信息。

尝试:在初始检查期间(仅创建 Class7A 表),我使用此处找到的脚本的修改使其工作(感谢 Jacob Jan Tuinstra!):Optimize Google Script for Hiding Columns

我对其进行了修改以检查每列第三行中的值(其中周一为 1,周二为 2,等等),以及它是否与一周中的某一天的数值等值不匹配(var d = new Date(); var n = d.getDay();),那么它将隐藏该列。这个过程有点慢 - 我假设是因为遍历每一列 - 但它有效。

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

决定返回并尝试调整脚本的原始版本,改为为每个命名工作表显式运行多次,我发现该脚本似乎根本不再工作。我得到各种版本的“在工作表中找不到 XX 函数”或“在 Range 中找不到 XX 函数”。

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

延伸目标:最终,我需要让它可靠地仅显示当天的列(通过预设范围(每张纸相同)或 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);
}

【问题讨论】:

    标签: javascript google-apps-script


    【解决方案1】:

    我无法重现脚本根本不工作的问题,它对 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);
      });
    }
    

    【讨论】:

    • 谢谢,这太完美了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多