Как собрать данные со ВСЕХ листов, используя Google Appscript - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть скрипт, который просматривает всю книгу на предмет определенного имени и возвращает все данные с этим именем.Сценарий работает, но собирает данные только с 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 Ответ

0 голосов
/ 18 апреля 2019

Ваш код не очень читабелен, поэтому я решил кое-что самостоятельно и упростил его. Вещи, которые я предполагаю - ваш поисковый термин находится в столбце «Поиск» листа 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...