Google App Script Web App GET и POST-запросы заблокированы политикой CORS - PullRequest
1 голос
/ 08 июня 2019

Я создал приложение веб-скрипта Google, которое добавляет имя пользователя и адрес электронной почты в электронную таблицу.Это прекрасно работает при доступе к веб-странице непосредственно из браузера, но как запросы GET, так и запросы POST с веб-сайта возвращают ошибку «Доступ к выборке в« https://script.google.com/macros/s/AKfycbxkG5hM6MMswwHdzWSJKwutMYsOZRT3zjC7jFti0sDvJ47bWB4BTsHPhvbyEVGSsSc5/exec' from origin »» был заблокирован политикой CORS: НетЗаголовок «Access-Control-Allow-Origin» присутствует в запрашиваемом ресурсе. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS. "

Мне не обязательно нужен ответ на запрос POST, но использование «no-cors» фактически не обновляет электронную таблицу (я проверил, чтобы убедиться, что она работает вне веб-сайта)

Я использовал обаXMLHttpRequest и метод fetch, с запросами GET и POST и различными настройками, которые были изменены, чтобы попытаться заставить это работать, но пока не повезло.

Я пытался изменить настройки в скрипте Google AppsПроект (настроен для выполнения от имени меня, любой может получить доступ даже к анонимному пользователю) и манифест (здесь не так много, ссылка на документацию ).

IЯ просматривал эти сообщения о переполнении стека, чтобы попытаться помочь, но их решение не помогло мне (ни одно из них не совсем подходило для моей ситуации)

Сценарий приложения отправляет 405 ответ при попыткеотправить запрос POST

Перестали работать междоменные запросы скрипта Google Apps

Вот мой метод получения (самая последняя попытка)

fetch("https://script.google.com/macros/s/AKfycbxkG5hM6MMswwHdzWSJKwutMYsOZRT3zjC7jFti0sDvJ47bWB4BTsHPhvbyEVGSsSc5/exec", {
    method: 'POST',
    data: data,
    mode: 'cors',
    credentials: 'include', // include, *same-origin, omit
    redirect: 'follow',
    headers: {
        'Content-Type': 'text/plain;charset=utf-8',
    }
}).then(response => {
    console.log("success:", response);
});

Сейчас сервер должен вернуть строку с надписью «Success», но вместо этого я получаю ошибку, о которой упоминал ранее.

Edit Я забыл включить в Google методы doGet и doPostСценарий приложения:


var emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

function doPost (e){
  if(!e) return ContentService.createTextOutput("No e");
  if(!e.parameters) return ContentService.createTextOutput("No params");
  if(!e.parameters.email) return ContentService.createTextOutput("No email");
  if(!e.parameters.name) return ContentService.createTextOutput("No name");
  if(!emailRegex.test(e.parameters.email)) return ContentService.createTextOutput("Wrong email format"); // if the email is not in proper format, return

  return addToDoc(e.parameters);
}

function doGet (e){

  if(!e) return ContentService.createTextOutput("No e");
  if(!e.parameters) return ContentService.createTextOutput("No params");
  if(!e.parameters.email) return ContentService.createTextOutput("No email");
  if(!e.parameters.name) return ContentService.createTextOutput("No name");
  if(!emailRegex.test(e.parameters.email)) return ContentService.createTextOutput("Wrong email format"); // if the email is not in proper format, return

  return addToDoc(e.parameters);
}

function addToDoc (params){
  var email = params.email;
  var name = params.name;

  var sheet = SpreadsheetApp.openById("1X0sUNSFcv-phGbGy7jeo9K5WLEX5cxyh_1_X6kSPjPs").getSheets()[0];

  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();

  // If we already have the email in the system, return
  for(var x = 0; x < values.length; x++){
    for(var y = 0; y < values[x].length; y++){
      if(values[x][y].indexOf(email) > -1) return ContentService.createTextOutput("Already have email");
    }
  }

  // Gets current row index and updates
  var scriptProps = PropertiesService.getScriptProperties();
  var nextDataIndex = parseInt(scriptProps.getProperty("NEXT_DATA_INDEX"));
  scriptProps.setProperty("NEXT_DATA_INDEX", ""+(nextDataIndex+1));

  var insertRange = sheet.getRange(nextDataIndex, 1, 1, 2);
  insertRange.setValues([[name, email]]);

  return ContentService.createTextOutput("Success");
}

Решение

Таким образом, оказывается, что мой запрос doPost не удался (doGet работал), потому что я использовал e.parameters, а не e.postData.Когда я получил сообщение об ошибке, я предположил, что это проблема моего веб-сайта, а не веб-приложения.

Спасибо, Танайке!Я бы потратил целую вечность, пытаясь исправить сайт

1 Ответ

0 голосов
/ 08 июня 2019

Хотя я не уверен в вашем скрипте Google Apps для веб-приложений из вашего вопроса, как насчет этой модификации?

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

  1. Я думаю, что ваши веб-приложения могут не возвращать значений. Поэтому вы можете поместить return ContentService.createTextOutput() в функции doPost() и `` doGet (). Таким образом, в Google Apps Script возвращается статус 200.

    function doPost(e) { // or doGet(e)
    
      // do something
    
      return ContentService.createTextOutput(); // Please add this.
    }
    
  2. Как насчет изменения вашего Javascript следующим образом.

    fetch("https://script.google.com/macros/s/AKfycbxkG5hM6MMswwHdzWSJKwutMYsOZRT3zjC7jFti0sDvJ47bWB4BTsHPhvbyEVGSsSc5/exec", {
        method: 'POST',
        body: data,
        headers: {
            'Content-Type': 'text/plain;charset=utf-8',
        }
    }).then(response => {
        console.log("success:", response);
    }).catch(err => {
        console.log("Error:" + err);
    });
    

Примечание:

  • При изменении скрипта Служб Google для веб-приложений разверните Веб-приложения как новую версию. Таким образом, последний скрипт отражается на веб-приложениях. Пожалуйста, будьте осторожны.

Ссылки:

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

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