【问题标题】:Retrieving redirected URLs in Google Sheets using script使用脚本在 Google 表格中检索重定向的 URL
【发布时间】:2021-08-04 14:52:54
【问题描述】:

在此处检索 Google 表格上的重定向 URL 时遇到一些问题。

单元格 A1:6962110916490185986

单元格 B1:=getRedirect(CONCATENATE("https://t.tiktok.com/i18n/share/video/",A1)

预期结果:https://www.tiktok.com/@hoaa.hanassii/video/6962110916490185986?

实际结果:https://t.tiktok.com/i18n/share/video/6962110916490185986

脚本:

function getRedirect(url) {
  var response = UrlFetchApp.fetch(url,{'followRedirects': false, 'muteHttpExceptions': false});
  var redirectUrl = response.getHeaders()['Location'];
  var responseCode = response.getResponseCode();
  if (redirectUrl) {
    var nextRedirectUrl = getRedirect(redirectUrl);
    Logger.log(url + " is redirecting to " + redirectUrl + ". (" + responseCode + ")");
    return nextRedirectUrl;
  }
  else {
    Logger.log(url + " is canonical. (" + responseCode + ")");
    return url;
  }
} 

【问题讨论】:

  • 问题似乎与post 类似。编辑器和自定义函数有不同的结果。 (我通过编辑器运行您的脚本并且 url 正在重定向,而自定义函数没有)。您可能需要考虑使用自定义菜单而不是自定义函数来获取重定向的 url。
  • 您可能还想在 issuetracker.google.com 中提交票证
  • 嘿@RonM ,尝试将其更改为通过自定义菜单运行。还是不行。不知道我现在应该怎么做。不过感谢您的建议,也很乐意尝试其他方法。
  • 您能分享一下您是如何通过自定义菜单做到这一点的吗?我正在考虑提出一种方法,但我需要你对它应该如何做的见解,例如这个基本 url 修复吗?或者您打算选择更改此https://t.tiktok.com/i18n/share/video/ 并且您的列 a 将始终包含视频 ID 或其他内容?请分享您是如何使用自定义菜单的,以便我可以帮助调试
  • @RonM 实际上只是在脚本中首先添加了 onOpen() 部分的函数,如此处所示 (developers.google.com/apps-script/guides/menus),然后是完全相同的脚本。仍然没有按照我的想法运行。不确定这是否是“使用自定义菜单而不是自定义功能”的意思。很高兴通过 Zoom 演练并解决这个问题。

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


【解决方案1】:

如前面的 cmets 所述,使用自定义菜单在脚本编辑器中运行时可以实现相同的结果,成功重定向正在获取的 url。

示例代码:

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  // Or DocumentApp or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('ParseRedirectUrl', 'ParseRedirectUrl')
      .addToUi();
}


function ParseRedirectUrl(){

  var sheet = SpreadsheetApp.getActiveSheet();
  var urlList = sheet.getRange("B1:B").getDisplayValues().flat().filter(String);
  Logger.log(urlList);
  urlList.forEach( (url, index) =>{

    var redirectUrl = getRedirect(url);
    var result = redirectUrl.split('/');
  
    //Write the value in column C. Note that the urlList starts at row 1.
    Logger.log(result);
    sheet.getRange(1+index,3).setValue(result[3]);
  });
}

样本输入表:

B1 中的公式:="https://t.tiktok.com/i18n/share/video/"&A1

代码的作用是什么?

  1. 获取 B 列中的所有 url。使用 Array.flat() 将二维数组转换为一维数组。然后使用Array.filter() 删除空单元格。
  2. 循环每个 url 并获取其重定向 url。
  3. 使用Array.split()和分隔符'/'分割重定向的url,得到重定向url中的用户名
  4. 将步骤 3 中获取的用户名写入同一行但在 C 列中。

注意:

  • 您可以在步骤 3 中使用您的MID() 获取用户名。

输出:

【讨论】:

  • 如果您遇到一些问题,请告诉我,以便我进行相应更新
  • 脚本效果很好!非常感谢你做的这些。现在我将尝试弄清楚是否可以完全省略在 B1 中输入公式。或者至少让 B1 中的公式在 A1 中有值时自动填充,而无需用户执行任何步骤。
  • 当A列=arrayformula(if(A1:A<>"","https://t.tiktok.com/i18n/share/video/"&A1:A,""))中有值时,您可以使用此公式将B1单元格自动填充URL。不要忘记先删除 B 列中的现有值,以便 arrayformula() 可以写入 B 列
  • 感谢@RonM!我能麻烦您解决这个 =ARRAYFORMULA() 公式吗? =arrayformula(IF($B2:B="","<--- Please insert TikTok video's URL",IF(COUNTIF($B2:B,"*/video/*"),MID($B2:B,FIND("~",SUBSTITUTE($B2:B,"/","~",5))+1,19),IFERROR(MID(getRedirect($B2:B),FIND("~",SUBSTITUTE(getRedirect($B2:B),"/","~",6))+1,19),"<--- error in URL")))) 其中 B2:B 是 URL。它不断抛出#VALUE!
  • 请与您的预期输出共享样本表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2014-01-15
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多