Google 用于填充 select 列表的 Apps 脚本服务器调用从不运行
Google Apps Script server call to populate select list never runs
我正在 Google sheet 中创建侧边栏。我没问题让它出现在 select 列表中。我正在尝试根据 sheet 之一的范围填充 select 列表。我已经尝试了 Whosebug 的许多建议,并且我已经多次阅读 Google 的 HTML 服务文档。我似乎仍然缺少一些东西。根据我的测试,似乎从未执行对服务器的 google.script.run 调用。这是我的 code.gs 文件:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Schedule')
.addItem('New schedule', 'newSchedule')
.addItem('Edit start date', 'newDate')
.addSeparator()
.addItem('Insert names', 'openInsert')
.addToUi();
}
function openInsert() {
var html = HtmlService.createHtmlOutputFromFile('Insert')
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setTitle('Insert Names')
.setWidth(300);
SpreadsheetApp.getUi()
.showSidebar(html);
}
function getNames() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Publishers");
var names = sheet.getRange(2, 1, sheet.getLastRow(),1).getValues();
return names;
}
这是我的 Insert.html 文件:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<script>
function returnedNames(names) {
var selectList = new Array("publisher1","publisher2","publisher3");
for (sel in selectList) {
var dropDown = document.getElementById(sel);
for (i = 0; i < names.length; i++) {
var opt = document.createElement("option");
opt.text = names[i][0];
opt.values = names[i][0];
dropDown.options.add(opt);
}
}
}
google.script.run.withSuccessHandler(returnedNames).getNames();
</script>
</head>
<body>
<div class="block form-group">
<label for="publisher1">First publisher</label>
<select id="publisher1"> </select>
<label for="publisher2">Second publisher</label>
<select id="publisher2"> </select>
<label for="publisher3">Third publisher (optional)</label>
<select id="publisher3"> </select>
</div>
</body>
</html>
我相信您的服务器功能在您的文档实际准备好处理之前被调用。我想如果你用开发者工具检查浏览器控制台 window,你会看到一个错误弹出。
由于您本质上想要这些填充的 onload,因此向 body 标记添加一个加载事件。让那个事件调用你的服务器函数。如果这不起作用,请在服务器端组合使用 Logger.log 并在客户端使用 console.log 通过您的代码序列,看看您得到了什么以及您的代码遵循什么路径。
我正在 Google sheet 中创建侧边栏。我没问题让它出现在 select 列表中。我正在尝试根据 sheet 之一的范围填充 select 列表。我已经尝试了 Whosebug 的许多建议,并且我已经多次阅读 Google 的 HTML 服务文档。我似乎仍然缺少一些东西。根据我的测试,似乎从未执行对服务器的 google.script.run 调用。这是我的 code.gs 文件:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Schedule')
.addItem('New schedule', 'newSchedule')
.addItem('Edit start date', 'newDate')
.addSeparator()
.addItem('Insert names', 'openInsert')
.addToUi();
}
function openInsert() {
var html = HtmlService.createHtmlOutputFromFile('Insert')
.setSandboxMode(HtmlService.SandboxMode.IFRAME)
.setTitle('Insert Names')
.setWidth(300);
SpreadsheetApp.getUi()
.showSidebar(html);
}
function getNames() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Publishers");
var names = sheet.getRange(2, 1, sheet.getLastRow(),1).getValues();
return names;
}
这是我的 Insert.html 文件:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
<script>
function returnedNames(names) {
var selectList = new Array("publisher1","publisher2","publisher3");
for (sel in selectList) {
var dropDown = document.getElementById(sel);
for (i = 0; i < names.length; i++) {
var opt = document.createElement("option");
opt.text = names[i][0];
opt.values = names[i][0];
dropDown.options.add(opt);
}
}
}
google.script.run.withSuccessHandler(returnedNames).getNames();
</script>
</head>
<body>
<div class="block form-group">
<label for="publisher1">First publisher</label>
<select id="publisher1"> </select>
<label for="publisher2">Second publisher</label>
<select id="publisher2"> </select>
<label for="publisher3">Third publisher (optional)</label>
<select id="publisher3"> </select>
</div>
</body>
</html>
我相信您的服务器功能在您的文档实际准备好处理之前被调用。我想如果你用开发者工具检查浏览器控制台 window,你会看到一个错误弹出。
由于您本质上想要这些填充的 onload,因此向 body 标记添加一个加载事件。让那个事件调用你的服务器函数。如果这不起作用,请在服务器端组合使用 Logger.log 并在客户端使用 console.log 通过您的代码序列,看看您得到了什么以及您的代码遵循什么路径。