Google表格:根据第1行中的日期隐藏列

时间:2016-02-04 18:05:15

标签: google-apps-script google-sheets data-hiding

我没有使用Excel或Google表格编写脚本的经验,因此我尝试分析一下,看看是否有我的问题的解决方案。我们在厨房改造业务中使用Google表格作为每周日历。我们将这些周从左到右组织起来,并列出我们目前在这些专栏中处理的工作。我想自动隐藏日期超过4周的所有列,因此当工作表打开时,我们不会从一年前的日期开始。我可以每周手动隐藏这些列,但是当我确实需要返回并查看前几周时,我不得不取消隐藏所有这些列,然后突出显示我想要重新隐藏的所有列。拥有脚本似乎是更好的解决方案。

有没有办法让每次文件打开时都运行一个脚本,以便我们始终只显示前4周和未来的所有内容?如果是这样,你愿意帮我理解我怎么写这个并让它运作起来吗?同样,对于公式以外的任何事情我都是新手,但对了解脚本功能更感兴趣。

谢谢!

Calendar

2 个答案:

答案 0 :(得分:0)

因为您没有"数据库,如"来源会非常困难,但你可以尝试创建一个非常复杂的

QUERY()

你应该过滤另一张纸上的日期(你可能面临死胡同)。

因此我建议使用this种结构,它还允许您在将来制作其他类型的过滤器(或数据透视表)(可维护和可扩展)。

答案 1 :(得分:0)

通过Tools->Script Editor Apps Script,您可以创建一个onOpen() function的菜单。菜单中的函数(例如hidePast)将需要检查每列中的给定值(以查看该列引用的日期),然后将其标记为隐藏或不隐藏。 onOpen函数,因为它是一个简单的触发器",不能做任何需要"授权" (例如与非本地电子表格数据交互),因此是中间方法。通过创建菜单,您可以让使用电子表格的任何人轻松授权和激活该功能。

示例:

/* @OnlyCurrentDoc */
function onOpen() {
    SpreadsheetApp.getActive().addMenu("Date Tools",
        [{name:"Hide Past", functionName:"hidePast"},
         {name:"Show All", functionName:"showAll"}]);
}
function showAll() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getActiveSheet();
    sheet.unhideColumn(sheet.getDataRange());
    ss.toast("All columns unhidden.");
}
function hidePast() {
    var ss = SpreadsheetApp.getActive();
    var sheet = ss.getActiveSheet();
    // Acquire the 1st row of all used columns as an array of arrays.
    var datelist = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn());

    // Drop the hours, minutes, seconds, etc. from today.
    var now = new Date();
    var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));

    // Inspect the datelist and compare to today. Start from the rightmost
    // column (assuming the dates are chronologically increasing).
    var col = datelist[0].length;
    while(--col >= 0) {
        var then = new Date(datelist[0][col]);
        if(then < today) {
            break;
        }
    }

    // Bounds check, and convert col into a 1-base index (instead of 0-base).
    if(++col < 1) return;

    // col now is the first index where the date is before today.
    // Increment again, as these are 2-column merged regions (and
    // the value is stored in the leftmost range). If not incremented,
    // (i.e. hiding only part of a merged range), spreadsheet errors will occur.
    sheet.hideColumn(sheet.getRange(1, 1, 1, ++col));
    ss.toast("Hid all the columns before today.");
}