2016-09-21 34 views
0

目標:我試圖創建Google Spreadsheets中四個類的行爲跟蹤器。跟蹤器有九張紙:Class7A,Class7B,Class8A,Class8B和週一至週五的彙總表。目標是每個ClassXX工作表具有整個星期的行爲跟蹤信息,但是默認視圖只顯示當天的信息。隱藏所有,但四個工作表上的今天的列(谷歌電子表格腳本)

嘗試:在初始檢查(僅創造了Class7A片),我得到了這個用在這裏找到腳本的修改工作(謝謝雅各月Tuinstra!):Optimize Google Script for Hiding Columns

我修改了它檢查每列第三行的值(週一持有1,週二持有2,等等),如果它不符合一週當天的數字(var d = new Date(); var n = d.getDay();),那麼它會隱藏該列。這個過程有點慢 - 我假設因爲迭代每列 - 但它的工作。

很興奮,我繼續添加紙張的休息,再次嘗試 - 但編寫的代碼,似乎隻影響當前工作表。我嘗試通過替換var sheet = ss.getSheets()[0];來修改它。使用迭代通過列的腳本,直到i> 4(我已經失去了那段代碼),沒有運氣。

決定回去試着將原始版本的腳本,而不是明確的運行對每一個命名錶多次,我發現該腳本似乎不再在所有的工作。我得到各種版本的「無法在表單中找到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); 
} 

回答

2

我不能重新創建腳本不工作,它的工作罰款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並獲得玉樹t按名稱並隱藏每個列。
但是隱藏每個單獨的列是非常緩慢的。
表格構建得非常結構化,每週有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); 
    }); 
} 
+0

謝謝你,這是完美的! – Lea

相關問題