【问题标题】:Q: How can I Convert a list of URL domains into a full url问:如何将 URL 域列表转换为完整 url
【发布时间】:2020-10-15 10:08:38
【问题描述】:

我有一个包含数千个 URL 域的列表,但已将其中的一些复制到此处的示例中 (spreadsheet here),并且正在寻找一种将它们转换为完整 URL 的方法,因为我需要完整的 URL 来完成我正在做的事情更进一步。

例如 all-about-test.eu 将变为 http://all-about-test.eu/

由于 www.、https、http 等之间的 URL 可能不同,我不能简单地将其连接到前面。

我查找了可以执行此操作的 google sheet 函数,但找不到。

【问题讨论】:

  • 您如何知道您的 URL 使用哪种协议/是否使用 www?可以通过某种协议访问 URL 这一事实是否足以作为标准?如果支持不同的协议怎么办?
  • 这将是没有重定向的协议,例如,如果您将 3f.dk 放入 chrome,它会更改为 3f.dk。我需要正确的 URL 的 http 部分。我没有太多经验,但理论上如果一个 URL 既可以是 http 也可以是 https 而没有重定向(我认为它不能),那么两者都可以。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

您可以使用UrlFetchApp.fetch 来尝试使用不同协议访问不同的URL,指定参数followRedirects: false。然后,您将检查 HTTP 响应代码(请参阅 getResponseCode()),如果它是可接受的响应代码,则返回 URL:

function returnFullURL(domain) {
  const options = ["https://","http://", "www.", "https://www.", "http://www.", ""]; // Possible protocols, change if necessary
  const badCodes = [404,301,302,303,307,308]; // Acceptable response codes, change if necessary
  for (let i = 0; i < options.length; i++) {
    const url = options[i] + domain;
    try {
      const params = { 
        muteHttpExceptions: true,
        followRedirects: false
      }
      const response = UrlFetchApp.fetch(options[i] + domain, params);
      const code = response.getResponseCode();
      if (!badCodes.includes(code)) return url;
    } catch (err) {
      console.log(err);
    }
  }
  return "No combination allowed";
}

然后您可以将其用作Custom function

注意:

  • 我不确定这些是否是要检查的适当 HTTP 响应状态代码,以及这些是否是协议、www 子域等的所有可能性,但这应该可以让您开始。

编辑:

作为替代方案,您可以通过一次调用您的函数来构建所有 URL,而不是为每个域调用它。为此,请复制并调用以下函数并指定所有域的范围(在您的示例表中,这将是 =returnAllURLs(A2:A18)):

function returnAllURLs(domains) {
  const options = ["https://","http://", "www.", "https://www.", "http://www.", ""]; // Possible protocols, change if necessary
  const badCodes = [404,301,302,303,307,308]; // Acceptable response codes, change if necessary
  return domains.map(domain => {
    for (let i = 0; i < options.length; i++) {
      const url = options[i] + domain[0];
      try {
        const params = { 
          muteHttpExceptions: true,
          followRedirects: false
        }
        const response = UrlFetchApp.fetch(options[i] + domain[0], params);
        const code = response.getResponseCode();
        if (!badCodes.includes(code)) return [url];
      } catch (err) {
        console.log(err);
      }
    }
    return ["No combination allowed"];
  });
}

相关:

【讨论】:

  • 嗨,这一直很好。然而,大约有一千个 URL,带有“returnfullurl()”的单元格一直停留在“加载中......我已经离开它几个小时但似乎没有任何改变。任何想法为什么会发生这种情况?我尝试将公式扁平化已完成获取 URL 但没有改变任何内容的单元格。
  • @WasHere 我无法重现此内容。这对某些域不起作用,还是当您多次调用此函数时它才开始不起作用?无论如何,我提供了一个替代代码,您可以使用它来构建所有 URL,只需一次调用您的函数,而不是在每个域的不同单元格中调用它。让我知道这是否对您有帮助。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多