#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
У меня есть скрипт, который выполняет поиск по всей книге для определенного имени и возвращает все данные по этому имени. Скрипт работает, но собирает данные только с 1 листа в рабочей книге.
Я искал какой-нибудь код, который помог бы мне получить все имена листов. Итак, у меня есть код, который делает это, но по какой-то причине он по-прежнему возвращает только с 1 листа.
Приведенный ниже код собирает все имена листов. Затем эта функция вызывается в функции запроса.
Я подозреваю, что именно здесь возникает проблема
function sheetnames() {
var out = new Array()
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i < sheets.length ; i ) {
var name = sheets[i].getName();
var data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(name);
var values = data.getRange(4, 1, data.getLastRow(),
data.getLastColumn()).getValues();
out.push(values);
}
return out;
}
Затем эта функция выполняет поиск запрошенных данных.
function query() {
var Sheet = SpreadsheetApp.getActiveSpreadsheet();
var searchSheet = Sheet.getSheetByName("Search");
var searchByName = searchSheet.getRange(4, 8).getValue();
var uses = sheetnames();
var output = new Array();
var i = 0;
var r = 0;
do{
var from = uses[i];
do{
var row = from[r];
if(row == null){
r ;
continue;
}
if(searchByName != null ){
var newName = row[7];
if(newName == searchByName){
output.push(row);
}
}
r ;
}while(r < from.length);
i ;
}while(i < uses.length);
return output;
}
Эта часть просто печатает данные в ячейках и прикрепляется к чертежу поиска, который запускает функцию на листе.
function search() {
var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Search");
var data = query();
var count1 = 0;
do{
var subData = data[count1];
var count2 = 0;
do{
var setTo = subData[count2];
Sheet.getRange((count1 5), (count2 1)).setValue(setTo);
count2 ;
}while(count2 < subData.length);
count1 ;
}while(count1 < data.length);
}
Таблица называется «Таблица ежедневных платежей». Как вы можете себе представить, существует ОЧЕНЬ МНОГО данных. Имя каждого листа обозначается месяцем и годом, в котором произошел платеж. Очевидно, что более последовательные клиенты будут совершать покупки более чем за один месяц.
Поэтому при поиске имени клиента я получаю только 1 месяц (данные 1 листа). У нас есть данные с мая 2018 года по сегодняшний день, поэтому, опять же, скрипт собирает данные не со всех листов.
Ответ №1:
Ваш код не очень удобочитаем, поэтому я сам кое-что придумал и упростил его. Вещи, которые я предполагаю — ваш поисковый запрос находится в столбце листа H4 «Поиск», и вы хотите выполнить поиск по этому термину во всех листах в столбце H4 и записать их в листе «Поиск» после 4-й строки. Попробуй это.
// return all rows from all sheets except Search sheet
function sheetValues(ss) {
var out = [];
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i ) {
var sheet = sheets[i];
if (sheet.getName() == 'Search') continue;
var values = sheet.getRange(4, 1, sheet.getLastRow() - 3, sheet.getLastColumn()).getValues();
out.concat(values);
}
return out;
}
// search all rows for given term and return results
// look for term in H column of every row
function query(ss, term) {
if (!term) return;
var values = sheetValues(ss);
var output = [];
for (var i = 0; i < values.length; i ) {
var row = values[i];
var name = row[7]; // 7 = col H
if (name == term) {
output.push(row);
}
}
return output;
}
// get search results and print into Search sheet
function search() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Search');
var searchByName = sheet.getRange(4, 8).getValue(); // search term is in H4 cell
var data = query(ss, searchByName);
sheet.getRange(5, 1, sheet.getLastRow() - 4, sheet.getLastColumn()).clearContent();
sheet.getRange(5, 1, data.length, data[0].length).setValues(data);
}