Google Apps脚本跨域请求已停止工作

时间:2015-04-08 21:40:29

标签: javascript google-apps-script cors cross-domain

我有一个错误报告信标我使用Google Apps脚本创建,它发布为我自己运行,并且可以被任何人访问,甚至匿名,"哪个表示允许向GAS发出X域请求。

但是,我的浏览器现在指示代码发布到信标后响应中没有Access-Control-Allow-Origin标头。

我在这里遗漏了什么吗?这曾经是两个月前的工作。只要GAS是为公共访问发布的,那么 设置Access-Control-Allow-Origin标题。

在Google Apps脚本中:

Code.gs
function doPost(data){
  if(data){
        //Do Something
  }
  return ContentService.createTextOutput("{status:'okay'}", ContentService.MimeType.JSON);
}

客户端:

的script.js
$.post(beacon_url, data, null, "json");

8 个答案:

答案 0 :(得分:17)

在调用contentservice脚本时,我总是发送一个JSONP回调函数。由于GAS不支持CORS,因此这是确保您的应用在x域问题到达时不会中断的唯一可靠方法。

在jQuery中拨打电话只需添加"& callback =?"。它会解决所有其他问题。

 var url = "https://script.google.com/macros/s/{YourProjectId}/exec?offset="+offset+"&baseDate="+baseDate+"&callback=?";
 $.getJSON( url,function( returnValue ){...});

在服务器端

function doGet(e){
 var callback = e.parameter.callback;
 //do stuff ...
 return ContentService.createTextOutput(callback+'('+ JSON.stringify(returnValue)+')').setMimeType(ContentService.MimeType.JAVASCRIPT);
}

答案 1 :(得分:7)

我因同样的问题而失去了几个小时。解决方案很简单。

当您将脚本部署为webapp时,您将获得两个网址:/dev/exec网址。您应该使用/exec一个来发出跨域POST请求。 /dev始终是私有的:它需要被授权,并且不设置* Allow-Origin标头。

PS:/exec似乎已被冻结 - 在您使用新版本字符串(部署对话框中的下拉列表)手动部署代码之前,它并未反映代码的任何更改。要使用/dev网址调试最新版本的脚本,只需安装其他浏览器并禁用它的网络安全功能( - 在GoogleChrome中禁用网络安全 )。

答案 2 :(得分:5)

只为那些只对我这样的POST请求感兴趣的人更简单:

function doPost(e){

 //do stuff ...

 var MyResponse = "It Works!";

 return ContentService.createTextOutput(MyResponse).setMimeType(ContentService.MimeType.JAVASCRIPT);

}

答案 3 :(得分:1)

在您的调用应用程序中,只需将 content-type 设置为 text/plain,您就可以将 GAS 返回的 JSON 解析为有效的 json 对象。

这是我的 google 脚本 doPost 函数中的 JSON 对象

var result = {
  status: 200, 
  error: 'None',
  rowID: rowID
};

ws.appendRow(rowContents);

  return ContentService.createTextOutput(JSON.stringify(result))
  .setMimeType(ContentService.MimeType.JSON);  

在这里我从节点 js 调用我的应用程序脚本 API

           const requestOptions = {
                method: 'POST',
                headers: {'Content-Type': 'text/plain'},
                body: JSON.stringify({param1: value, param2:value})
            };
const response = await fetch(server_URL, requestOptions);
            const data = await response.json();
            console.log(data);
            console.log(data.status);

答案 4 :(得分:0)

我偶然发现了同一问题:

    在本地主机上运行网页时,
  • 从浏览器中调用/exec-URL效果很好
  • 从https域调用
  • 引发跨域错误

我试图避免将POST JSON-clientcode重构为JSONP(我持怀疑态度,因为事情以前总是可以解决的)。

可能的修复#1

幸运的是, 之后,我做了一个非CORS请求(使用fetch()在https域中从浏览器中访问了mode: no-cors),通常的CORS请求都可以正常工作再次。

最后的想法

最后一个解释可能是:每个新的appscript-deployment都需要花费一些时间/使用率,然后才能在服务器级别真正确定其配置。

答案 5 :(得分:0)

我的情况不同,我以一种非常奇怪的方式面对CORS错误。

直到我添加一个常量,我的代码才能正常工作且没有CORS错误:

const MY_CONST = "...";

似乎Google Apps脚本(GAS)不允许使用'const'关键字,因为GAS是基于ES3或ES5之前的版本或类似的东西。关于“ const”的错误将重定向到没有CORS的错误页面网址。

参考:
https://stackoverflow.com/a/54413892/5581893

答案 6 :(得分:0)

当我尝试将应用程序脚本应用程序与另一个Vue应用程序集成时,遇到了类似的CORS政策错误问题。

请注意以下配置:

    每个部署的
  1. 项目版本应为 NEW
  2. 如果要授予所有人访问权限,请以身份执行该应用。
  3. 谁有权向任何匿名用户访问该应用。

希望这对您有用。

答案 7 :(得分:0)

如果这对所有像我这样的人有帮助:

我有一个 .js 文件,其中包含我所有的实用程序函数,包括调用 GAS 的函数。我在测试更新时总是忘记清除缓存,所以我经常会遇到这种错误,因为缓存的代码使用的是 /dev 链接而不是 /exec 链接。