当前位置: 首页 > 知识库问答 >
问题:

将除了今天的列之外的所有列隐藏在四张表上(谷歌电子表格脚本)

华永逸
2023-03-14

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

尝试:在初始工作期间(仅创建了Class7A工作表),我使用这里找到的脚本的修改来工作(谢谢Jacob Jan Tutinga!):优化隐藏列的谷歌脚本

我对它进行了修改,以检查每列第三行中的值(周一为1,周二为2,等等),如果它与一周中某一天的数值不匹配(var d=new Date();var n=d.getDay();),然后它将隐藏该列。这个过程有点慢——我假设是因为对每一列都进行了迭代——但它起了作用。

非常激动,我继续添加了其余的工作表,然后再试一次——但编写的代码似乎只影响当前的工作表。我试图通过替换var sheet=ss来修改它。getSheets()[0];使用遍历列的for脚本,直到

决定返回并尝试调整脚本的原始版本,以代替为每个命名工作表显式运行多次,我发现该脚本似乎不再工作。我得到各种版本的“在工作表中找不到XX函数”或“在范围内找不到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);
}

共有1个答案

伍皓
2023-03-14

我不能重新创建脚本完全不工作的问题,它对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")});

现在我们可以遍历class Sheets,按名称获取工作表,并在每个工作表中隐藏列。
然而隐藏每个单独的列非常慢。
工作表构建得非常结构化,每周有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);
  });
}
 类似资料:
  • 我正在尝试从多个google电子表格中删除一个特定的表格。 我有一个主电子表格,从所有其他电子表格收集数据。从主电子表格中,我可以在其他电子表格中执行不同类型的操作,如添加工作表、重命名工作表、隐藏和锁定工作表。 但无法删除其他电子表格中的表格。查看了其他线程,但找不到任何解决方法。 这就是我到目前为止得到的。它停在这一排: "fname.delete表(本周);}" 我很感谢大家对我的帮助,因为

  • 试图复制整个电子表格,但我想没有api可以这样做。 基本上,我正在尝试做以下工作: 有一个电子表格,我想对其进行小的更改。 创建一个新的电子表格,将模板中的所有表格逐个复制到新的电子表格中(电子表格复制会更有效率) 创建新的电子表格工作正常,但从电子表格复制表格不起作用。 尝试了两种方法: 角: 给出以下错误: 对飞行前请求的响应未通过访问控制检查:无“访问控制允许原点” Google Sheet

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd

  • 我们使用Google Sheet API v4。我们希望用空数据清除整个工作表。我们不想删除行/列。 UpdateCells调用不起作用(通过API删除列):开发人员。谷歌。com 工作UpdateCells调用(所有单元格):开发人员。谷歌。com

  • 我正试图找到一个链接,允许我下载我的谷歌电子表格的CSV格式版本。目前我正在使用: 除了它只下载第一张工作表之外,这工作得很好。我的文档有多页。有人知道如何格式化这个链接,以便它下载所有的工作表或特定的工作表吗?类似的东西: 或者

  • 可编辑链接-https://docs.google.com/spreadsheets/d/1vrzchTHVwwzc9wgFGmtc_zBsh27CEtE7KOyeNDuLwC0/edit?usp=sharing 发布至网页-https://docs.google.com/spreadsheets/d/e/2PACX-1vRaJd3YpKnemAneU47RI58m7cxQsYFdViFBxJPV