Получение выборочных строк в Google Sheet на основе условий - PullRequest
0 голосов
/ 12 мая 2019

В Googlesheet я хотел выбрать определенные строки на основе даты. Мне известно о функции getRange (), но я не знаю, как добавить условие к этой функции. Например, если у меня есть 10 строк в электронной таблице, из которых:

  1. Две строки имеют столбец даты с датой 01/01 / 2019.
  2. Три строки имеют столбец с датой 01/07/2019.
  3. Остальные пять строк имеют столбец даты с датой 01/20/2019.

Я пытаюсь найти способ написания сценария google sheet , чтобы вытащить все строки со столбцом даты в период с 31.12.2017 по 01.09.2009, и в этом конкретном случае я должен получить пять строк .

Я написал приведенный ниже код для создания нового листа, но не знал, как выбрать диапазон с условием:

  var spreadsheet = SpreadsheetApp.getActive();
  var sheets = spreadsheet.getSheets();
  var mainSheet = sheets[0];  
  var fileName = mainSheet.getRange("B2:C2").getDisplayValue();
  var date = Utilities.formatDate(new Date(), "GMT+5", "yyyy-MM-dd")
  var newFileName = "WS_"+date;
  var dataSheetFileList = DriveApp.getFilesByName(fileName);
  var dataSheetFile = dataSheetFileList.next();
  dataSheetFile.makeCopy(newFileName)
  var newFileUrl = DriveApp.getFilesByName(newFileName).next().getUrl();

  var newFile = DriveApp.getFilesByName(newFileName);
  newFile.next().setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.EDIT);

  var dataSheetFileList = DriveApp.getFilesByName(newFileName); 
  if(dataSheetFileList.hasNext()){
    var dataSheetFile = dataSheetFileList.next();
    var dataSheet = SpreadsheetApp.open(dataSheetFile);
    var dataSheetList = dataSheet.getSheets();
    var dataSheetCcb = dataSheetList[0];
    **<Code to select the rows based on date>**
  }

Пример ввода данных Google Листа enter image description here

Я собираюсь автоматически создать сводную таблицу Google (скриншот ниже ), используя приведенный выше образец Google Sheet: enter image description here

1 Ответ

2 голосов
/ 12 мая 2019

Есть моя реализация

/* exported onOpen, userActionSelectByCondition, rowSelector_, userActionSelectByDateCondition */

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Advansed selector')
    .addItem('Select between 40 and 1000', 'userActionSelectByCondition')
    .addItem(
      'Select between 01/02/2019 and 01/04/2019',
      'userActionSelectByDateCondition'
    )
    .addToUi();
}

/**
 * Select rows of the active sheet by condition
 */
function userActionSelectByCondition() {
  var /** @type {condition} */ condition = function(row) {
      return row[0] > 40 && row[0] < 1000;
    };

  var sheet = SpreadsheetApp.getActiveSheet();

  rowSelector_(sheet, condition);
}

/**
 * Select rows of the active sheet by condition
 */
function userActionSelectByDateCondition() {
  var date1 = new Date(2019, 0, 2, 0, 0, 0, 0).getTime();
  var date2 = new Date(2019, 0, 4, 0, 0, 0, 0).getTime();
  var /** @type {condition} */ condition = function(row) {
      return (
        row[2] &&
        row[2].getTime &&
        row[2].getTime() > date1 &&
        row[2].getTime() < date2
      );
    };

  var sheet = SpreadsheetApp.getActiveSheet();

  rowSelector_(sheet, condition);
}

/**
 *
 * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
 * @param {condition} callback
 * @returns {GoogleAppsScript.Spreadsheet.RangeList}
 */
function rowSelector_(sheet, callback) {
  return sheet
    .getRangeList(
      sheet
        .getDataRange()
        .getValues()
        .reduce(function(p, c, i) {
          if (callback(c)) p.push(i + 1 + ':' + (i + 1));
          return p;
        }, [])
    )
    .activate();
}

/**
 * Callback for condition
 *
 * @callback condition
 * @param {Array<object>} row A row of the sheet
 * @returns {boolean}
 */

Пример https://docs.google.com/spreadsheets/d/1i7h3CpWa6SEFK8uegNIcKJcpeg1n1-FdyjUwGWicm_M/edit?usp=sharing и видео https://www.facebook.com/oshliaer/videos/2196890940397483/

Если вам действительно нужно , чтобы выбрать строк, которые вы можете использоватьgetRangeList().activate().

В противном случае, если вам нужно получить данные по условию, вы можете использовать getDataRange().getValues().reduce() для работы со значениями.

...