Google App Script Web 应用程序 GET 和 POST 请求被 CORS 策略阻止

2023-11-22

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

我不一定需要 POST 请求的响应,但使用“no-cors”实际上并不更新电子表格(我进行了测试以确保它在网站之外工作)

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

我尝试修改Google Apps脚本项目中的设置(设置为以我的身份执行,任何人都可以访问甚至匿名)和清单(这里不多,文档参考).

我查看了这些堆栈溢出帖子以尝试提供帮助,但他们的解决方案对我不起作用(任何解决方案都不完全适用于我的情况)

尝试发送 POST 请求时应用程序脚本发送 405 响应

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);
});

现在服务器应该返回一个显示“成功”的字符串,但我却收到了之前提到的错误。

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");
}

Solution

所以事实证明我的 doPost 请求失败了(doGet 正在工作)因为我正在使用e.parameters并不是e.postData。当我收到错误消息时,我认为这是我的网站的问题,而不是网络应用程序的问题。

谢谢田池!我会花一辈子的时间来修复这个网站


虽然我从你的问题中不确定你的Google Apps Script of Web Apps,但是这个修改怎么样?

修改要点:

  1. 我认为您的 Web 应用程序可能不会返回任何值。你可以把return ContentService.createTextOutput()在函数中doPost() and doGet()。这样,在 Google Apps 脚本中,就会返回状态 200。

    function doPost(e) { // or doGet(e)
    
      // do something
    
      return ContentService.createTextOutput(); // Please add this.
    }
    
  2. 您可以修改客户端脚本如下:

    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);
    });
    

Note:

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

参考:

  • 创建文本输出()
  • 使用获取
  • 通过 Google Apps 脚本利用 Web Apps

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google App Script Web 应用程序 GET 和 POST 请求被 CORS 策略阻止 的相关文章

随机推荐

  • 如何在 Jasper Report 中组织框架,使它们完美浮动?

    在 Jasper 报告中 我有 4 个框架 下图 它们设置了一些属性 如同一个图像中所示 现在 想法是给定某些参数showBlue and showRed框架BLUE and RED分别显示或隐藏 后续帧 浮动 在前一帧之后 考虑以下顺序
  • unordered_set 非常量迭代器

    出于测试目的 我创建了一些 unordered set 并尝试迭代该集合 该集合拥有自己的类 class Student private int matrNr string name public Student const int mat
  • 使用 React、Redux 和 Axios 处理异步请求?

    我是 React JS 和 Redux 的新手 这让我难以上手 我正在尝试使用 Axios 发出 POST 请求 但无法发出请求 可能是我在容器文件中丢失了一些东西 下面是代码 查看plnkr Update 提交后我收到 redux for
  • 将列表与公共元素合并

    我有一个清单 1 1 7 2 1 10 11 12 211 446 469 3 1 10 11 12 13 4 1 11 12 13 215 5 1 15 16 6 1 15 17 216 225 我想合并具有公共元素的列表切片 并索引已合
  • 红宝石浮点精度

    据我了解 Ruby 1 9 2 浮点数的精度为 15 位十进制数字 因此 我期望舍入浮动x精确到小数点后 15 位等于x 对于此计算 情况并非如此 x 0 33 10 x x round 15 gt false 顺便说一下 四舍五入到 16
  • 在 iOS7 GM 中收到 SSL 错误 - “AddTrust 外部 CA 根”不受信任?

    我的 NSURLConnection 类中突然收到来自 iOS7 GM 的 SSL 错误 我无法访问我的任何 API 或 webView 页面 这是一个严重的紧急情况 有人可以帮我吗 错误如下 NSURLConnection CFURLCo
  • 使用事件侦听器克隆引导元素

    我正在尝试克隆一个具有引导程序提供的数据切换行为的引导程序元素 HTML div class container div
  • 我需要帮助使用 MAT 查找内存泄漏

    我正在使用 MAT 来比较两个堆转储 我每天都会进行一次堆转储 它每天都会增加大约 200 兆 我认为泄漏与 java util zip 有关 因为该表显示的内容 也因为我们最近添加了一个新进程来压缩和解压缩大量文件 见图 此时我打开支配器
  • iPhone 上的 HTTP 直播流媒体服务器

    我正在尝试在 iPhone 上运行 HTTP 实时流媒体服务器 该服务器从摄像头捕获视频流并将其提供给 HTML5 客户端 支持 HTTP 实时流媒体 到目前为止 我已经完成了以下工作 iOS 上的 HTTP Live 流媒体服务器 用 N
  • Ext 4.1.1:添加新记录到Store

    我想在商店初始化后添加记录 I tried 加载数据 加载原始数据 add 但似乎没有任何作用 这是我的jsfiddle http jsfiddle net charlesbourasseau zVvLc 有任何想法吗 你需要设置query
  • novalidate 并出现错误 ora-02299

    有人可以帮我解决这个问题吗 id Name 1 aaa 2 bbb 3 aaa gt alter table arc add CONSTRAINT uk arc UNIQUE NAME novalidate error ora 02299
  • 控制 HTML5 视频中的开始位置和播放时长

    我们有一个视频 长 13 分钟 我们希望使用 HTML5 对其进行控制 我们希望能够让用户控制和选择他们想要播放的视频部分 优选地 该控制将通过2个输入字段进行 他们将在第一个框中输入开始时间 以秒为单位 并在第二个框中输入播放持续时间 以
  • Haxe 在 PHP 环境中部署的 Web“框架”?

    最近我一直在看Haxe 构建要部署到运行 PHP 的 Apache 的应用程序 好吧 虽然它看起来可能适合我的需求 部署到 PHP 但不使用糟糕的语言 但我还没有发现任何东西可以使实际应用程序开发比构建传统的非 MVC PHP 应用程序更容
  • Angular 构建:无法读取未定义的属性“split”

    刚刚从 ng8 升级到 ng11 当我运行 ngserve 时它工作正常 但是当我运行 build 进行生产时我收到以下错误 生成 ES5 包以进行差异加载 发生未处理的异常 C P src app 9 es2015 dce42a686e4
  • CUDA 10 不支持 7 之后的 Gcc 版本 - Arch Linux 中的 Qt 错误

    我正在运行 Arch Linux 并尝试在 Qt 中构建一个项目 但是 Qt 出现以下错误 opt cuda include crt host config h 129 错误 error 不支持的 GNU 版本 不支持 7 之后的 gcc
  • 以“TryParse”方式反序列化 json

    当我向某个服务 不属于我 发送请求时 它可能会响应所请求的 JSON 数据 或者响应如下所示的错误 error status error message code 999 在这两种情况下 HTTP 响应代码都是 200 OK 因此我无法使用
  • 带有 ViewPager 的 CollapsingToolbarLayout

    我正在尝试使用 CollapsingToolbarLayout 来创建一个带有 ViewPager 的可折叠工具栏 该工具栏在向上滚动时会逐渐消失 但如果 ViewPager 存在 我似乎会失去向上滚动的能力 ViewPager 应该在工具
  • Google oauth2 api 客户端无法正常工作

    我的 grails 2 3 4 控制器的操作中有一些代码 它使用 google java 客户端库来访问 OAuth2 api 但是当我创建 GoogleAuthorizationCodeFlow 的实例时 我收到了 redirect ur
  • WCF:EncryptedKey 子句未包含所需的加密令牌“System.IdentityModel.Tokens.X509SecurityToken”

    我正在尝试使用 WCF 客户端连接到基于 Java 的 Web 服务 我提供的证书 自签名 在 SOAPUI 中完美运行 这是我的设置 但是 我在使用 WCF 客户端时遇到问题 My 应用程序配置
  • Google App Script Web 应用程序 GET 和 POST 请求被 CORS 策略阻止

    我创建了一个 Google Web 脚本应用程序 它将用户的姓名和电子邮件添加到电子表格中 当直接在浏览器中访问网页时 此方法工作正常 但来自网站的 GET 和 POST 请求都会返回错误 Access to fetch at https