Как перебрать список диапазонов в Google Apps Script - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть Google лист с множеством имен и часов, которые необходимо организовать. Я пытался использовать встроенные функции, но этот лист является результатом других входных данных на других листах (поэтому длина строк является переменной)

Sheet 1

   A       B       C        D       E                     T       U    
Project| Name1 | Hours1 | Name2 | Hours2 | ... | ... | Name10 | Hours10|  
————————————————————————————————————————————————————————————————————————
P1     | Larry | 10     | Bob   |  20    | ... | ... | Tim    | 10     |
P2     | Bob   | 15     | Tim   |  15    | ... | ... | Larry  | 15     | 
....   | ...   | ...    |  ...  | ...    | ... | ... | ...    | ...    | 
Pnth   | Tim   | 20     | Larry |  10    | ... | ... | Bob    | 10     |

До сих пор я пытался перебрать весь лист и использовал список имен, по которым можно сортировать, но мне нужно, чтобы он имел переменную длину строк.

function organize(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var rangeList = sheet.getRangeList(['B1:C','D1:E','F1:G','H1:I','J1:K','L1:M','N1:O','P1:Q','R1:S','T1:U']);

Как я хочу, чтобы это выглядело (на отдельном листе): список имен и общее количество часов

 Sheet 2

 Name | Total hours  | Number Projects Assigned|
 ——————————————————————————————————————————————
 Larry| TOTAL NUMBER |    4   (P1,P2,Pnth)     |
 Tim  | TOTAL NUMBER |    4   (P1,P2,Pnth)     |
 Bob  | TOTAL NUMBER |    4   (P1,P2,Pnth)     |

1 Ответ

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

Поток:

  • Получить все значения в диапазоне
  • Прокрутить их по вертикали, а затем по горизонтали
  • Создать объект с каждым именем в качестве ключа и [часы, проекты] в качестве значения.
  • Отображение объекта обратно в двумерный массив

Фрагмент:

function organize(values) {
  var out = {};//out object
  values.forEach(function(row) {
    for (var col = 1, l = row.length; col < l; col += 2) {
      var name = row[col];
      out[name] = out[name] || [0, 0]; //[hours,projects]
      out[name][0] += row[col + 1]; //hours sum
      out[name][1]++; //projects sum
    }
  });

  return Object.keys(out).map(function(name) {
    return [name, out[name][0], out[name][1]]; //[name, hours and projects]
  });
}

Если используется как пользовательская функция,

=organize(A2:U4)

возвращает имя, часы и проекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...