我如何在Google脚本中允许CORS请求?

时间:2018-11-22 15:17:04

标签: google-apps-script cors

我想将联系表单发布到我的Google脚本中,该表单将向我发送电子邮件。我使用以下代码:

var TO_ADDRESS = "example@gmail.com"; // where to send form data

function doPost(e) {

  var callback = e.parameter.callback;

  try {
    Logger.log(e); // the Google Script version of console.log
    MailApp.sendEmail(TO_ADDRESS, "Contact Form Submitted",
                      JSON.stringify(e.parameters));
    // return json success results
    return ContentService
          .createTextOutput(callback+
          JSON.stringify({"result":"success",
                          "data": JSON.stringify(e.parameters) }))
          .setMimeType(ContentService.MimeType.JSON);
  } catch(error) { // if error return this
    Logger.log(error);
    return ContentService
          .createTextOutput(callback+JSON.stringify({"result":"error", 
          "error": e}))
          .setMimeType(ContentService.MimeType.JSON);
  }
}

当我尝试发布到Google脚本网址时,出现以下错误:

  

在以下位置访问XMLHttpRequest   原产地的“ https://script.google.com/macros/s/~~myscriptid~~/exec”   “ http://localhost:4200”已被CORS政策屏蔽:对   预检请求未通过访问控制检查:否   请求中存在“ Access-Control-Allow-Origin”标头   资源。

我不知道如何将CORS过滤器添加到我的Google脚本中。

我知道脚本正在运行,我已经使用此插件对其进行了测试:

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi

4 个答案:

答案 0 :(得分:0)

据我了解,您有要在自定义域上运行的应用程序。并且它应该访问Google云上的脚本。

坏消息:您无法跳过应用程序一侧的CORS检查(直到request is simple,我认为这不是您的情况)。

您应在Google Cloud side上指定Access-Control-Allow-Origin

  

Cloud Storage允许您仅在存储桶级别设置CORS配置。您可以使用gsutil命令行工具,XML API或JSON API为存储桶设置CORS配置。有关在存储桶上设置CORS配置的更多信息,请参阅配置跨域资源共享(CORS)。有关CORS配置元素的更多信息,请参阅设置存储桶CORS。

     

您可以使用以下任一XML API请求URL来从包含CORS标头的Cloud Storage获取响应:

     

storage.googleapis.com/ [BUCKET_NAME]

     

[BUCKET_NAME] .storage.googleapis.com

如果由于某种原因不能解决问题,则需要使您自己的服务器作为代理工作:

您的客户端应用程序<->返回Access-Control-Allow-Origin的后端<->谷歌云

答案 1 :(得分:0)

好几次尝试之后,我能够通过角度为8的Web应用程序表单发送数据。 解决方案很简单,在“ HttpClient.post”中,您可以输入第三个参数来建立HTTP连接标头,该标头可能与“ https://script.google.com”不正确,并且将以CORS安全性导致HTTP连接失败。

只需不将HTTP连接标头添加为HttpClient.post的第三个参数

const object = {
  title: 'Prices',
  phone: '999999999',
  full_name: 'Jerson Antonio',
  email: 'test@example.com',
  message: 'Hello, .......'
};
return this.http.post(this.API_REST_FORM, JSON.stringify(object));

答案 2 :(得分:0)

经过几个小时的CORS研究,jsonp和其他疯狂的尝试,这对我有用,以便使用一个简单的http端点:

$.post('https://script.google.com/a/acme.org/macros/s/AKfy***A4B***eo/exec?token=myprecioustoken&operation=findAll', null).done(function(response) {
  console.log(response);
});

其余尝试,将这个错误丢给我:

Cross-Origin Request Blocked: The Same Origin Policy disallows
    reading the remote resource at
    https://script.google.com/a/utec.edu.pe/macros/s/AKfy***A4B***eo/exec?token=myprecioustoken&operation=findAll.
    (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

$。getJSON

$.getJSON('https://script.google.com/a/acme.org/macros/s/AKfy***A4B***eo/exec?token=myprecioustoken&operation=findAll', function(result) {
  console.log(result);
});

XMLHttpRequest

    var xmlhttp = new XMLHttpRequest();
    var theUrl = "https://script.google.com/a/acme.org/macros/s/AKfy***A4B***eo/exec?token=myprecioustoken&operation=findAll";
    xmlhttp.open("POST", theUrl);
    xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
    xmlhttp.send();

答案 3 :(得分:0)

最新答案,但可以正常工作...

要将数据从应用程序传递到另一个网站,只需在应用程序端使用MIME类型JAVASCRIPT,如下所示:

doGet(e){   
 return ContentService
  .createTextOutput(e.parameter.callback + "(" + JSON.stringify(YOUR OBJECT DATA HERE)+ ")")
  .setMimeType(ContentService.MimeType.JAVASCRIPT);
}

在前端按以下方式访问它:

<script>
var url = "https://script.google.com/macros/s/AKfy*****ACeR/exec?callback=loadData";
// Make an AJAX call to Google Script
jQuery.ajax({
crossDomain: true,
url: url,
method: "GET",
dataType: "jsonp"
});

 // log the returned data
  function loadData(e) {
  console.log(e);
  }
</script>

此方法可避免CROB / CROS头痛