Как использовать Sheets.Spreadsheets.getByDataFilter из сценария приложения для представления фильтра, созданного в электронной таблице? - PullRequest
1 голос
/ 18 октября 2019

Мне нужна помощь в следующем случае

У меня есть электронная таблица, и она содержит несколько видов фильтров - f1, f2, ...

У меня есть приложениескрипт, связанный с электронной таблицей. Я включил 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), но я не уверен, как создать объект ресурса. Учитывая мои фильтры и зная идентификатор электронной таблицы, как мне получить данные только на основе известных им имен фильтров?

ОБНОВЛЕНИЕ
Моя последняя попытка выглядит как

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 Ответ

1 голос
/ 18 октября 2019

Благодаря помощи @ 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 [];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...