根据条件检索 Google Sheet 中的选定行

Retrieving Selective rows in Google Sheet based on conditions

在 Googlesheet 中,我想 select 基于日期的某些行。 我知道 getRange() 函数,但不知道如何向该函数添加条件。 例如,如果我有 10 行 在传播 sheet 其中:

  1. 两行的日期列为 01/01/2019。
  2. 三行的日期列的日期为 01/07/2019。
  3. 其余 五行 的日期列的日期为 01/20/2019。

我正在尝试找到一种方法来编写 google sheet 脚本 以提取日期列在 12/31/2018 和 01 之间的所有行/09/2019,在这个特殊情况下我应该得到五行。

我已经编写了下面的代码来创建一个新的 sheet 但不知道如何 select 具有条件的范围:

  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>**
  }

样本输入GoogleSheet数据

我打算使用上面的示例 Google Sheet(下面的屏幕截图)自动创建摘要 Google Sheet ]:

有我的实现

/* 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 and video https://www.facebook.com/oshliaer/videos/2196890940397483/

如果你真的需要 到 select 行你可以使用 getRangeList().activate().

否则,如果您需要按条件获取数据,您可以使用 getDataRange().getValues().reduce() 处理值。