- В вашем случае скрипт для фильтрации уже сработал. Вам нужен скрипт для извлечения значений из отфильтрованного листа в электронной таблице.
- Вы хотите добиться этого с помощью API Sheets со скриптом Google Apps.
Если мое понимание верно, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.
В вашем случае, функция getIndexesOfFilteredRows
изменена. Используя hiddenByFilter
, скрытые строки и показанные строки извлекаются как объект.
Модифицированный скрипт:
function getIndexesOfFilteredRows(ssId, sheetId) {
var object = {hiddenRows: [], hiddenRowValues: [], shownRows: [], shownRowValues: []};
// limit what's returned from the API
var fields = "sheets(data,properties/sheetId)";
var sheets = Sheets.Spreadsheets.get(ssId, {fields: fields}).sheets;
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++) {
var r = [];
if (data[0].rowData[j] && Array.isArray(data[0].rowData[j].values)) {
r = data[0].rowData[j].values.map(function(e) {
var temp = "";
if (e.hasOwnProperty("userEnteredValue")) {
if (e.userEnteredValue.hasOwnProperty("numberValue")) {
temp = e.userEnteredValue.numberValue;
} else if (e.userEnteredValue.hasOwnProperty("stringValue")) {
temp = e.userEnteredValue.stringValue;
}
}
return temp;
});
}
if (r.length > 0) {
if (rows[j].hiddenByFilter) {
object.hiddenRows.push(j);
object.hiddenRowValues.push(r);
} else {
object.shownRows.push(j);
object.shownRowValues.push(r);
}
}
}
}
}
return object;
}
Результат:
Когда вышеуказанный скрипт запускается для на фильтрованном листе возвращается следующий объект, который имеет скрытые номера строк, скрытые значения строк, показанные номера строк и показанные значения строк.
{
"hiddenRows":[0,1],
"hiddenRowValues":[["a1","b1","c1"],["a2","b2","c2"]],
"shownRows":[2,3],
"shownRowValues":[["a3","b3","c3"],["a4","b4","c4"]]
}
Ссылка:
Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, я приношу свои извинения.
Добавлено:
Как насчет этого примера сценария? В этом примере сценария значения, отфильтрованные с помощью filterValues
, могут быть получены как объект. В этом случае результат совпадает с вашим setFilter()
и измененным getIndexesOfFilteredRows()
. Но фильтр basi c не используется. Поэтому, пожалуйста, будьте осторожны с этим.
function myFunction() {
var filterValues = ["England", "France"]; // Please set the filter values.
var column = 3; // In this case, it's the column "C". Please set the column number.
var sheetName = "Sheet1"; // Please set the sheet name.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var values = sheet.getDataRange().getValues();
var object = values.reduce(function(o, e, i) {
if (filterValues.indexOf(e[column - 1]) > -1) {
o.hiddenRows.push(i + 1);
o.hiddenRowValues.push(e);
} else {
o.shownRows.push(i + 1);
o.shownRowValues.push(e);
}
return o;
}, {hiddenRows: [], hiddenRowValues: [], shownRows: [], shownRowValues: []});
Logger.log(object)
}
- Если вы хотите получить только отфильтрованные значения, этот сценарий может подойти.
- В этом случае сценарий может работать с и без V8. Но когда V8 включен, скорость l oop будет быстрой. Ссылка