目标:我正在尝试为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);
}
答案 0 :(得分:3)
我无法重新创建脚本根本无法正常工作的问题,它对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);
});
}