如何使用谷歌应用程序脚本编辑器过滤列中的数据

Vai*_*uva 5 google-sheets google-apps-script google-sheets-api

我正面临一些与使用 google 应用程序脚本编辑器过滤列中的数据相关的问题。

在此处输入图片说明

正如您在上面的屏幕截图中看到的那样,我可以使用 google 应用程序脚本在列中设置过滤器。但问题是当我试图获取过滤后的数据时。它返回一些数字系列而不是实际数据,如下所示:

[20-03-09 18:19:48:395 IST] [1,2,4,5,6,8,9,10,11,12,13,14,15,19,20,21,22,23,24,26,27,28,29,30]

Run Code Online (Sandbox Code Playgroud)

设置过滤器:

function setFilter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var filterSettings = {};

  // The range of data on which you want to apply the filter.
  // optional arguments: startRowIndex, startColumnIndex, endRowIndex, endColumnIndex
  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 = 2;
  filterSettings['criteria'][columnIndex] = {
    'hiddenValues': ["England", "France"]
  };

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

获取过滤后的数据:

function getFilteredRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheetId = ss.getActiveSheet().getSheetId();
  let data = getIndexesOfFilteredRows(ssId,sheetId);
  Logger.log(JSON.stringify(data));
}

function getIndexesOfFilteredRows(ssId, sheetId) {
  var hiddenRows = [];

  // limit what's returned from the API
  var fields = "sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)";
  var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets;  
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].properties.sheetId == sheetId) {
      var data = sheets[i].data;
      var rows = data[0].rowMetadata;
      for (var j = 0; j < rows.length; j++) {
        if (rows[j].hiddenByFilter) hiddenRows.push(j);
      }
    }
  }
  return hiddenRows;
} 
Run Code Online (Sandbox Code Playgroud)

如何在列中设置过滤器并使用谷歌应用程序脚本获取过滤后的数据。
请帮我解决一下这个。

Tan*_*ike 2

  • 就您而言,过滤脚本已经起作用。您需要脚本从电子表格中的过滤表中检索值。
  • 您希望使用 Sheets API 和 Google Apps 脚本来实现此目的。

如果我的理解是正确的,那么这个修改怎么样?请将此视为几个可能答案之一。

在您的情况下, 的功能getIndexesOfFilteredRows已被修改。使用hiddenByFilter,隐藏行和显示行将作为对象进行检索。

修改后的脚本:

function getIndexesOfFilteredRows(ssId, sheetId) {
  var object = {hiddenRows: [], hiddenRowValues: [], shownRows: [], shownRowValues: []};

  // limit what's returned from the API
  var fields = "sheets(data,properties/sheetId)";
  var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets;  
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].properties.sheetId == sheetId) {
      var data = sheets[i].data;
      var rows = data[0].rowMetadata;
      for (var j = 0; j < rows.length; j++) {
        var r = [];
        if (data[0].rowData[j] && Array.isArray(data[0].rowData[j].values)) {
          r = data[0].rowData[j].values.map(function(e) {
            var temp = "";
            if (e.hasOwnProperty("userEnteredValue")) {
              if (e.userEnteredValue.hasOwnProperty("numberValue")) {
                temp = e.userEnteredValue.numberValue;
              } else if (e.userEnteredValue.hasOwnProperty("stringValue")) {
                temp = e.userEnteredValue.stringValue;
              }
            }
            return temp;
          });
        }
        if (r.length > 0) {
          if (rows[j].hiddenByFilter) {
            object.hiddenRows.push(j);
            object.hiddenRowValues.push(r);
          } else {
            object.shownRows.push(j);
            object.shownRowValues.push(r);
          }
        }
      }
    }
  }
  return object;
}
Run Code Online (Sandbox Code Playgroud)

结果:

当对过滤后的工作表运行上述脚本时,将返回以下对象,其中包含隐藏行号、隐藏行值、显示行号和显示行值。

{
    "hiddenRows":[0,1],
    "hiddenRowValues":[["a1","b1","c1"],["a2","b2","c2"]],
    "shownRows":[2,3],
    "shownRowValues":[["a3","b3","c3"],["a4","b4","c4"]]
}
Run Code Online (Sandbox Code Playgroud)

参考:

如果我误解了你的问题并且这不是你想要的方向,我很抱歉。

添加:

这个示例脚本怎么样?在此示例脚本中,可以将过滤后的值filterValues作为对象进行检索。setFilter()在这种情况下,结果与您的和修改后的结果相同getIndexesOfFilteredRows()。但没有使用基本过滤器。所以请小心这一点。

function myFunction() {
  var filterValues = ["England", "France"]; // Please set the filter values.
  var column = 3; // In this case, it's the column "C". Please set the column number.
  var sheetName = "Sheet1";  // Please set the sheet name.

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetName);
  var values = sheet.getDataRange().getValues();
  var object = values.reduce(function(o, e, i) {
    if (filterValues.indexOf(e[column - 1]) > -1) {
      o.hiddenRows.push(i + 1);
      o.hiddenRowValues.push(e);
    } else {
      o.shownRows.push(i + 1);
      o.shownRowValues.push(e);
    }
    return o;
  }, {hiddenRows: [], hiddenRowValues: [], shownRows: [], shownRowValues: []});

  Logger.log(object)
}
Run Code Online (Sandbox Code Playgroud)
  • 如果您只想检索过滤后的值,此脚本可能适合。
  • 在这种情况下,脚本可以在有或没有 V8 的情况下运行。但是当V8启用时,循环速度会很快。参考号