代码之家  ›  专栏  ›  技术社区  ›  Wicket

服务器端对象在传递到客户端代码时丢失

  •  0
  • Wicket  · 技术社区  · 8 年前

    这与 Object property values lost on server side when object passed via google.script.run

    我正在尝试设置我的Google Apps脚本加载项测试框架。由于Test-as-add-on不能用于测试可安装的触发器,我想知道是否可以从一个有界项目中提取服务器端代码,作为一个库来测试调用服务器端函数的侧栏。

    如果我使用run>运行以下代码;测试为附加组件。。。它显示了我的菜单两次

    1. 作为名为“侧边栏”的自定义菜单,位于“帮助”菜单旁边
    2. 作为附加菜单,在附加菜单上>我的项目
    • getMail() 返回 undefined
    • getMail()

    当我替换 getMail()

    我错过了什么?

    用作库的电子表格

    代码.gs

    function onOpen(e) {
      var ui = SpreadsheetApp.getUi();
      var menu = ui.createMenu('Sidebar');
      menu
        .addItem('Open', 'showSidebar')
        .addToUi();
    }
    
    function showSidebar() {
      var ui = HtmlService.createHtmlOutputFromFile('Sidebar')
        .setSandboxMode(HtmlService.SandboxMode.IFRAME)
        .setTitle('A Sidebar');
      SpreadsheetApp.getUi().showSidebar(ui);
    
    }
    
    function getEmail() {
      return Session.getActiveUser().getEmail();
    }
    

    <!DOCTYPE html>
    <html>
    
    <head>
      <base target="_top">
      <script>
        function updateButton(email, button) {
          console.log(email);
          button.value = 'Clicked by ' + email;
        }
      </script>
    </head>
    
    <body>
      <input type="button" value="Not Clicked" onclick="google.script.run
              .withSuccessHandler(updateButton)
              .withUserObject(this)
              .getEmail()" />
      <input type="button" value="Not Clicked" onclick="google.script.run
              .withSuccessHandler(updateButton)
              .withUserObject(this)
              .getEmail()" />
    </body>
    
    </html>
    

    function getCellValue(){
      return SpreadsheetApp.getActiveCell().getValue();
    }
    
    function getGreeting(){
      return 'Hello world';
    }
    

    用作库客户端的电子表格

    1. 将库添加到项目中
    2. 添加下面的代码

      功能开启(e){ }

      函数showSidebar(){ aLib.showSidebar(); }

      }

    测试为附加组件。。。

    1. 单击运行>测试作为附加组件
    2. 添加“用作库客户端的电子表格”作为用于测试的文档作为附加组件
    3. 启动文档

    1 回复  |  直到 8 年前
        1
  •  0
  •   Wicket    8 年前

    根据 https://developers.google.com/apps-script/guides/html/communication#private_functions script无法访问库函数,但看起来它也无法访问库对象。

    解决方案是使用全局变量

    代码.gs

    /* For tests only, assign the server side function
     * to be called from the sidebar to a global variable 
     */
    var email = getEmail(); 
    
    /**
     * Reference: https://stackoverflow.com/q/50595103/1595451
     *
     */
    function onOpen(e) {
      var ui = SpreadsheetApp.getUi();
      var menu = ui.createMenu('Sidebar');
      menu
        .addItem('Open', 'showSidebar')
        .addToUi();
    }
    
    function showSidebar() {
      var ui = HtmlService.createHtmlOutputFromFile('Sidebar')
        .setSandboxMode(HtmlService.SandboxMode.IFRAME)
        .setTitle('A Sidebar');
      SpreadsheetApp.getUi().showSidebar(ui);
    
    }
    
    function getEmail() {
      return Session.getActiveUser().getEmail();
    }
    

    用作库客户端的电子表格

    代码.gs

    var email = aLib.email;
    
    function onOpen(e) {
      aLib.onOpen(e);
    }
    
    function showSidebar(){
      aLib.showSidebar();
    }
    
    function getEmail(){
      /* Instead of calling the library function we call the library global variable */
      return email; 
    }