是否可以知道 Google 电子表格中过滤器的行结果?
is it possible to know the rows result of a filter in a Google Spreadsheet?
我想知道 Google App Script 中 filter 的 rows result 但我没有获得它们,我总是获得选择的所有行或 sheet。我已经调查过了,这个 API 似乎是不可能的。您知道这是不是真的,或者是否存在另一种获取这些行的方法?感谢
function docReport() {
try {
splashScreen("Generando informe...");
var activeSheet = SpreadsheetApp.getActiveSheet();
var numberOfColumns = activeSheet.getLastColumn();
var numberOfRows = activeSheet.getLastRow();
var activeRow = activeSheet.getRange(1, 1, numberOfRows, numberOfColumns).getValues();
var docReport = DocumentApp.create(REPORT_FILE_NAME);
var bodyReport = docReport.getBody();
bodyReport.setAttributes(stylePage);
for (var row = 1; row < numberOfRows; row++) {
if (!isEmpty(activeRow[row], numberOfColumns)) {
var image = UrlFetchApp.fetch(IMG_BBVA);
/*var paragraph = bodyReport.appendParagraph("");
paragraph.addPositionedImage(image).setHeight(100).setWidth(98);
paragraph.appendText("\r\n");
paragraph.setAttributes(styleTitle);*/
//bodyReport.appendImage(image).setHeight(100).setWidth(98); //Incluimos la imagen de cabecera
bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT);
bodyReport.appendParagraph(" SERVICIOS JURÍDICOS").setAttributes(styleTextBlue);
bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate);
for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador
if (activeRow[row][col] != "") { //Si el valor es vacio no lo imprimimos
if (activeRow[0][col] == "NORMA")
bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido
else {
bodyReport.appendParagraph(activeRow[0][col] + ":").setAttributes(styleTitle); //Incluimos título
bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleText); //Incluimos contenido
}
bodyReport.appendParagraph("");
}
}
bodyReport.appendPageBreak();
}
}
bodyReport.appendPageBreak();
docReport.saveAndClose();
MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado",
'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl());
SpreadsheetApp.flush();
SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n');
} catch(e) {
Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber)
Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss"));
MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog());
}
}
不,电子表格过滤器不可能是无法在应用程序脚本中检索的特定"view"。不过,如果您知道过滤器视图的参数,则可以手动重建过滤器视图。使用 getDataRange().getValues() 将检索所有数据,然后在此 table.
上应用 filter function
我终于实现了我的目标,但这不是通常的解决方案,但它确实有效。在处理 sheet I select 所有行并设置背景颜色之前,Google Spreadsheet 仅将背景颜色设置为已过滤的行。然后,我处理所有 sheet 但我知道过滤的行,因为我询问了它的背景。我希望这个解决方案喜欢并且对您有用。谢谢
function docReport() {
try {
splashScreen("Generando informe...");
var activeSheet = SpreadsheetApp.getActiveSheet();
var numberOfColumns = activeSheet.getLastColumn();
var numberOfRows = activeSheet.getLastRow();
var activeRow, rowRange;
var titleRow = activeSheet.getRange(1, 1, 1, numberOfColumns).getValues();
//Set los fondos a otro color para identificar las líneas a las líneas que tienen filtro
activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#fffff9");
var docReport = DocumentApp.create(REPORT_FILE_NAME);
var bodyReport = docReport.getBody();
bodyReport.setAttributes(stylePage);
for (var row = 2; row <= numberOfRows; row++) { //Empieza en 2 ya que no incluyo la fila de los títulos
rowRange = activeSheet.getRange(row, 1, 1, numberOfColumns);
if (rowRange.getBackground() == "#fffff9") { //If it has #fffff9 background, it means that it is a filtered row
activeSheet.setActiveSelection(row + ":" + row).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco
activeRow = rowRange.getValues();
if (!isEmpty(activeRow[0], numberOfColumns)) {
var image = UrlFetchApp.fetch(IMG_BBVA);
bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT);
bodyReport.appendParagraph(" S.J.").setAttributes(styleTextBlue);
bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate);
for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador
if (activeRow[0][col] != "") { //Si el valor es vacio no lo imprimimos
if (col == COLUMN_NORMA)
bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido
else {
bodyReport.appendParagraph(titleRow[0][col]).setAttributes(styleTitle); //Incluimos título
bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleText); //Incluimos contenido
}
bodyReport.appendParagraph("");
}
}
bodyReport.appendPageBreak();
}
}
}
activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco menos primera fila
bodyReport.appendPageBreak();
docReport.saveAndClose();
MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado",
'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl());
SpreadsheetApp.flush();
SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n');
} catch(e) {
Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber)
Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss"));
MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog());
}
}
Google Issue Tracker and endorsed by Google:
中发布了一个解决方案
You can use the new Google Sheets advanced service to get the filtered
rows, clear all filters,... See this blog post for more info:
https://gsuite-developers.googleblog.com/2017/04/using-google-sheets-filters-in-add-ons.html
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].properties.sheetId == sheetId) {
var data = sheets[i].data;
var rows = data[0].rowMetadata;
for (var j = 0; j < rows.length; j++) {
if (rows[j].hiddenByFilter) hiddenRows.push(j);
}
}
}
return hiddenRows;
}
我想知道 Google App Script 中 filter 的 rows result 但我没有获得它们,我总是获得选择的所有行或 sheet。我已经调查过了,这个 API 似乎是不可能的。您知道这是不是真的,或者是否存在另一种获取这些行的方法?感谢
function docReport() {
try {
splashScreen("Generando informe...");
var activeSheet = SpreadsheetApp.getActiveSheet();
var numberOfColumns = activeSheet.getLastColumn();
var numberOfRows = activeSheet.getLastRow();
var activeRow = activeSheet.getRange(1, 1, numberOfRows, numberOfColumns).getValues();
var docReport = DocumentApp.create(REPORT_FILE_NAME);
var bodyReport = docReport.getBody();
bodyReport.setAttributes(stylePage);
for (var row = 1; row < numberOfRows; row++) {
if (!isEmpty(activeRow[row], numberOfColumns)) {
var image = UrlFetchApp.fetch(IMG_BBVA);
/*var paragraph = bodyReport.appendParagraph("");
paragraph.addPositionedImage(image).setHeight(100).setWidth(98);
paragraph.appendText("\r\n");
paragraph.setAttributes(styleTitle);*/
//bodyReport.appendImage(image).setHeight(100).setWidth(98); //Incluimos la imagen de cabecera
bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT);
bodyReport.appendParagraph(" SERVICIOS JURÍDICOS").setAttributes(styleTextBlue);
bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate);
for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador
if (activeRow[row][col] != "") { //Si el valor es vacio no lo imprimimos
if (activeRow[0][col] == "NORMA")
bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido
else {
bodyReport.appendParagraph(activeRow[0][col] + ":").setAttributes(styleTitle); //Incluimos título
bodyReport.appendParagraph(String(activeRow[row][col]).trim()).setAttributes(styleText); //Incluimos contenido
}
bodyReport.appendParagraph("");
}
}
bodyReport.appendPageBreak();
}
}
bodyReport.appendPageBreak();
docReport.saveAndClose();
MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado",
'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl());
SpreadsheetApp.flush();
SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n');
} catch(e) {
Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber)
Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss"));
MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog());
}
}
不,电子表格过滤器不可能是无法在应用程序脚本中检索的特定"view"。不过,如果您知道过滤器视图的参数,则可以手动重建过滤器视图。使用 getDataRange().getValues() 将检索所有数据,然后在此 table.
上应用 filter function我终于实现了我的目标,但这不是通常的解决方案,但它确实有效。在处理 sheet I select 所有行并设置背景颜色之前,Google Spreadsheet 仅将背景颜色设置为已过滤的行。然后,我处理所有 sheet 但我知道过滤的行,因为我询问了它的背景。我希望这个解决方案喜欢并且对您有用。谢谢
function docReport() {
try {
splashScreen("Generando informe...");
var activeSheet = SpreadsheetApp.getActiveSheet();
var numberOfColumns = activeSheet.getLastColumn();
var numberOfRows = activeSheet.getLastRow();
var activeRow, rowRange;
var titleRow = activeSheet.getRange(1, 1, 1, numberOfColumns).getValues();
//Set los fondos a otro color para identificar las líneas a las líneas que tienen filtro
activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#fffff9");
var docReport = DocumentApp.create(REPORT_FILE_NAME);
var bodyReport = docReport.getBody();
bodyReport.setAttributes(stylePage);
for (var row = 2; row <= numberOfRows; row++) { //Empieza en 2 ya que no incluyo la fila de los títulos
rowRange = activeSheet.getRange(row, 1, 1, numberOfColumns);
if (rowRange.getBackground() == "#fffff9") { //If it has #fffff9 background, it means that it is a filtered row
activeSheet.setActiveSelection(row + ":" + row).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco
activeRow = rowRange.getValues();
if (!isEmpty(activeRow[0], numberOfColumns)) {
var image = UrlFetchApp.fetch(IMG_BBVA);
bodyReport.appendParagraph("").addPositionedImage(image).setHeight(100).setWidth(98).setLayout(DocumentApp.PositionedLayout.WRAP_TEXT);
bodyReport.appendParagraph(" S.J.").setAttributes(styleTextBlue);
bodyReport.appendParagraph(DATE_REPORT + "\r\n\r\n").setAttributes(styleDate);
for (var col = 1; col < numberOfColumns; col++) { //Ignoramos la columna 1 que es el contador
if (activeRow[0][col] != "") { //Si el valor es vacio no lo imprimimos
if (col == COLUMN_NORMA)
bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleTextNorma); //Incluimos contenido
else {
bodyReport.appendParagraph(titleRow[0][col]).setAttributes(styleTitle); //Incluimos título
bodyReport.appendParagraph(String(activeRow[0][col]).trim()).setAttributes(styleText); //Incluimos contenido
}
bodyReport.appendParagraph("");
}
}
bodyReport.appendPageBreak();
}
}
}
activeSheet.setActiveSelection("2:" + activeSheet.getLastRow()).setBackground("#ffffff"); //Volvemos a dejar los fondos en blanco menos primera fila
bodyReport.appendPageBreak();
docReport.saveAndClose();
MailApp.sendEmail(Session.getActiveUser().getEmail(), "Informe " + REPORT_FILE_NAME + " generado",
'Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive: \n\r' + docReport.getUrl());
SpreadsheetApp.flush();
SpreadsheetApp.getUi().alert('Se ha creado un nuevo informe "' + REPORT_FILE_NAME + '" en su unidad Google Drive \r\n');
} catch(e) {
Logger.log("ERROR in function createPdf \r\nMessage: " + e.message + "\r\nFile gs: " + e.fileName + "\r\nLine: " + e.lineNumber)
Logger.log("\r\nUser: " + Session.getActiveUser().getEmail() + ", Date: " + Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd'_'HH:mm:ss"));
MailApp.sendEmail(EMAIL_DEV, SUBJECT_MAIL, Logger.getLog());
}
}
Google Issue Tracker and endorsed by Google:
中发布了一个解决方案You can use the new Google Sheets advanced service to get the filtered rows, clear all filters,... See this blog post for more info: https://gsuite-developers.googleblog.com/2017/04/using-google-sheets-filters-in-add-ons.html
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].properties.sheetId == sheetId) {
var data = sheets[i].data;
var rows = data[0].rowMetadata;
for (var j = 0; j < rows.length; j++) {
if (rows[j].hiddenByFilter) hiddenRows.push(j);
}
}
}
return hiddenRows;
}