Вызов API Google WebApp не возвращает JSON - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь выполнить функцию doGet электронной таблицы Google, чтобы получить некоторые данные из листа. Данные должны быть возвращены в объекте 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;  
} 

Теперь я создал HTML-сайт, который вызывает эту функцию doGet. Я регистрирую некоторые части, чтобы увидеть, что на самом деле выполняется.

<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) заблокировала ответ перекрестного происхождения https://script.google.com/macros/s/myURL/exec?callback=jQuery331014863254459179753_1548439425031&_=1548439425032 с типом MIME text / html. Подробнее см. https://www.chromestatus.com/feature/5629709824032768.

Не странно ли, что в нем говорится, что я получил текстовый / html ответ? В функции doGet возвращаемый объект объявляется как объект JSON. Тем не менее, goGet возвращает объект TextOutput или строку. Вот почему это нужно разобрать ... Я не знаю, почему я не могу прочитать возвращенный объект JSON и почему я получаю эту ошибку CORB. Кто-нибудь может мне помочь?

Еще одна вещь: вызов только по URL / exec «заблокирован политикой CORS»; так что мне как-то нужно добавить URL / exec? callback =? чтобы решить это.

1 Ответ

0 голосов
/ 26 января 2019
  • Вы хотите получить значения из веб-приложений в виде ответа JSONP.

Если мое понимание верно, как насчет этой модификации? Я думаю, что может быть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Очки модификации:

Для стороны скрипта Google Apps

  • Используйте ContentService.MimeType.JAVASCRIPT до setMimeType.
  • Изменить createTextOutput на e.parameter.callback + '(' + JSONString + ')'.

Для стороны HTML

  • result из var 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");

Примечание:

  • При изменении сценария веб-приложений повторно разверните веб-приложения как новую версию. Таким образом, последний скрипт отображается в веб-приложениях.
  • Когда вы запустите Javascript HTML, вы увидите значения Prepare API Call, End, This is an answer и Done API Call по порядку из-за асинхронной обработки.

Ссылки:

Если это не тот результат, который вы хотели, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...