Я пытаюсь заполнить элемент select в моем HTML-файле данными из электронной таблицы, к которой привязан скрипт.
Пока у меня есть код ниже для newDeal.html.Пустой элемент select (id = "contactname") - это тот, который мне нужно заполнить данными, возвращаемыми функцией arr_customers ():
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
</head>
<body onload="onload()">
<p>Contact name:</p>
<select id="contactname" autocorrect="on" autocomplete="on">
</select>
</body>
<script>
var vals;
function placeCustomers(values) {
var select = document.getElementById("contactname");
for(var i = 0; i < values.length; i++) {
Logger.log(i);
var opt = values[i];
var el = document.createElement('option');
el.textContent = opt;
el.value = opt;
select.appendChild(el);
}
}
function onload() {
placeCustomers(vals);
}
function onSuccess(values) {
vals = values;
}
google.script.run.withSuccessHandler(onSuccess).arr_customers();
</script>
</html>
На стороне сервера у меня есть функция arr_customers, котораявозвращает выбранные элементы из листа «Список клиентов».Функция отлично работает при запуске в одиночку и возвращает массив с именами (например: ['Bruno', 'Neymar']):
function arr_customers() {
var tbl = SpreadsheetApp.openById('my-spreadsheet-id').getSheetByName('Customers List').getDataRange().getValues();
var return_array = [];
for (var i = 1; i < tbl.length; i++) {
if (tbl[i][6] == 'C') { // condition needed for customer to go to list
return_array.push(tbl[i][1]);
}
}
return return_array;
}
И наконец, код для пользовательского меню, чтобы открытьмодальное диалоговое окно:
function uiBuilder() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Project')
.addItem('Create new project...', 'newProject')
.addToUi();
}
function newProject() {
var html = HtmlService.createHtmlOutputFromFile('newDeal');
SpreadsheetApp.getUi().showModalDialog(html, 'New Project');
}
Проблема в том, что функция onSuccess не работает после того, как arr_customer вернул значение.Я использовал несколько журналов, чтобы обнаружить это.Я даже прокомментировал весь ненужный код и попытался запустить его через пользовательский интерфейс Spreadhseets с одной строкой «Logger.log ('test')" в функции onSuccess, и в журнале ничего не появилось.
Кто-нибудь знает, почему это происходит?Я видел документацию Google, там написано withSuccessHandler:
Устанавливает функцию обратного вызова для запуска, если функция на стороне сервера возвращается успешно.Возвращаемое значение сервера передается в функцию в качестве первого аргумента, а пользовательский объект (если есть) передается в качестве второго аргумента.
Может быть, я что-то упускаю, если кто-то знает,Пожалуйста, поделитесь:)