Google apps script 如何使用google应用程序脚本编辑器过滤列中的数据

Google apps script 如何使用google应用程序脚本编辑器过滤列中的数据,google-apps-script,google-sheets,google-sheets-api,Google Apps Script,Google Sheets,Google Sheets Api,我面临一些与使用谷歌应用程序脚本编辑器过滤列中数据相关的问题 我可以使用谷歌应用程序脚本在列中设置一个过滤器,正如你在上面的屏幕截图中看到的那样。但问题是当我试图获取过滤后的数据时。它返回一些数字序列,而不是实际数据,如下所示: [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] 设置过滤器: function setFilter() { var s

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

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

[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]

设置过滤器:

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());
}
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;
} 
获取过滤后的数据:

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());
}
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;
} 
函数getFilteredRows(){ var ss=SpreadsheetApp.getActiveSpreadsheet(); var ssId=ss.getId(); var sheetId=ss.getActiveSheet().getSheetId(); let data=getIndexOfFilteredRows(ssId,sheetId); Logger.log(JSON.stringify(data)); } 函数GetIndexOfFilteredRows(ssId,sheetId){ var hiddenRows=[]; //限制从API返回的内容 var fields=“表(数据(行元数据(hiddenByFilter)),属性/sheetId)”; var sheets=sheets.Spreadsheets.get(ssId,{fields:fields}).sheets; 对于(变量i=0;i 如何在列中设置筛选器并使用google应用程序脚本获取筛选数据。
请帮我做这个

  • 在您的情况下,用于筛选的脚本已经起作用了。您需要用于从电子表格中的筛选表中检索值的脚本
  • 您希望通过使用带有Google Apps脚本的Sheets API来实现这一点
如果我的理解是正确的,这次修改怎么样?请把这看作是几个可能的答案之一

在您的例子中,
getIndexesOfFilteredRows
的函数被修改。使用
hiddenByFilter
,将隐藏行和显示行作为对象进行检索

修改脚本: 参考:
如果我误解了你的问题,而这不是你想要的方向,我道歉

补充: 这个示例脚本怎么样?在这个示例脚本中,使用
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)
}
  • 如果只想检索过滤后的值,此脚本可能比较合适
  • 在这种情况下,脚本可以在使用和不使用V8的情况下运行。但当V8启用时,环路速度将很快
谢谢您的回复@Tanaike。我会试试这个。其主要思想是以一种有效的方式从“工作表”中过滤数据,我们尝试迭代所有数据,然后返回响应,它起作用了;但是它非常慢。将尝试此解决方案并向您更新。@Chetan Sachdev感谢您的回复。从您的回复中,我又添加了一个示例脚本。您能确认一下吗?@Tanaike谢谢您的快速回复。我已经测试了第一个脚本,它按预期工作,并将检查第二个脚本。再次感谢您的时间。@Tanaike在运行第二个脚本时。。。获取以下错误:TypeError:无法读取null的属性“getDataRange”(第140行,文件“filter”)要运行脚本,我已经找到了解决方案并测试了脚本。它正在工作,并用一行更改更新了上述脚本。@Vaibhav Bhuva感谢您的回复和测试。我很高兴你的问题解决了。也谢谢你。