【问题标题】:Cannot log values using Logger in google app script无法在谷歌应用脚​​本中使用 Logger 记录值
【发布时间】:2018-06-10 17:54:38
【问题描述】:

这是我的 HTML 代码,当单击加载按钮时,我从这里调用函数 loadClient

//LOAD CLIENT BUTTON`
document.getElementById("load_button").addEventListener('click',function(){
google.script.run.loadClient();
});

这是code.gs文件中的相应函数

//function02-loadClient
function loadClient() {
    eval(UrlFetchApp.fetch('https://apis.google.com/js/api.js').getContentText());
    return gapi.client.load("https://content.googleapis.com/discovery/v1/apis/webmasters/v3/rest")
       .then(function() { Logger.log("GAPI client loaded for API"); },
              function() { Logger.log("Error loading GAPI client for API" ); });
}

【问题讨论】:

  • 当您单击load_button 时,您能否先确认loadClient() 的任何其他部分是否有效?
  • 我认为您不需要使用eval() 那是为了什么? gapi 也是一个 PHP 类,不是吗?我不认为这是一个 Apps Script 类。
  • 您似乎正试图将客户端 JavaScript 代码放入您的 HTML。如果https://apis.google.com/js/api.js 处的代码是您希望在浏览器中运行的客户端代码,那么您可以使用脚本标签的src 属性。 src attribute<head><script src="https://apis.google.com/js/api.js"></script></head>
  • 仅供参考 gapiGoogle API Client Library for Javascript

标签: javascript logging google-apps-script google-sheets


【解决方案1】:

当您在客户端环境中调用 google.script.run 时,您正在请求执行服务器端 Apps 脚本函数。

loadClient() 的实现在服务器端 Apps 脚本执行的上下文中没有意义。

这是一个完整、简单的示例,通过单击客户端按钮在服务器端成功触发 Logger.log() 调用:

client.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <script>
    function registerListener() {
      document.getElementById('callServerFunction').addEventListener('click', function() {
        google.script.run
            .withSuccessHandler(function() {
              alert("Successfully called server function.");
            })
            .withFailureHandler(function() {
              alert("Failed to call server function.");
            })
            .serverFunction();
      });
    }
  </script>
  <body onload="registerListener()">
    <button id="callServerFunction">Call Server Side Function</button>
  </body>
</html>

代码.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('client');
}

function serverFunction() {
  Logger.log("Server function called.");
}

点击按钮后的服务器端日志记录结果

[18-06-10 13:48:20:359 PDT] Server function called.

关于Javascript Google API Client Libraries (i.e. https://apis.google.com/js/api.js),它并不打算在 Apps 脚本服务器端上下文中使用。 Apps 脚本的全部意义在于有a laundry list of services ready to use immediately without any setup。除了不兼容之外,尝试在服务器端 Apps Script 上下文中加载客户端 JS 库简直是多余的。

同样,尝试在客户端应用程序脚本代码中使用客户端 JS 库也没有太大意义,因为您可以通过 google.script.run 获得全套服务器端功能。

【讨论】:

【解决方案2】:

“尝试在服务器端 Apps 脚本上下文中加载客户端 JS 库是多余的。”

...当 G. 未能提供/实现/披露在服务器端未实现的客户端方法时,这不是多余的;例如:

Drive.files.emptyTrash()

https://developers.google.com/drive/api/v2/reference/files/delete?hl=en#javascript

  • GA Apps Script 服务器端 js 调用引用 url 中根本找不到空垃圾箱

https://developers.google.com/apps-script/reference/drive

https://developers.google.com/apps-script/reference/drive#methods

https://developers.google.com/apps-script/advanced/drive

抢手的功能与 file.setTrashed(true) 的必要性不同:empty垃圾箱,而不是“将文件放入垃圾箱”,“将文件标记为垃圾';任何“交互式”选项也不适用于例如用于直接或通过垃圾箱删除数千个文件。

  • Drive 的 GAS 无法直接永久删除文件
  • Google 承认 Google Drive 客户端 API 中存在“删除”语义:

https://developers.google.com/drive/api/v2/reference/files/delete?hl=en

  • 在服务器端无法调用,也没有对应的功能!
  • 我想不出任何英文短语能充分表达这种明显遗漏的含义,否则,和经济方面的影响

但也许有人可以提供(?未记录的)GAS Apps 脚本调用反例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多