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

标签 google-apps-script google-sheets google-sheets-api

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

enter image description here

正如您在上面的屏幕截图中看到的那样,我可以使用 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]


设置过滤器:
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;
} 

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

最佳答案

  • 在您的情况下,用于过滤的脚本已经起作用。您需要用于从电子表格中过滤后的工作表中检索值的脚本。
  • 您想使用带有 Google Apps 脚本的 Sheets API 来实现这一点。

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

    在您的情况下,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;
    }
    

    结果:

    为过滤后的工作表运行上述脚本时,将返回具有隐藏行号、隐藏行值、显示行号和显示行值的以下对象。
    {
        "hiddenRows":[0,1],
        "hiddenRowValues":[["a1","b1","c1"],["a2","b2","c2"]],
        "shownRows":[2,3],
        "shownRowValues":[["a3","b3","c3"],["a4","b4","c4"]]
    }
    

    引用:
  • DimensionProperties

  • 如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    添加:

    这个示例脚本怎么样?在此示例脚本中,使用 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启用时,循环速度会很快。 Ref
  • 关于google-apps-script - 如何使用谷歌应用程序脚本编辑器过滤列中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60601116/

    相关文章:

    javascript - 自定义函数停止工作

    google-sheets-api - 如何读取命名范围内的数据?

    node.js - 如何在 NodeJS 中更新单元格数据而不清除先前的值(google-sheets-api)

    google-apps-script - 从 Google 表格的下一个单元格打开 URL

    javascript - 如何删除 Google 脚本中的 Google 缓存?

    arrays - 查询最小列标题,同时排除空白并处理重复项

    javascript - 遍历 json 并获取每个第 x 个对象值

    google-apps-script - 如何使用超链接添加或替换 Google 幻灯片注释文本?

    javascript - 如何以编程方式实时更新 Google 文档(通过 Chrome 扩展程序或外部 JS)

    javascript - 在表单提交时触发 Google 电子表格功能时遇到问题