簡體   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