【问题标题】:UrlFetchApp.fetch(url) failsUrlFetchApp.fetch(url) 失败
【发布时间】:2019-10-29 22:06:13
【问题描述】:

执行 UrlFetchApp.fetch(url) 时,我有一些 GAS 代码失败 - 我想。

在 UrlFetchApp.fetch(url) 中使用时,url 的字符长度是否有限制。我的功能失败了,我怀疑它与 url 的长度有关。超过 100 个字符。

下面的代码是指...

function uploadToDrive(url, folderid, filename, fileDesc) {
  var msg = '';

  try {
    var response = UrlFetchApp.fetch(url);

  } catch(err) {

  };

  if (response.getResponseCode() === 200) {

       var folder = DriveApp.getRootFolder();
      if (folderid) {
        folder = DriveApp.getFolderById(folderid);
      }
      var blob = response.getBlob();
      var file = folder.createFile(blob);
      file.setName(filename);

      file.setDescription(fileDesc); 

      var headers = response.getHeaders();
      var content_length = NaN;
      for (var key in headers) {
        if (key.toLowerCase() == 'Content-Length'.toLowerCase()) {
          content_length = parseInt(headers[key], 10);
          break;
        }
      }

      var blob_length = blob.getBytes().length;
      msg += 'Saved "' + filename + '" (' + blob_length + ' bytes)';
      if (!isNaN(content_length)) {
        if (blob_length < content_length) {
          msg += ' WARNING: truncated from ' + content_length + ' bytes.';
        } else if (blob_length > content_length) {
          msg += ' WARNING: size is greater than expected ' + content_length + ' bytes from Content-Length header.';
        }
      }
      msg += '\nto folder "' + folder.getName() + '".\n';
    }
   else {
    msg += 'Response code: ' + response.getResponseCode() + '\n';
  }

  return file.getUrl();
}

【问题讨论】:

  • 这些信息对您的情况有用吗? stackoverflow.com/q/2659952/7108653 顺便问一下,为了正确理解您所说的fails,能否提供错误信息和脚本的错误行?
  • 第 5 行 - var response = UrlFetchApp.fetch(url) - 返回错误代码 404。
  • 我用 300+ 个字符长的 url 尝试了这个方法,它奏效了。问题可能与此特定 url 有关。你能分享一下这个网址吗?
  • 这个url返回404。这个问题与GAS限制无关。

标签: google-apps-script


【解决方案1】:

该链接会生成响应代码 404,但只有在 try 块中的 fetch 方法成功时才设置响应变量。在假设它具有可访问的属性和方法之前尝试验证响应变量:

function fetching() {
  var url = "<some url resource>";

  try {
    var response = UrlFetchApp.fetch(url);
  } catch (err) {
// why catch the error if you aren't going to do anything with it?
    Logger.log(err);
  } finally {
    if (response && response.getResponseCode() === 200) {
      Logger.log("Should be 200, got " + response.getResponseCode());
    } else {
      Logger.log("Fetching Failed: Exception thrown, no response.");
    }
  }
}

但是,我会更进一步,并保证 UrlFetchApp.fetch 会做出响应。这是通过将“muteHttpExceptions”参数设置为 true 来完成的。

function fetching() {
  //dns exception
  //var = "googqdoiqijwdle.com"
  //200
  var url = "google.com";
  //404
  //var url = "https://www.jotform.com/uploads/Administrator_System_sysadmin/92960977977584/4480552280228238115/BoE%20Test%20File.docx"

  try {
    var response = UrlFetchApp.fetch(url, {
      muteHttpExceptions: true
    });
  } catch (err) {
    Logger.log(err);
  }

  if (response) {
    response.getResponseCode() === 200 ?
      Logger.log("Should be 200, got " + response.getResponseCode()) :
      Logger.log("Anything but 200, got " + response.getResponseCode());
  }
}

希望这有帮助!

文档:Google Developers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2017-08-25
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    相关资源
    最近更新 更多