繁体   English   中英

Google Apps Scripts / Google Sheet - 禁用所有活动过滤器,显示特定单元格并根据条件再次过滤

[英]Google Apps Scripts / Google Sheet - Disable all the active filters, Show a specific cell and filter again based on criteria

我正在尝试在我的电子表格中创建一个自定义菜单,其中包含 2 个项目:

第一项:

  • 禁用特定工作表中的所有活动过滤器。
  • 在 B 列中显示最后一个空行(在我的示例表中:单元格 B15)
  • 在 B 列的最后一个空单元格中添加值 "> 在此处添加内容 <"

第 2 项:使用 B 列和 C 列的过滤器过滤数据,并仅保留最近 60 天的数据(如果代码是动态的,那就太好了)。

我已经开始研究第一个项目,但我被困在第二部分。 这是我的 GAS 电子表格示例,可帮助您了解我想要实现的目标。

https://script.google.com/u/0/home/projects/1rVwI5QMA35PksB9csKvMhxWpCHeLEbdKAo5UWb8y9GFGtdHpHsOwkva6/edit

https://docs.google.com/spreadsheets/d/11ptkjp5UySKc0iwZTu3QUrJVKds6t4W5eMD39XVUbME/edit#gid=0

对此的任何帮助将不胜感激。

我相信你的目标如下。

  • 您想将> Add Content here <的值放入“B”列的第一个空行。
  • 您想要显示“B”和“C”列的年份和月份值是过去 60 天的行。
  • 您想使用基本过滤器来实现此过滤器。

当我看到您的示例脚本时,我发现了以下示例脚本。

// first item - working
function prepareForContentAddition() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Dashboard');
  var filter = sheet.getFilter();
  if (filter !== null) {  
    var range = filter.getRange(); 
    var firstColumn = range.getColumn();
    var lastColumn = range.getLastColumn();
    for (var i = firstColumn; i < lastColumn; i++) {
      filter.removeColumnFilterCriteria(i);
    }
  }
// Show the last empty row / blank cell in Column B and add "> Add Content here <" in it
  var lastRow = sheet.getRange('Dashboard!B3:B').getLastRow();
  sheet.getRange(lastRow, +1,1).activate();
}

// Apply 2 months filtering starting from today
function backToFiltering() {
}

当这个脚本被修改了,下面的修改呢?

修改后的脚本:

function prepareForContentAddition() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Dashboard');
  var filter = sheet.getFilter();
  if (filter !== null) {
    var range = filter.getRange();
    var firstColumn = range.getColumn();
    var lastColumn = range.getLastColumn();
    for (var i = firstColumn; i < lastColumn; i++) {
      filter.removeColumnFilterCriteria(i);
    }
  }

  // I added below script.
  Object.prototype.get1stNonEmptyRowFromBottom = function (columnNumber, offsetRow = 1) { // Ref: https://stackoverflow.com/a/44563639
    const search = this.getRange(offsetRow, columnNumber, this.getMaxRows()).createTextFinder(".").useRegularExpression(true).findPrevious();
    return search ? search.getRow() : offsetRow;
  };
  var row = sheet.get1stNonEmptyRowFromBottom(2);
  sheet.getRange(row + 1, 2).setValue("> Add Content here <");
}

function backToFiltering() {
  const date = new Date();
  date.setDate(date.getDate() - 60);
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Dashboard');
  var filter = sheet.getFilter();
  if (filter !== null) {
    filter.setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThanOrEqualTo(year).build()).setColumnFilterCriteria(3, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThan(month).build());
  }
}
  • 在这个修改中,我认为可以得到你预期的情况。 显示2022, 82022, 9 但是,当您要显示2022, 7 , 2022, 82022, 9时,请进行如下修改。

    •  filter.setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThanOrEqualTo(year).build()).setColumnFilterCriteria(3, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThan(month).build());
    •  filter.setColumnFilterCriteria(2, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThanOrEqualTo(year).build()).setColumnFilterCriteria(3, SpreadsheetApp.newFilterCriteria().whenNumberGreaterThanOrEqualTo(month).build());

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM