【问题标题】:How to use filter function within another function如何在另一个函数中使用过滤器函数
【发布时间】:2019-02-18 01:21:45
【问题描述】:

我是谷歌表格编程的新手。我找到了创建自定义菜单的代码,并用它来隐藏工作表中的特定列(菜单选择允许用户选择谷歌工作表中数据的特定视图,而无法编辑原始数据)。隐藏列后,我想根据特定列(票证类型)中的值对数据使用过滤器。我不知道如何让过滤器的代码在隐藏列后运行。我尝试了许多变体(包括引用第二个函数)并在函数中查找函数,但没有成功找到解决方案。我想我可以过滤类似于隐藏列,但它不起作用。关于如何使其工作的建议?

function showReservationView() {
    {
        var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
        showAll();
        sheet.hideColumn(sheet.getRange("B1:F1"));
        sheet.hideColumn(sheet.getRange("H1"));
        sheet.hideColumn(sheet.getRange("K1:U1"));
        sheet.hideColumn(sheet.getRange("W1:Z1"));
        sheet.hideColumn(sheet.getRange("AB1:AK1"));
        sheet.hideColumn(sheet.getRange("AM1"));
        sheet.hideColumn(sheet.getRange("AO1:AP1"));
        sheet.hideColumn(sheet.getRange("AR1:BC1"));
        sheet.hideColumn(sheet.getRange("BE1:BR1"));
    }
    function setFilter() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var filterSettings = {};

        filterSettings.range = {
            sheetId: ss.getActiveSheet().getSheetId()
        };

        // Criteria for showing/hiding rows in a filter
        // https://developers.google.com/sheets/api/reference/rest/v4/FilterCriteria
        filterSettings.criteria = {};
        var columnIndex = 7;
        filterSettings['criteria'][columnIndex] = {
            'hiddenValues': [
                "EARLY BIRD - Top Tier Full Week Residential Pass",
                "Top Tier Full Week Residential Pass",
                "GROUP DISCOUNT - Top Tier Full Week Residential Pass",
                "EARLY BIRD - Middle Tier Residential Pass",
                "Middle Tier Residential Pass",
                "GROUP DISCOUNT - Middle Tier Residential Pass",
                "EARLY BIRD - Courtyard Room Pass",
                "Courtyard Room Pass",
                "GROUP DISCOUNT - Courtyard Room Pass",
                "Non-Residential Week Pass",
                "GROUP DISCOUNT - Non-Residential Week Pass",
                "Indian Citizen Week Pass",
                "Day Pass",
                "Donation to the Swami Shukdevanand Trust",
                "Teacher/Presenter Ticket",
                "Sevak Ticket",
                "Infant Ticket",
                "Media Day Pass",
                "Media Non-Residential Week Pass",
                "Media Residential Week Pass",
                "Special Guest Residential Pass"
            ]
        };

        var request = {
            "setBasicFilter": {
                "filter": filterSettings
            }
        };
        Sheets.Spreadsheets.batchUpdate({'requests': [request]}, ss.getId());
    }
}

【问题讨论】:

  • 什么不起作用?究竟如何“不工作”?仅仅说“它不起作用”不是一个有效的问题描述。为您所做的每次尝试提供错误消息和与预期行为不同的详细描述。这表明您努力寻找解决方案。您还应该提供您为解决问题所做的研究的证据。您说您找到了执行此操作的代码 - 为什么不引用实际作者?
  • 请注意,您在其他函数的定义中定义了过滤器函数。虽然有效,但这意味着您不能在除 showReservationView 之外的任何其他代码中使用您的 setFilter 函数,因为它不在脚本项目的全局命名空间中
  • 你好。感谢您的反馈和问题。对于自定义菜单,我使用了这个链接:webapps.stackexchange.com/questions/82666/…。我根据需要修改了菜单名称和要隐藏的列。该功能工作正常。我可以根据从自定义菜单中选择的菜单隐藏不同的列集。下一步是我想根据票证类型应用过滤器:sites.google.com/site/scriptsexamples/learn-by-example/…。
  • 我使用了来自这个谷歌链接的代码:sites.google.com/site/scriptsexamples/learn-by-example/…。我意识到这是第二个过滤器。所以,这些是我的引文。
  • SetFilter 函数在另一个函数中设置 - 并且没有运行。列隐藏得很好,但过滤器不适用。我现在还可以,过滤器功能只运行 1 个视图。我无法找到在另一个函数中运行函数的任何引用。

标签: google-apps-script filter google-sheets


【解决方案1】:

您的代码只是声明变量setFilter 是对function object 的引用——它绝不是calls / invokes the function。在您尝试调用函数对象之前,这就是它的全部内容 - 对象引用。即使它是对函数对象的引用。

将setFilter 的声明嵌套为函数内的函数对象(例如function foo())意味着函数foo 之外的任何其他函数都不能访问该特定函数对象。其他一些函数(或全局函数)可能会说 setFilter 是一个值为 1 的变量:

var setFilter = 1; // globally scope `setFilter` to be value 1.
function foo() {
  Logger.log(typeof setFilter); // number
  try { setFilter() }
  catch (err) { Logger.log(err) } // TypeError: setFilter is not a function, it is number.
}
function foo2() {
  // Define what `setFilter` means within the context (namespace scope) of `foo2`
  // This declaration will shadow the global declaration within this function context.
  function setFilter() { /** code */ };
  Logger.log(typeof setFilter); // function
  setFilter(); // no TypeError from calling a non-function
}

要总结链接的功能指南,您需要执行以下操作:

function showReservationView() {
  function setFilter(/** add parameters for the function here */) {
    // code here
  }

  // Treat the nearest namespace scope declaration of `showAll` as 
  // a function object by calling it.
  showAll();

  // Hide all the column ranges we want to hide.
  const sheet = SpreadsheetApp.getActive().getActiveSheet(),
        rangesToHide = [
          "B1:F1", "H1", "K1:U1", "W1:Z1", "AB1:AK1",
          "AM1", "AO1:AP1", "AR1:BC1", "BE1:BR1"
        ];
  sheet.getRangeList(rangesToHide).getRanges().forEach(function (rg) {
    sheet.hideColumn(rg);
  });

  // Treat the nearest namespace scope declaration of `setFilter` as 
  // a function object by calling it.
  setFilter();
}

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多