Google App Script Web App GET和POST请求被CORS政策禁止

时间:2019-06-07 23:06:37

标签: javascript post google-apps-script

我创建了一个Google Web脚本应用程序,将用户名和电子邮件添加到电子表格中。当直接从浏览器中访问网页时,此方法运行良好,但是来自网站的GET和POST请求均返回错误“ CORS策略已阻止访问“从原始位置获取'https://script.google.com/macros/s/AKfycbxkG5hM6MMswwHdzWSJKwutMYsOZRT3zjC7jFti0sDvJ47bWB4BTsHPhvbyEVGSsSc5/exec'处的访问”:否所请求的资源上存在“ Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。”

我不一定需要POST请求的响应,但是使用'no-cors'并不能真正更新电子表格(我进行了测试,以确保它可以在网站外部使用)

我已经使用了XMLHttpRequest和fetch方法,同时使用了GET和POST请求,并更改了各种设置以尝试使其正常工作,但到目前为止还算不上成功。

我尝试修改Google Apps脚本项目中的设置(设置为以我的身份执行,任何人甚至都可以访问匿名设置)和清单(此处documentation reference很少)。

我查看了这些堆栈溢出帖子以寻求帮助,但是它们的解决方案对我不起作用(任何解决方案均不适用于我的情况)

App Script sends 405 response when trying to send a POST request

Google Apps Script cross-domain requests stopped working

这是我的提取方法(最近一次尝试)

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”,但是我得到了前面提到的错误。

修改 我忘了在Google App脚本中包含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。当我收到错误消息时,我认为这是我的网站而不是Web应用程序出现的问题。

谢谢您!我将永远花时间去修复网站

2 个答案:

答案 0 :(得分:1)

我必须将访问权限从只有我更改为任何人。

答案 1 :(得分:0)

尽管从您的问题来看我不确定您的Web Apps的Google Apps脚本,但此修改如何?

修改点:

  1. 我认为您的Web应用程序可能不返回任何值。所以可以将return ContentService.createTextOutput()放在doPost()和``doGet()函数中。这样,在Google Apps脚本中,状态为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);
    });
    

注意:

  • 当您修改Web Apps的Google Apps脚本时,请将Web Apps部署为新版本。这样,最新脚本将反映到Web Apps。请注意这一点。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。