【问题标题】:Sort by Named Range in Dropdown List按下拉列表中的命名范围排序
【发布时间】:2020-07-25 01:03:20
【问题描述】:

我正在尝试使用 Google Apps 脚本创建排序函数。我在 Google 工作表中有大约 20 列,希望用户能够通过单击按钮而不是使用过滤器视图对工作表进行排序,因为他们一直在搞砸。

我想要一个带有脚本的按钮,而不是每列有 20 个按钮,该按钮链接到与列标题相同的命名范围下拉列表。

不确定这是否可行,但这是我的工作表示例:

我正在努力让这个脚本工作:

    function sortByRangeName(rangeName){
      var ss = SpreadsheetApp.getActive();
      var sheet = ss.getSheetByName('Sheet 1');
      var namedRange = ss.getRangeByName();
      var startCol = namedRange.getColumn();
      var lastCol = namedRange.getLastColumn();
      var range = sheet.getRange('E1');
      var value = range.getValue();
      var rangeName = ss.getRangeByName(value);
      var columnForSorting = (startCol <= dataRange.getLastColumn()) ? startCol : null;
      if (namedRange && (startCol == lastCol) && columnForSorting) {
        dataRange.sort({column: columnForSorting, ascending: false});
      } 
      else {
        throw new Error(Utilities.formatString("Range name: %s, startCol: %s, lastCol: %s, columnForSorting: %s", header, startCol, lastCol, columnForSorting));
      }
    }

这是我的电子表格的链接:

Sample Spreadsheet

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    尝试使用此函数的可安装 onEdit():

    function sortByColumn(e) {
      const sh=e.range.getSheet();
      if(sh.getName()=='Sheet 1' && e.range.columnStart==5 && e.range.rowStart==1 && e.value) {
        const hA=sh.getRange(2,1,1,sh.getLastColumn()).getValues()[0];
        const col={};
        hA.forEach(function(h,i){col[h]=i+1;});
        const rg=sh.getRange(3,1,sh.getLastRow()-2,sh.getLastColumn());
        rg.sort({column:col[e.value],ascending:true});
      }
    }
    

    【讨论】:

    • 供我以后参考,你能告诉我“hA”是什么意思吗
    • 通常我用它来表示标题数组。我倾向于在所有代码中使用相同的缩写。
    【解决方案2】:

    我相信你的目标如下。

    • You want to sort the range of "A3:E" with each column using the named ranges when the dropdown list at the cell "E1" on "Sheet 1" is selected.

    修改点:

    • 在您的脚本中,

      • var namedRange = ss.getRangeByName(),没有使用参数。
      • dataRange 未声明。
      • 解决上述问题后,脚本就可以工作了。但在这种情况下,很遗憾,您的目标无法实现。
    • 为了达到上述目的,在这个答案中,使用了 OnEdit 事件触发器。

    • 在您的下拉列表中,似乎有包含空格的名称。请注意这一点。为此,我使用了trim()

    修改脚本:

    请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。并且,请选择下拉列表。这样,值将使用命名范围和下拉列表选择的列进行排序。

    function onEdit(e) {
      var range = e.range;
      var sheet = range.getSheet();
      if (sheet.getSheetName() != "Sheet 1" || range.getA1Notation() != "E1") return;
      sheet.getDataRange().offset(2, 0).sort({
        column: e.source.getRangeByName(e.value.trim()).getColumn(),
        ascending: false
      });
    }
    

    注意:

    • 当问题从您的脚本中删除时,它变成如下。我认为了解脚本中的修改点可能有助于研究脚本。所以我也加了这个。

        function sortByRangeName(rangeName){
          rangeName = "Branch";  // This is a sample value
      
          var ss = SpreadsheetApp.getActive();
          var sheet = ss.getSheetByName('Sheet 1');
          var namedRange = ss.getRangeByName(rangeName.trim());  // Modified
          var startCol = namedRange.getColumn();
          var lastCol = namedRange.getLastColumn();
          var range = sheet.getRange('E1');
          var value = range.getValue();
          var rangeName = ss.getRangeByName(value);
          var dataRange = sheet.getDataRange().offset(2, 0); //  Added
          var columnForSorting = (startCol <= dataRange.getLastColumn()) ? startCol : null;
          if (namedRange && (startCol == lastCol) && columnForSorting) {
            dataRange.sort({column: columnForSorting, ascending: false});
          } else {
            throw new Error(Utilities.formatString("Range name: %s, startCol: %s, lastCol: %s, columnForSorting: %s", header, startCol, lastCol, columnForSorting));
          }
        }
      

    参考资料:

    【讨论】:

    • @McChief 感谢您的回复。我愿意支持你。但是,我的回答是针对您在问题中的形象。因此,当您的 my actual spreadsheet 与此不同时,脚本可能无法正常工作。对于我的脚本不能用于各种电子表格,我深表歉意。在这种情况下,需要为其创建脚本。但是我无法理解您的my actual spreadsheet,所以为了正确理解它,您可以将它作为包含详细信息的新问题发布吗?借此,我想确认一下。如果您能合作解决您的问题,我很高兴。
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多