如何将应用脚本中的Sheets.Spreadsheets.getByDataFilter用于在电子表格中创建的过滤器视图?

时间:2019-10-17 21:31:42

标签: google-apps-script google-sheets

我正在就以下案件寻求帮助

我有一个电子表格,其中包含一些过滤器视图-f1f2,...

我有一个与电子表格关联的应用脚本。我已启用Resources > Advanced Google Services来访问Sheets API v4

当前,我以

访问该数据
var fruits = Sheets.Spreadsheets.Values.get("1YBPXShvssFpTI-5dPSsy_N_iEVaeHezdxymsdxpTy6w", "Fruits!A:B").values;

然后我得到了相应的数据。 现在,我只想获取过滤器视图使用的数据,这样就不会带来不必要的全部数据,并且会减慢处理速度。

我看到有一个叫做Sheets.Spreadsheets.getByDataFilter(resource, spreadsheetId)的东西,但是我不确定如何创建资源对象。 给定我的过滤器并知道电子表格ID,我如何仅根据我知道的过滤器名称来获取数据?

更新
我最近的尝试是

var ss = SpreadsheetApp.getActiveSpreadsheet();

function getUnpostedItems() {
  Logger.log("This function will prioritize the new items that are added into the inventory");

 var sheet = ss.getSheetByName("Items");



  var filterSettings = {};
  filterSettings.criteria = {};
  var condition = {
    "condition": {
      "type": "LESS_THAN",
      "values": [
        { "userEnteredValue": "=NOW()-30" }
      ]
    }
  }

  filterSettings['criteria'][1] = {
    'condition': condition
  };

  var filterSettings = {
    range: {
      sheetId: sheet.getSheetId(),
    },
  }

  var req = {
    "setBasicFilter": {
      "filter": filterSettings
    }
  }

  // var items = Sheets.Spreadsheets.batchUpdate({'requests': [req]}, ss.getId());
  var items = ss.getRange("Items!A:B").getValues()
  // var items1 = Sheets.Spreadsheets.Values.get("1YBPXShvssFpTI-5dPSsy_N_iEVaeHezdxymsdxpTy6c", "Items!A:B").values
  Logger.log("Found items:" + items.length);


  return [];
}

但是到目前为止还没有运气!

1 个答案:

答案 0 :(得分:1)

根据@tanaike的帮助,我能够完成以下工作

function getUnpostedItems() {
  Logger.log("This function will prioritize the new items that are added into the inventory");

//  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
  var sheet = ss.getSheetByName("Items"); // Modified
  var values = sheet.getDataRange().getValues();
  Logger.log("VALUES "+values.length);

  //var newCriteria = SpreadsheetApp.newFilterCriteria().whenDateBefore(new Date()).build();
  var newCriteria = SpreadsheetApp.newFilterCriteria().whenDateBefore(subDaysFromDate(new Date(), 30)).build();
  var range = sheet.getFilter().setColumnFilterCriteria(1, newCriteria).getRange(); //The 1-indexed position of the column.  
  // values = range.getValues();

  // I added below script.
  var res = Sheets.Spreadsheets.get(ss.getId(), {
    ranges: ["Items"], // <--- Please set the sheet name.
    fields: "sheets/data"
  });
  var values = res.sheets[0].data[0].rowMetadata.reduce(function(ar, e, i) {
    if (!e.hiddenByFilter && res.sheets[0].data[0].rowData[i]) {
      ar.push(
        res.sheets[0].data[0].rowData[i].values.map(function(col) {
          return col.userEnteredValue[Object.keys(col.userEnteredValue)[0]];
        })
      );
    }
    return ar;
  }, []);

Logger.log("VALUES "+values.length);
  Logger.log("VALUES "+values);


  //Logger.log("Found Items:" + items.length);


  return [];
}