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 通过您的代码序列,看看您得到了什么以及您的代码遵循什么路径。