Вы можете сделать это, изменив свои данные, а также изменив свой код HtmlTemplate
- запрос к базе данных изменять не нужно.
В настоящее время у вас есть for
цикл с одним уровнем, и не проверяйте эквивалентность между записями в вашем результате запроса.Таким образом, вы получаете 1 столбец веб-страницы для каждой строки.Чтобы объединить сотрудников из одного и того же отдела в один и тот же столбец (чтобы у вас был только 1 столбец веб-страницы на отдел, а не 1 столбец веб-страницы на результат запроса), вы должны изменить используемый вами результат.
Одно возможное изменение,использовать переменную data
из Array
в ассоциативную Object
, чтобы она выглядела как {"Operations:Accounting":{"John Smith":{clockTime: ..., duration: 3.56}, "Jane Doe":{clockTime: ..., duration: 0.53}, ... }, "Production:Shop": {...}, ... }
.
Тогда вы бы скорректировалиfor
цикл для доступа к каждому свойству (объекту "Сотрудник") каждого ключа (объекту "Отдел") вашего объекта data
.Обратите внимание, что это вложенный цикл for.
function serveWebpage(e) {
var template = HtmlService.createTemplateFromFile("myfile");
template.data = transformQueryResult_(getQueryResult_(e));
return template.evaluate();
}
function transformQueryResult_(queryArray) {
var output = {},
departmentIndex = 0,
employeeNameIndex = 1,
clockIndex = 2,
durationIndex = 3;
for (var r = 0; r < queryArray.length; ++r) {
var row = queryArray[r];
var dept = row[departmentIndex],
empName = row[employeeNameIndex],
clock = row[clockIndex],
duration = row[durationIndex];
// Create this department if necessary.
if (!output[dept]) output[dept] = {};
// Create this employee if necessary.
if (!output[dept][empName]) output[dept][empName] = {};
// Set the employee's clockTime property and duration property
// Assumption: an employee appears only once in the query for a given department.
// (i.e. only a single clockTime and duration for an employee will be displayed)
output[dept][empName].clockTime = row[clockIndex];
output[dept][empName].duration = row[durationIndex];
}
return output;
}
В вашем файле HtmlTemplate
вы затем выполните итерации по отделам, а затем по сотрудникам, используя скриптлетов в качественеобходимо:
for (var dept in data) {
/* Add code to create a webpage column for the department roster */
for (var emp in data[dept]) {
/* Add code to use the data[dept][emp].clockTime and data[dept][emp].duration values */
}
/* Add necessary closing tags for the column*/
}
Как примечание, для ваших конечных пользователей, вероятно, будет лучше, если вы будете следовать рекомендациям Apps Script и загружать результат запроса асинхронно - то есть без каких-либо скриптлетов, просто клиент-серверная связь .