【问题标题】:Retrieving Selective rows in Google Sheet based on conditions根据条件检索 Google Sheet 中的选择性行
【发布时间】:2019-05-12 10:26:27
【问题描述】:

在 Googlesheet 中,我想根据日期选择某些行。 我知道 getRange() 函数,但不知道如何向该函数添加条件。 例如,如果我在电子表格中有 10 行,其中:

  1. 两行有一个日期列,日期为 01/01/2019。
  2. 三行的日期列的日期为 01/07/2019。
  3. 剩余的五行的日期列的日期为 2019 年 1 月 20 日。

我试图找到一种方法来编写 google sheet 脚本来提取日期列在 2018 年 12 月 31 日到 2019 年 1 月 9 日之间的所有行,我应该在这个特定的地方得到五行案例。

我已经编写了以下代码来创建一个新工作表,但不知道如何选择有条件的范围:

  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 表格数据

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

【问题讨论】:

  • 您的消息严重违反了社区规则。想要并不意味着得到stackoverflow.com/help/on-topic 展示你的努力 - 社区将展示它的能力。
  • @oshliaer 我到目前为止编写的代码对我提出的问题没有任何用处,因此没有提供任何代码。抱歉违反了规则。我的错。我正在添加我拥有的代码写到现在。
  • 在 Google 表格中,“选择”一词具有特殊含义。使用 Google 表格 UI,用户通过单击行标题选择一行,然后该行被高亮显示。这就是你的意思,你是不是要突出显示满足条件的行以仅从数据范围中获取行的值?
  • @Rubén 。抱歉再次使用错误的词。我不是指您在评论中提到的意思。我的目的是从详细信息谷歌表中自动准备新的摘要谷歌表。例如,如果我们拿我附上的简单样本数据,它有不同考试日期的学生名单。从这些数据中,我试图创建一个在不同日期考试的学生人数的摘要。我将用我的预期输出更新问题数据。

标签: javascript google-apps-script google-sheets conditional


【解决方案1】:

有我的实现

/* 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() 处理值。

【讨论】:

  • 感谢@oshliaer 的帮助和指点。我会尝试这些并让您知道。再次感谢您的努力。感谢它。
  • 谢谢。在你的帮助下我可以得到想要的输出
  • @Sree 太棒了。我可以看到你不需要选择。只需 reduce 您需要的。
猜你喜欢
  • 2016-09-16
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2013-01-24
  • 2020-12-30
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多