Я создал приложение веб-скрипта 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
.Когда я получил сообщение об ошибке, я предположил, что это проблема моего веб-сайта, а не веб-приложения.
Спасибо, Танайке!Я бы потратил целую вечность, пытаясь исправить сайт