我尝试使用脚本绑定的电子表格中的数据填充HTML文件中的select元素。
到目前为止,我有以下代码用于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功能,它返回工作表&#39; Customers List&#39;中的选定项目。该功能在单独运行时工作正常,并返回一个带有名称的数组(如:[&#39; Bruno&#39;,&#39; Neymar&#39;]):
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');
}
问题是arr_customer返回值后onSuccess函数没有运行。我用了一些日志来发现这个。我甚至评论了所有不必要的代码,并尝试通过Spreadhseets UI运行它,只需一行&#34; Logger.log(&#39; test&#39;)&#34;在onSuccess函数中,没有任何内容显示在日志中。
有谁知道为什么会这样?我看过Google文档,它说的是withSuccessHandler:
设置在服务器端函数返回时运行的回调函数 成功。服务器的返回值作为传递给函数 第一个参数,用户对象(如果有)作为第二个传递 参数。
也许我错过了什么,如果有人有任何线索,请分享:)
答案 0 :(得分:0)
解决
以下是newDeal.html的最终代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<style>
body {
padding-left: 10px;
}
</style>
</head>
<body onload='updateCustomers()'>
<p>Nome do Contato:</p>
<select id="slContato" name="Contato" autocorrect="on" autocomplete="on">
</select>
</body>
<script>
function placeCustomers(values) {
var select = document.getElementById("slContato");
for(var i = 0; i < values.length; i++) {
var opt = values[i];
var el = document.createElement("OPTION");
el.textContent = opt;
el.value = opt;
select.appendChild(el);
}
}
function updateCustomers() {
google.script.run.withSuccessHandler(placeCustomers).arr_clientes();
}
</script>
</html>
似乎某种程度上这是Logger.log()
的问题。从HTML代码中删除所有日志行后,它就可以了!