Google Sheet 公式转换 Youtube 的 API ISO 8601 时长格式

Google Sheet formula to convert Youtube's API ISO 8601 duration format

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

例如:

PT3M23S 

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

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

它将上面的转换成更易读的格式3:23

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

改为

PT4M OR PT53S 

有没有办法编辑公式来解决可能发生的每个变体?

在哪里将 PT4M 格式化为 4:00 或将 PT53S 格式化为 0:53

最后,如果持续时间中的秒数在 1-9 之间,则 API returns 秒数的单个数字值。这意味着上面的公式看起来是错误的。例如,PT1M1S 被格式化为 1:1 而它应该显示为 1:01

如果公式可以考虑前 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"];
}

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

=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","")

输出秒数,例如 203 来自 PT3M23S。要更改为 00:03:23,请将上述公式换成 ( ... )/86400 并将结果格式设置为时间。

脚本解决方案:

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:00"),"[MS]",),"MM:SS")

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

=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 更改为一列以获取它们的整个列表的值。