【问题标题】:Google Sheet formula to convert Youtube's API ISO 8601 duration format用于转换 Youtube 的 API ISO 8601 持续时间格式的 Google 表格公式
【发布时间】:2019-01-04 19:29:55
【问题描述】:

我有一个 google sheet 脚本,可以获取 youtube 的视频时长。问题是时间数据采用 ISO 8601 格式。

例如:

PT3M23S 

我现在使用的公式很好地将其转换为更易读的格式。

=iferror(REGEXREPLACE(getYoutubeTime(B20),"(PT)(\d+)M(\d+)S","$2:$3"))

它将上述内容转换为更易读的格式 3:23

现在手头的问题是,如果视频的持续时间正好是 3 分钟,或者视频短于 1 分钟,regexreplace 不会重新格式化它。

而是改为

PT4M OR PT53S 

有没有办法编辑公式以解决可能出现的每个变体?

它将 PT4M 格式化为 4:00 或将 PT53S 格式化为 0:53

最后,如果持续时间中的秒数介于 1 到 9 之间,API 将返回一个单位数的秒数值。这意味着上面的公式看起来是错误的。例如,PT1M1S 应该是 1:01 时被格式化为 1:1

如果公式可以考虑前 9 秒并添加 0 以使其更具可读性,那就太好了。

感谢您阅读本文,如果有人能帮助我,我将不胜感激。

以防万一在脚本本身中更容易做到这一点,这里是检索视频持续时间的自定义脚本。

function getYoutubeTime(videoId){
  var url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=" + videoId;
  url = url + "&key=";
  var videoListResponse = UrlFetchApp.fetch(url);
  var json = JSON.parse(videoListResponse.getContentText());
  return json["items"][0]["contentDetails"]["duration"];
}

【问题讨论】:

标签: regex google-apps-script google-sheets iso8601 re2


【解决方案1】:

非常难看,但似乎适用于提供的示例:

=iferror(left(mid(A1,3,len(A1)-2),find("M",mid(A1,3,len(A1)-2))-1)*60,0)+substitute(REGEXreplace(mid(A1,3,len(A1)-2),"(.+M)",""),"S","")

输出秒数,例如来自PT3M23S203。要更改为00:03:23,请在( ... )/86400 中使用上述公式并将结果格式化为时间。

【讨论】:

  • 太好了,我能够使用它并将秒数转换为我需要的格式!我使用这个公式来完成获取你的公式将数字转换为的值并将格式更改为持续时间,这正是我所需要的。 =iferror(ArrayFormula(if(len(E4:E),time(,int(E4:E/60),mod(E4:E,60)),)))
【解决方案2】:

脚本解决方案:

function iso8601HMparse(str) {
  return str.replace(/PT(\d+(?=M))?M?(\d+(?=S))?S?/g,function(mm,p1,p2){//regex to get M and S value
    return [0,p1,p2].map(function(e){
      e = e ? e:0;
      return ("00"+e).substr(-2); //fix them to 2 chars
    }).join(':');
  })
}

将其拼接到您的脚本中,例如:

return iso8601HMparse(json["items"][0]["contentDetails"]["duration"].toString());

电子表格功能:

=TEXT(1*REGEXREPLACE(REGEXREPLACE(A1,"PT(\d+M)?(\d+?S)?","00:00$1:00$2"),"[MS]",),"MM:SS")

【讨论】:

  • 它不适用于超过 1 小时的视频。例如:YouTube 上的视频有 1:13:02 并且函数返回 00:00:001H13M2S
  • @pancake 试试这个answer。如果这不起作用,我也会在几个小时内修复正则表达式。
【解决方案3】:

聚会迟到了,但这是我正在使用的:

=TIMEVALUE(
IFERROR(TEXT(MID(A1,3,FIND("H",A1)-3),"00"),"00")&":"&
IFERROR(TEXT(MID(A1,IFERROR(FIND("H",A1)+1,3),FIND("M",A1)-IFERROR(FIND("H",A1)+1,3)),"00"),"00")&":"&
IFERROR(TEXT(MID(A1,IFERROR(FIND("M",A1)+1,3),FIND("S",A1)-IFERROR(FIND("M",A1)+1,3)),"00"),"00"))

您还可以将 ARRAYFORMULA 粘贴在此前面并将 A1 更改为 a 列以获取它们的整个列表的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2021-01-11
    相关资源
    最近更新 更多