在四个表格中隐藏除today's以外的所有列(Google Spreadsheets脚本)
Hide all but today's columns on four sheets (Google Spreadsheets script)
目标:我试图在谷歌电子表格中创建四个类的行为跟踪器。跟踪器有九张表: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,所以部分工作良好。
那么让我们看看另外两个问题:
- 将此应用于所有表
- 加速脚本
首先让我们创建两个函数中使用的全局变量
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);
});
}
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 当脚本由system.js加载时,如何要求('electron')
- HTML标记在脚本标记中工作
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 使用谷歌应用程序脚本从工作表中获取值并将其显示在文本框中
- 显示时间的脚本
- ng应用程序使脚本无限运行
- 如何在运行时在angular 2中加载外部js脚本
- Google Spreadsheets脚本可以删除找到字符串的任何行
- 在四个表格中隐藏除today's以外的所有列(Google Spreadsheets脚本)