Google App Script возвращает массив из нескольких строк - PullRequest
0 голосов
/ 02 декабря 2018

Сводка

Я новичок в Google Apps Script, но я потратил довольно много времени на исследования и оказался пустым.В основном я пытаюсь повторить функциональность перекрестного соединения SQL.У меня есть 2 таблицы, календарь с 12 месяцами и таблица с 3 клиентами.Таблица клиентов заполняется из формы Google, и в дальнейшем будут добавляться новые клиенты.

Для моих отчетов мне нужны данные о клиентах, чтобы они были ежемесячными.Поэтому я хочу объединить данные клиента с календарем, чтобы создать набор данных с 36 строками, где у каждого клиента есть 12 строк, по одной в месяц.

Основываясь на другом коде, который я нашел в stackoverflow, яподобрался близко.Моя проблема сейчас в том, что мои два набора данных в конечном итоге отображаются в последующих строках, что похоже на проблему с тем, как я обрабатываю свои массивы.Я также пытался использовать push.apply и .concat с точно такими же результатами.

Любая помощь будет оценена!Книгу можно найти здесь

Кроме того, таблица календаря не является строго необходимой - я просто пришел из фона SQL, поэтому мой первый инстинкт был создать таблицу календаря и создать перекрестное соединение,Если вы можете придумать лучший способ принять одну строку данных о клиентах из формы Google и вывести X строк с добавленными последовательными месяцами и годами, дайте мне знать!

Отказ от ответственности: IЯ знаю, что этот метод перекрестного соединения будет лучше обрабатываться в базе данных SQL, и что Google Sheets не предназначен для этого.Это временный обходной путь, пока разрабатывается лучшее долгосрочное решение.Набор данных клиента, скорее всего, будет содержать менее 100 клиентов для этого обходного пути и будет расти со скоростью примерно 1 клиент в неделю.


Календарь Таблица


Таблица клиентов


Пользовательский код

function crossJoin(tabl1, tabl2, header) {
 var output = [];
  var days = tabl1;
  var customer = tabl2;
  if(header) {output.push([header[0][1], header[0][0]])};
  for(var i = 1, iLen = customer.length; i < iLen; i++) {
//     output.push(days[i]);
    for(var j = 1, jLen = days.length; j < jLen; j++) { 
      output.push(days[j],customer[i]);

    }
  }
  return output;  
}


Токовый выход


Желаемый выход

1 Ответ

0 голосов
/ 02 декабря 2018

Для достижения того же результата можно использовать методы массива, такие как concat.

Фрагмент кода:

function sqlCrossJoin(arr1, arr2) {
  arr1 = arr1 || [['jan', 1], ['feb', 2]];
  arr2 = arr2 || [
    ['Jane Doe', 1983, 'PortLand', 'Oregon'],
    ['John Smith', 1984, 'San Francisco', 'California'],
  ];
  var output = [];
  arr1.forEach(function(month) {
    arr2.forEach(function(customer) {
      output.push(month.concat(customer));
    });
  });
  return output;
/* Expected Output:
[ [ 'jan', 1, 'Jane Doe', 1983, 'PortLand', 'Oregon' ],
  [ 'jan', 1, 'John Smith', 1984, 'San Francisco', 'California' ],
  [ 'feb', 2, 'Jane Doe', 1983, 'PortLand', 'Oregon' ],
  [ 'feb', 2, 'John Smith', 1984, 'San Francisco', 'California' ] ]*/
}

Ссылки:

...