Google表格公式可转换Youtube的API ISO 8601持续时间格式

时间:2018-07-27 16:21:15

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

我有一个Google表格脚本,可获取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"];
}

3 个答案:

答案 0 :(得分:2)

非常丑陋,但似乎可以用于所提供的示例:

=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中套用上述公式,并将结果格式化为时间。

答案 1 :(得分:1)

脚本解决方案:

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

答案 2 :(得分:0)

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

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