繁体   English   中英

如何使用HtmlService运行服务器端函数

[英]How do I run Server-side functions using HtmlService

我是编程新手,我正在尝试使用Google-apps-script与jQuery连接几个按钮。 我有一个电子表格和添加了一个菜单,从HtmlService打开一个对话框。

在对话框中我有两个按钮,一个关闭对话框,另一个执行服务器功能,现在只写“hello world到单元格a1。”“关闭”按钮工作正常,但“更新”似乎没有做任何事情。我不确定如何调试客户端。

<script>
  $(document).ready(function(){

      $("#update").click(function (){
        var params = {}
        params.url = $("#url").val()
        params.owner = $("#owner").val()
        params.type = type
        google.script.run.update(params);
      });

      $("#close").click(function(){
      // This one works. why not the "update" button???
        google.script.host.close()
      })

  })

 </script>
 <title>AJAXtabs.html</title>
  </head>
<body>
<div id="content">
  <table border="1">
    <tr>
      <th><?= type ?>URL</th>
      <td><input type="text" id="url" name="url"></td>
    </tr>
    <tr>
      <th>New Owner email</th>
      <td><input type="text" id="ownerEmail" name="ownerEmail"></td>
    </tr>
    <tr>
      <td colspan="2" id="buttonRow" ><button id="update" type="button" >Update</button><button id="close" type="button">Close</button></td>
    </tr>
  </table>
</div>
<div id="message">
</div>
</body>
</html>

Code.gs摘录

function update(params){
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
      var row = sheet.getLastRow()
      var col = sheet.getLastColumn()
      sheet.getRange('a1').setValue('Hello world!!')
    }
    function onOpen() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var menuEntries = [];
   // When the user clicks on "addMenuExample" then "Menu Entry 1", the function function1 is
   // executed.
   menuEntries.push({name: "Set file", functionName: "fileUi"});
  menuEntries.push(null); // line separator
  menuEntries.push({name: "Set Folder", functionName: "folderUi"});

  ss.addMenu("Setters", menuEntries);
}

   function fileUi(){
 var htmlApp = HtmlService.createTemplateFromFile('View template')
 htmlApp.type = 'File';

   SpreadsheetApp.getActiveSpreadsheet().show(htmlApp.evaluate().setHeight(300).setTitle('Chan ge Owner'));
 }

   function folderUi(){
 var htmlApp = HtmlService.createTemplateFromFile('View template')
  htmlApp.type = 'Folder'

   SpreadsheetApp.getActiveSpreadsheet().show(htmlApp.evaluate());
}

下面是html和gs文件的修改版本,其中两个按钮都有效。 我认为唯一需要改变的是包含jQuery库。

调试

一般来说,调试客户端函数的最佳位置是在调试器/ IDE中,使用适当的技术。 您可以在本教程中找到一些可以帮助您的想法,以及这些答案:

为了支持调试,这个脚本依赖于Peter Herrmann的BetterLog库 您需要通过“资源 - 管理库...”将其添加到您的项目中。 有了它,再加上下面包含的辅助函数,您将有一种有效的方法来记录客户端和服务器端功能的操作。 (由于您已经使用了电子表格,因此您可以登录它...该实用程序将创建一个新选项卡。)

BetterLog的额外使用为您提供了一种在多个平台或环境中跟踪执行的方法,与内置的Logger相比具有更好的历史记录。 这个例子几乎没有涉及该实用程序的表面 - 但它足以满足大多数用途!

为了说明,已经留下了各种日志消息。

示例日志

2013-07-31 00:02:17:332 -0400 000128 INFO in ready
2013-07-31 00:02:17:419 -0400 000094 INFO In html script
2013-07-31 00:02:23:508 -0400 000178 INFO in update.click
2013-07-31 00:02:24:081 -0400 000163 INFO in update (server)
2013-07-31 00:02:24:104 -0400 000186 INFO {"url":"adsfasdfsad","owner":null,"type":null}
2013-07-31 00:02:24:166 -0400 000248 INFO done update (server)
2013-07-31 00:03:14:355 -0400 000248 INFO in close.click

Code.gs

Logger = BetterLog.useSpreadsheet('--Spreadsheet-ID--');

/**
 * Make BetterLogger available to client-side scripts, via
 * google.script.run.log(string).
 */
function log(string) {
  Logger.log(string);
}

function update(params){
  Logger.log('in update (server)');
  Logger.log(JSON.stringify(params));
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var row = sheet.getLastRow()
  var col = sheet.getLastColumn()
  sheet.getRange('a1').setValue('Hello world!!')
  Logger.log('done update (server)');
}


function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  // When the user clicks on "addMenuExample" then "Menu Entry 1", the function function1 is
  // executed.
  menuEntries.push({
    name: "Set file",
    functionName: "fileUi"
  });
  menuEntries.push(null); // line separator
  menuEntries.push({
    name: "Set Folder",
    functionName: "folderUi"
  });

  ss.addMenu("Setters", menuEntries);
}

function fileUi() {
  var htmlApp = HtmlService.createTemplateFromFile('View template')
  htmlApp.type = 'File';
  var html = htmlApp.evaluate()
                    .setSandboxMode(HtmlService.SandboxMode.NATIVE)
                    .setHeight(300)
                    .setTitle('Change Owner');
  SpreadsheetApp.getActiveSpreadsheet().show(html);
}

function folderUi() {
  var htmlApp = HtmlService.createTemplateFromFile('View template')
  htmlApp.type = 'Folder'
  var html = htmlApp.evaluate()
                    .setSandboxMode(HtmlService.SandboxMode.NATIVE)
                    .setHeight(300)
                    .setTitle('Change Owner');
  SpreadsheetApp.getActiveSpreadsheet().show(html);
}

查看template.html

这已根据最佳实践进行了重组,当然还包括日志消息。

<div id="content">
  <table border="1">
    <tr>
      <th><?= type ?>URL</th>
      <td><input type="text" id="url" name="url"></td>
    </tr>
    <tr>
      <th>New Owner email</th>
      <td><input type="text" id="ownerEmail" name="ownerEmail"></td>
    </tr>
    <tr>
      <td colspan="2" id="buttonRow" >
      <button id="update" type="button" >Update</button>
      <button id="close" type="button">Close</button>
      </td>
    </tr>
  </table>
</div>
<div id="message">
</div>

<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
  google.script.run.log("In html script");
  $(document).ready(function(){
    google.script.run.log("in ready");

    $("#update").click(function (){
      google.script.run.log("in update.click");
      var params = {}
      params.url = $("#url").val()
      params.owner = $("#owner").val()
      params.type = type
      google.script.run.update(params);
    });

    $("#close").click(function(){
      google.script.run.log("in close.click");
      google.script.host.close()
    })
  })
</script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM