【问题标题】:Request to Google Apps Script URL for deployed WebApp produces 404 error对已部署 WebApp 的 Google Apps 脚本 URL 的请求产生 404 错误
【发布时间】:2020-12-22 08:32:11
【问题描述】:

此问题与此处发布的其他问题(例如 Google Drive Page Not Found - Sorry, unable to open the file at this time)非常相似。这并不完全相同,但我确实相信它与该帖子中说明的根本问题相同,即在登录多个 Google 帐户时尝试向 Google App Script 提交表单会导致 /u/1 和/或 @987654325 @ 添加到脚本的 URL 从而产生 404 错误。

这是使用标准 Google 帐户,而不是 G-Suite。

我在网站上有一个通过 AJAX 提交到 Google Apps 脚本的表单。该脚本进行一些 API 调用以创建包含表单收集的数据的 Google 文档。

HTML/Javascript:

<form>
  <input type="text" name="full_name">
  <input type="text" name="phone">
  <input type="submit">
</form>

$('form').submit(function() {
  var obj = $(this).serializeObject();
  var gurl = "https://script.google.com/macros/s/AKfycbzmhaub3ojPARA-B-Y2uVC2BJZPaRvbgMwMTH9pd7R9aHuAD5M/exec";

  $.ajax({
    url: gurl,
    type: "GET",
    data: obj,
    dataType: "jsonp",
    success: function(data, status, xhr) {
      console.log("success");
      console.log(data);
    });
});

谷歌脚本

function doGet(e) {
  var params = e.parameters
  var result = {};
  try {
    result = {
      status: start(params),
      msg: 'Success',
      vals: formData,
      rawVals: params,
      errs: errors
    }
  } catch (f) {
    result.error = f.toString();
 }
 return ContentService     
  .createTextOutput(e.parameters.callback + '(' + JSON.stringify(result) + ')')
  .setMimeType(ContentService.MimeType.JAVASCRIPT);
}

在同一浏览器中登录多个 Google 帐户时提交表单会导致控制台出现以下错误,并且表单什么也不做:

jquery.js?ver=1.12.4-wp:4 GET https://script.google.com/macros/u/1/s/AKfycbzmhaub3ojPARA-B-Y2uVC2BJZPaRvbgMwMTH9pd7R9aHuAD5M/exec?callback=jQuery112407830193282901534_1608623376571&s&full_name=Dave+Pe&phone=1111111111_=1608623376572 净::ERR_ABORTED 404

当我去网络选项卡查看请求时,那里的标题选项卡显示以下内容:

Request URL: https://script.google.com/macros/u/1/s/AKfycbzmhaub3ojPARA-B-Y2uVC2BJZPaRvbgMwMTH9pd7R9aHuAD5M/exec?callback=jQuery112407830193282901534_1608623376571&s&full_name=Dave+Pe&phone=1111111111_=1608623376572

请注意已插入 URL 中的 /u/1/,但在我传递给我的 $.ajax() 调用的 URL 中不存在。

我为这个问题找到的大多数答案都说只是删除/u/1/,但由于我没有将它添加到第一个位置,我不知道我会从哪里删除它。

谁能确认这个看似已知的问题(在登录多个 Google 帐户时更改 URL)是导致我的问题的原因?关于如何提出请求的任何想法:

https://script.google.com/macros/s/AKfycbzmhaub3ojPARA-B-Y2uVC2BJZPaRvbgMwMTH9pd7R9aHuAD5M/exec

而不是

https://script.google.com/macros/u/1/s/AKfycbzmhaub3ojPARA-B-Y2uVC2BJZPaRvbgMwMTH9pd7R9aHuAD5M/exec

??还是我在这里尝试使用 Google 脚本的方式有更严重的问题?

【问题讨论】:

  • 我无法理解I do believe the issue is with trying to access a GoogleScript while logged into more than 1 account and having /u/1 and /u/0 prepended to the script's URL.。我为此道歉。我可以问一下您当前问题的详细信息和您的目标吗?
  • @Tanaike - 抱歉,这是指我引用的另一篇 SO 帖子 (stackoverflow.com/questions/47045209/…) 中发现的问题。在那篇文章中,问题的原因是用户同时登录了多个 Google 帐户。我的意思是我相信这个问题也导致了这里的问题。我的目标是将在我的网站上收集的表单数据提交给 Google App Script。我的问题是请求 URL 以某种方式被修改为包含 u/1 导致 404 错误

标签: javascript jquery ajax google-apps-script


【解决方案1】:

我的解决方案是将请求从客户端移动到服务器。我通过 AJAX 将表单值提交到服务器端页面,然后在该页面上,我使用 cURL 向我的 Google Apps 脚本发出 HTTP 请求(在正文中发送表单数据)并将响应发送回客户端。

似乎工作...没有我能想到的问题,但这并不意味着它们不存在。如果该方法有任何要射击的孔,请随时卸载。

淡化...

JavaScript

$.ajax({
    url: '/ajax-handler.php',
    type: "POST",
    data: obj
    success: function(data, status, xhr) {
      console.log("success");
      console.log(data);
    });
});

PHP

$vals = my_sanitize_func($_POST);

$url = GAS_URL;
$fields = $vals;

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($fields));

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

// handle/format response;
$result = ...

print $result;

【讨论】:

    【解决方案2】:

    你也可以用这种方式做任何你想做的事。
    Google 应用脚本 (Code.gs):

    function doGet(e){
         var action = e.parameter.action;
         if (action=="sendSuccess"){
            justSendSuccess(e);
          }
       }
    
       function justSendSuccess(e){
       var output = JSON.stringify({"result":"success"});
            return ContentService
              .createTextOutput(e.parameter.callback+"("+ output + ");")
              .setMimeType(ContentService.MimeType.JAVASCRIPT);
    }
    

    JavaScript 部分:

    function callGoogleScript(){
            console.log("Started");
            var url = "https://script.google.com/macros/s/###SCRIPT_ID###/exec";
            $.ajax({
            crossDomain: true,
            url: url,
            data: {
            "action":"setInfo"
            },
            method: "GET",
            dataType: 'jsonp',
            jsonp: "callback",
            success: function(data){
            console.log("SUCCESS!");
            console.log(data);
      }
    });
    
        }
    

    【讨论】:

    【解决方案3】:

    我尝试运行它(使用单个帐户进行身份验证),它似乎可以工作。发生此错误似乎是因为您使用多个帐户进行了身份验证。此外,它似乎已经记录在 Google 问题跟踪器 (link to issue) 中。如果你想让它更显眼,你可以点击白色的星星 (☆),它告诉谷歌你受到了这个问题的影响。

    作为旁注,请注意您编写的代码将由每个人执行。此代码将拥有您的权限。要非常小心。您的帐户限制也可能适用。

    【讨论】:

    • 那么您是说由于 Google 的这个已知问题而无法解决我的问题吗?有什么解决方法的建议吗?
    • 此错误仅在同时使用多个帐户登录时发生。因此,一次使用一个帐户登录。您可以使用隐身或会话容器扩展(因此无需每次都登录)。
    • 不是我,是填写表格的用户...我无法控制他们登录了多少个帐户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多