google.script.run.withSuccessHandler跳过onSuccess函数

时间:2018-05-29 23:36:33

标签: google-apps-script google-sheets

我尝试使用脚本绑定的电子表格中的数据填充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:

  

设置在服务器端函数返回时运行的回调函数   成功。服务器的返回值作为传递给函数   第一个参数,用户对象(如果有)作为第二个传递   参数。

也许我错过了什么,如果有人有任何线索,请分享:)

1 个答案:

答案 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代码中删除所有日志行后,它就可以了!