0

我正在尝试执行 Google 电子表格的 doGet 函数,以便从表格中获取一些数据。数据必须在 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 错误阻塞,这很奇怪,因为它并不总是出现:

跨域读取阻止 (CORB) 阻止了 MIME 类型 text/html的跨域响应https://script.google.com/macros/s/myURL/exec?callback=jQuery331014863254459179753_1548439425031&_=1548439425032 。有关更多详细信息,请参阅https://www.chromestatus.com/feature/5629709824032768

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

还有一件事:仅使用 URL/exec 调用“被 CORS 策略阻止”;所以我需要以某种方式添加 URL/exec?callback=? 解决这个问题。

4

1 回答 1

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

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

修改点:

对于 Google Apps 脚本方面

  • 用于。ContentService.MimeType.JAVASCRIPT_setMimeType
  • 修改createTextOutpute.parameter.callback + '(' + JSONString + ')'.

对于 HTML 端

  • resultofvar json = JSON.parse(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 应用程序中。
  • 当您运行 HTML 的 Javascript 时,由于异步处理,您将看到 、 和 的Prepare API Call值。EndThis is an answerDone API Call

参考:

如果这不是你想要的结果,我很抱歉。

于 2019-01-26T01:43:27.820 回答