在四张纸上隐藏除了今天的所有列(Google Spreadsheets脚本)

时间:2016-09-21 14:17:29

标签: javascript google-apps-script

目标:我正在尝试为Google Spreadsheets中的四个类创建一个行为跟踪器。跟踪器有九张:Class7A,Class7B,Class8A,Class8B和Mon-Fri摘要表。目标是每个ClassXX工作表都有一整周的行为跟踪信息,但默认视图只显示当天的信息。

尝试:在初始处理期间(仅创建了Class7A表),我使用此处的脚本修改工作(感谢Jacob Jan Tuinstra!):{{3} }

我修改它以检查每列的第三行中的值(周一为1,周二为2等),如果它与星期几的数值等值不匹配(var d) = new Date(); var n = d.getDay();),然后它将隐藏该列。这个过程有点慢 - 我假设是因为迭代了每一列 - 但它确实有效。

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

决定返回并尝试调整脚本的原始版本,而不是为每个命名工作表显式运行多次,我发现该脚本似乎根本不起作用。我得到各种版本的“无法在工作表中找到XX功能”或“在范围内找不到XX功能”。

来源:可以在此处找到共享版本(学生信息已清除):Optimize Google Script for Hiding Columns(已启用编辑功能)。

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

1 个答案:

答案 0 :(得分:3)

我无法重新创建脚本根本无法正常工作的问题,它对Class7A工作正常,因此该部分工作正常。

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

  1. 将此应用于所有表格
  2. 加速编写剧本
  3. 首先让我们创建一些我们在两个函数中使用的全局变量

    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);
      });
    }