向筛选范围添加行

问题描述 投票:0回答:3

我在谷歌表格中有一个待办事项列表应用程序。我有按“笔记类型”和“完成状态”进行过滤的功能,用户可以在任何给定时刻使用这些功能。

我还具有轻松添加任何给定类型的新注释的功能。但是,当运行该函数添加新注释并且工作表已被过滤时,我收到以下错误:

“具有筛选出的行的范围不支持此操作。”

关于如何向过滤范围添加行有什么建议吗?

这是我用来添加特定类型的新注释的代码:

function addNewCueNote() {
  if( sheet.getSheetName() == sheetName ) {
    var noteType = "CUE"

   //ADDS ROW AND COPIES FORMULA DOWN
  //SETS VARIABLES FOR LAST ROW AND LAST COLUMN
  var lRow = sheet.getLastRow(); 
  var lCol = sheet.getLastColumn();
  //INSERT LAST ROW  
  sheet.insertRowsAfter(lRow, 1);
  //COPY FORMULAS DOWN FOR SPECIFIED COLUMNS
  sheet.getRange(lRow,firstCopyCol,1,numColCopy).copyTo(sheet.getRange(lRow+1,firstCopyCol,1,numColCopy));

    //SETS NOTE TYPE    
    sheet.getRange(sheet.getLastRow(),noteTypeCol).setValue(noteType); 
}
google-apps-script google-sheets
3个回答
3
投票

抓住现有过滤器,将其从工作表中删除,添加新行,然后使用初始过滤器中的条件重新创建过滤器。

function addNewCueNote() {
  var sheet = SpreadsheetApp.getActiveSheet();  // added to get code to run; not sure if you handle elsewhere

  if (sheet.getSheetName() === sheetName) {

    // Save state of existing filter before removing it
    var oldCriteria = [];
    var filter = sheet.getFilter();
    if (filter != null) {
      var oldNumColumns = filter.getRange().getNumColumns();
      for (var c = 1; c <= oldNumColumns; c++) {
        var criteria = filter.getColumnFilterCriteria(c);
        if (criteria != null) {
          oldCriteria.push([c, criteria.copy()]);
        }
      }
      filter.remove();
    }


    //*** PUT YOUR ROW INSERT LOGIC HERE ***


    // Recreate filter on new data range
    var dataRange = sheet.getDataRange();
    var newFilter = dataRange.createFilter();
    if (filter != null) {
      var newNumColumns = dataRange.getNumColumns();
      for (var i = 0; i < oldCriteria.length && oldCriteria[i][0] <= newNumColumns; i++) {
        newFilter.setColumnFilterCriteria(oldCriteria[i][0], oldCriteria[i][1]);
      }
    }
}

0
投票

@Nick 你的代码逻辑有问题。无论如何,这是一个有效的代码

// *** I have to add this for tests ***
var firstCopyCol = 3;
var numColCopy = 2;
var noteTypeCol = 2;
var sheet = SpreadsheetApp.getActiveSheet();
var sheetName = 'MatchImport';

// ************************************

function addNewCueNote() {
  if (sheet.getSheetName() === sheetName) {
    var filter = sheet.getFilter();
    if (filter) {
      var dataRange = sheet.getDataRange();
      var oldNumColumns = filter.getRange().getNumColumns();
      var newNumColumns = dataRange.getNumColumns();
      var criterias = {};
      for (var c = 1; c <= oldNumColumns && c <= newNumColumns; c++) {
        var criteria = filter.getColumnFilterCriteria(c);
        if (criteria) criterias['_' + c] = criteria;
      }
      filter.remove();
    }

    // START OF YOUR INSERT LOGIC
    var noteType = 'CUE';

    // ADDS ROW AND COPIES FORMULA DOWN
    // SETS VARIABLES FOR LAST ROW AND LAST COLUMN
    var lRow = sheet.getLastRow();
    var lCol = sheet.getLastColumn(); // This is never used
    // INSERT LAST ROW
    sheet.insertRowsAfter(lRow, 1);

    // COPY FORMULAS DOWN FOR SPECIFIED COLUMNS

    sheet
      .getRange(lRow, firstCopyCol, 1, numColCopy)
      .copyTo(sheet.getRange(lRow + 1, firstCopyCol, 1, numColCopy));

    // SETS NOTE TYPE
    sheet.getRange(sheet.getLastRow(), noteTypeCol).setValue(noteType);

    //* * END OF YOUR INSERT LOGIC

    if (!filter) return;
    dataRange = sheet.getDataRange();
    var newFilter = dataRange.createFilter();
    newNumColumns = dataRange.getNumColumns();
    for (c = 1; c <= oldNumColumns && c <= newNumColumns; c++) {
      if (criterias['_' + c])
        newFilter.setColumnFilterCriteria(c, criterias['_' + c]);
    }
  }
}

0
投票

您好,您可以编辑这个吗,我的工作表名称是 test ///并且我想要过滤器名称是sheet3

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.