Google WebApp API 调用 returns 否 JSON

Google WebApp API call returns no JSON

我正在尝试执行 Google Spreadsheet 的 doGet 函数,以便从 sheet 获取一些数据。数据必须在 JSON 对象中返回。现在,我在 JSON 对象中返回简单的虚拟内容,因为我还不能接收 JSON 对象并从中读取数据。

我有一个简单的 doGet 函数,由 HTML 站点调用。

doGet 函数包含一个 count() 函数,它计算对此 doGet 函数的每次调用。这样我就知道 doGet 被执行了(这部分工作正常)。

function doGet(e){
  //add +1 to value of a specific spreadsheet cell;
  //count() always works, even though I don't get the JSON object.
  count(); 
  
  var content = {
      "answer": "This is an answer",
      "body" : "Welcome to the web app."
  };
 
  //convert JavaScript object into a string 
  //so that it can be sent
  var JSONString = JSON.stringify(content);  
  
  var JSONOutput = ContentService.createTextOutput(JSONString);
  JSONOutput.setMimeType(ContentService.MimeType.JSON);
  return JSONOutput;  
} 

现在,我创建了一个调用此 doGet 函数的 HTML 站点。我正在记录一些部分以查看实际执行的内容。

<html>
    
<head>        
<title>Call GAPI</title>        
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>    

<body>
<script src="./jquery/jquery-3.3.1.min.js" type="text/javascript"></script>
        
<script>
           
console.log("Prepare API Call"); 
            
$(function(){         
 $.getJSON('https://script.google.com/macros/s/*encrpyted-URL*/exec?callback=?', function(json) {                   
    var json = JSON.parse(result); //parsing is necessary because response is actually a TextOutput which needs to be turned into a javascript object          
    console.log(json.answer); //not executed             
 console.log("Done API Call"); //not executed         
  });            
});
            
console.log("End");   

</script>
   
</body>
</html>

大多数时候我会在控制台中看到这个:

Prepare API Call
End

因此,除了 API 调用之外的所有内容都会被执行。 有时,我也会遇到 CORB 错误阻塞,这很奇怪,因为它并不总是出现:

Cross-Origin Read Blocking (CORB) blocked cross-origin response https://script.google.com/macros/s/myURL/exec?callback=jQuery331014863254459179753_1548439425031&_=1548439425032 with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

它说我收到了 text/html 回复,这不是很奇怪吗?在 doGet 函数中,返回的对象被声明为 JSON 对象。然而,goGet returns 一个 TextOutput 对象或字符串。这就是为什么它需要被解析...... 我不知道为什么我无法读取返回的 JSON 对象以及为什么我会收到此 CORB 错误。有人可以帮助我吗?

还有一件事:用URL/exec调用只是"blocked by CORS policy";所以我不知何故需要添加 URL/exec?callback=?解决这个问题。

  • 您想从 Web 应用程序中检索值作为 JSONP 响应。

如果我的理解是正确的,这个修改怎么样?我认为您的情况可能有几个答案。所以请把这当作其中之一。

修改点:

对于 Google Apps 脚本端

  • 使用 ContentService.MimeType.JAVASCRIPTsetMimeType
  • createTextOutput修改为e.parameter.callback + '(' + JSONString + ')'

对于HTML方

    var json = JSON.parse(result)
  • result 未声明。 JSON.parse() 不是必需的。

修改后的脚本:

当以上几点反映到你的脚本中,就会变成下面这样。

Google Apps 脚本端

从:
var JSONOutput = ContentService.createTextOutput(JSONString);
JSONOutput.setMimeType(ContentService.MimeType.JSON);
到:
var JSONOutput = ContentService.createTextOutput(e.parameter.callback + '(' + JSONString + ')');
JSONOutput.setMimeType(ContentService.MimeType.JAVASCRIPT);

HTML边

从:
$.getJSON('https://script.google.com/macros/s/*encrpyted-URL*/exec?callback=?', function(json) {
var json = JSON.parse(result);
console.log(json.answer);
console.log("Done API Call");
到:
$.getJSON('https://script.google.com/macros/s/*encrpyted-URL*/exec?callback=?', function(json) {
console.log(json.answer);
console.log("Done API Call");

注:

  • 当您修改Web Apps的脚本时,请重新部署Web Apps为新版本。由此,最新的脚本反映到Web Apps。
  • 当您 运行 Javascript of HTML 时,您将看到 Prepare API CallEndThis is an answerDone API Call 因为异步处理顺序。

参考文献:

如果这不是您想要的结果,我深表歉意。