Я пытаюсь создать таблицу с несколькими страницами, используя данные электронной таблицы следующим образом:
В code.gs я получаю данные из электронной таблицы следующим образом:
function getData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
var data = sheet.getRange(2, 1, sheet.getLastRow()-1, 3).getValues();
return data;
}
Затем в файле HTML указанные выше данные генерируются в таблице следующим образом:
<table id="myTable">
<thead>
<tr class="header">
<th>First Name</th>
<th>Second Name</th>
<th>Third Name</th>
</tr>
</thead>
<tbody id="table-body">
</tbody>
</table>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded',function(){ generateTableBody(data); });
google.script.run.withSuccessHandler(generateTableBody).getData();
function generateTableBody(dataArray) {
var table = document.getElementById("myTable");
var tbody = document.getElementById("table-body");
dataArray.forEach(function(r){
var row = document.createElement("tr");
var col1 = document.createElement("td");
col1.textContent = r[0];
var col2 = document.createElement("td");
col2.textContent = r[1];
var col3 = document.createElement("td");
col3.textContent = r[2];
row.appendChild(col1);
row.appendChild(col2);
row.appendChild(col3);
tbody.appendChild(row);
});
}
</script>
Затем я добавил приведенный ниже сценарий в файл HTML, чтобы создать страницы. данных, при которых макс. 10 строк на каждой странице:
<script>
$('#myTable').each(function() {
var currentPage = 0;
var numPerPage = 10;
var $table = $(this);
$table.bind('repaginate', function() {
$table.find('tbody tr').hide().slice(currentPage * numPerPage, (currentPage + 1) * (numPerPage-1)).show();
});
$table.trigger('repaginate');
var numRows = $table.find('tbody tr').length;
var numPages = Math.ceil(numRows / numPerPage);
var $pager = $('<div class="pager"></div>');
for (var page = 0; page < numPages; page++) {
$('<span class="page-number"></span>').text(page + 1).bind('click', {
newPage: page
}, function(event) {
currentPage = event.data['newPage'];
$table.trigger('repaginate');
$(this).addClass('active').siblings().removeClass('active');
}).appendTo($pager).addClass('clickable');
}
$pager.insertBefore($table).find('span.page-number:first').addClass('active');
});
</script>
На данный момент у меня есть 2 проблемы:
эта часть $table.bind('repaginate', function() { $table.find('tbody tr').hide().slice(currentPage * numPerPage, (currentPage + 1) * (numPerPage-1)).show();});
должна возвращать все строки под телом таблицы, скрыть все, затем срез, чтобы показать только первые 10 строк на первой странице, но это не работает (и я предполагаю, что, поскольку функция generateTableBody(dataArray)
завершена после завершения функции запроса, и поэтому $table.find('tbody tr')
сначала ничего не вернул, а затем generateTableBody(dataArray)
вернул в интерфейс все строки, а не только первые 10 строк
Исходя из этого, я добавил эту часть $("tbody#table-body").find("tr:gt(0)").hide().slice(0, 9).show();
в конец функции generateTableBody(dataArray)
, и проблема была решена, но
Вторая проблема заключалась в том, что var numRows = $table.find('tbody tr').length;
также ничего не вернуло, скорее всего, по той же причине, поэтому я попытался заполнить количество строк следующим образом:
В code.ge я добавил:
function fetchLastRow(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Sheet1");
var lr = sheet.getLastRow()-1;
return lr;
}
И в файле HTML я добавил скрытый ввод для чтения возвращаемого lr следующим образом:
<input type="hidden" id="numRows">
<script>
window.addEventListener('load', populate());
function populate(){ google.script.run.withSuccessHandler(displayValue).fetchLastRow(); }
function displayValue(lr){ document.getElementById("numRows").value=lr; }
</script>
Я смог успешно прочитать количество строк в скрытом вводе , так что следующий шаг было это:
var numRows = document.getElementById('numRows').value;
или
var numRows = document.getElementById('numRows').getValue();
или
var numRows = document.getElementById('numRows').innerHTML;
, но (во всех случаях) var numRows = 0 (я думаю, что из-за window.addEventListener('load', populate());
также завершается после запроса)
Итак, я думаю, что если бы я смог наконец запустить функцию запроса (после создания данных таблицы и чтения максимальных активных строк в электронной таблице), это решит объяснены две проблемы.