根据条件检索 Google Sheet 中的选定行
Retrieving Selective rows in Google Sheet based on conditions
在 Googlesheet 中,我想 select 基于日期的某些行。
我知道 getRange() 函数,但不知道如何向该函数添加条件。
例如,如果我有 10 行 在传播 sheet 其中:
- 两行的日期列为 01/01/2019。
- 三行的日期列的日期为 01/07/2019。
- 其余 五行 的日期列的日期为 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()
处理值。
在 Googlesheet 中,我想 select 基于日期的某些行。 我知道 getRange() 函数,但不知道如何向该函数添加条件。 例如,如果我有 10 行 在传播 sheet 其中:
- 两行的日期列为 01/01/2019。
- 三行的日期列的日期为 01/07/2019。
- 其余 五行 的日期列的日期为 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()
处理值。