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.JAVASCRIPT
到 setMimeType
。
- 将
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 Call
、End
、This is an answer
和 Done API Call
因为异步处理顺序。
参考文献:
如果这不是您想要的结果,我深表歉意。
我正在尝试执行 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.JAVASCRIPT
到setMimeType
。 - 将
createTextOutput
修改为e.parameter.callback + '(' + JSONString + ')'
。
对于HTML方
result
未声明。JSON.parse()
不是必需的。
var json = JSON.parse(result)
的 修改后的脚本:
当以上几点反映到你的脚本中,就会变成下面这样。
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 Call
、End
、This is an answer
和Done API Call
因为异步处理顺序。
参考文献:
如果这不是您想要的结果,我深表歉意。